Nginx基础

1、nginx的虚拟主机

1 基于域名的虚拟主机
2 基于端口的虚拟主机
3 基于ip的虚拟主机

2、nginx怎么实现后端服务的健康检查

1 ngx_http_proxy_module 代理模块 和 ngx_http_upstream_module 负载均衡模块对后端节点做健康检查
2 利用nginx_upstream_check_module模块对后端节点做健康检查,淘宝技术团队开发的 nginx 模块

参考:Nginx实战系列之功能篇—-后端节点健康检查
location / {
    proxy_pass       http://localhost:8000;
    proxy_set_header Host      $host;
    proxy_set_header X-Real-IP $remote_addr;
}


upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
}
 

 3、nginx的常用命令

1 启动:nginx
2 停止:nginx -s stop
3 重新加载配置:nginx -s reload(平滑重启)  或 systemctl reload nginx
4 重载指定配置文件:nginx -c /usr/local/nginx/conf/nginx.conf
5 查看版本:nginx -v
6 检查配置文件是否正确:nginx -t

4、什么是正向代理和反向代理?

1 正向代理:
     用户端配置,配置完再去访问具体的服务
     代理服务器代理了客户端,去喝目标服务器进行交互
用途:
     隐藏了客户真实ip地址
     提高了访问速度

2 反向代理:
  反向代理在服务端,不需要用户感知服务器。客户端访问代理服务器,,代理服务器将请求转发到服务器B
作用:
  缓存,将服务器的响应缓存到自己的内存中,减少服务器的压力
  负载均衡,将用户请求分配到多个服务器上
  访问控制
节约了有限的 IP 地址资源

5、nginx的session不同步怎么办?

采用ip_hash指定解决

  客户已经访问了某个服务器,此用户再次访问,将通过哈希算法,自动定位到该服务器

其余办法:

  spring_session+redis,将session放到缓存中实现session共享

6、nginx的常用模块

core/access/gzip/fastcgi/proxy/upstream/rewrite//limit/log/auth/ssl/stub_status

1
ngx_http_core_module    # 包括一些核心的http参数配置,对应Nginx的配置为HTTP区块部分 2 ngx_http_access_module   # 访问控制模块,用来控制网站用户对Nginx的访问 3 ngx_http_gzip_module    # 压缩模块,对Nginx返回的数据压缩,属于性能优化模块 4 ngx_http_fastcgi_module   # FastCGI模块,和 动态应用相关的模块,例如PHP
5 ngx_http_proxy_module    # Proxy代理模块
6 ngx_http_upstream_module # 负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查
7 ngx_http_rewrite_module    # URL地址重写模块
8 ngx_http_limit_conn_module # 限制用户并发连接数及请求数模块(防止ddos)
9 ngx_http_limit_req_module # 根据定义的key限制Nginx请求过程的速率
10 ngx_http_log_module      # 访问日志模块,以指定的格式记录Nginx客户访问日志等信息
11 ngx_http_auth_basic_module # Web认证模块,设置Web用户通过账号、密码访问Nginx
12 ngx_http_ssl_module     # ssl模块,用于加密的http连接,如https
13 ngx_http_stub_status_module # 记录Nginx基本访问状态信息等模块

7、nginx常用状态码

 1 200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
 2 301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应) 时,会自动将请求者转到新位置。
 3 302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请 求。
 4 
 5 400 (错误请求) 服务器不理解请求的语法。 
 6 401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。 
 7 403 (禁止) 服务器拒绝请求。
 8 404 (未找到) 服务器找不到请求的网页。服务器不可用
 9 
10 500 (服务器内部错误) 服务器遇到错误,无法完成请求。 
11 501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。 
12 502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。 
13 503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。 14 504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。 15 505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。

8、访问一个网站的流程

用户输入网站进行访问-->查找本地缓存hosts表--> 本地DNS --> 上层DNS(根DNS) --> 得到网站ip地址
建立tcp三次握手,建立请求后,发送请求报文,传送完成后,断开连接

9、nginx负载均衡模块

1 location 模块 进行URL匹配
2 proxy模块 代理,发送请求给upstream定义的节点池
3 upstream 定义负载节点池
负载均衡

10、负载均衡实现方式

1 硬件负载 
2 HTTP重定向负载均衡 
3 DNS负载均衡 
4 反向代理负载均衡 
5 IP层负载均衡
6 数据链路层负载均衡

一般常用的是 DNS负载均衡数据链路层负载均衡

11、Nginx做负载均衡实现的策略有哪些

1 轮询--默认算法
2 权重
3 ip_hash
4 least_conn
5 fair 6 url_hash

  1.轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

  2、指定权重,指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

  3、IP绑定 ip_hash,每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题

  4、fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。

  5、url_hash(第三方)按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

    6、最少连接数(least_conn):把请求转发给连接数较少的后端服务器

  参考:nginx负载均衡的5种策略

轮询:

fail_timeout与max_fails结合使用
max_fails 设置在 fail_timeout 参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了。
fail_time 服务器会被认为停机的时间长度,默认为 10s。
backup 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。
down 标记服务器永久停机了。

server localhost:8080 weight=2;

server localhost:8082 backup;

ip_hash; #保证每个访客固定访问一个后端服务器

least_conn; #把请求转发给连接数较少的后端服务器

fair; #实现响应时间短的优先分配

hash $request_uri; #实现每个url定向到同一个后端服务器

12、常用的web服务有哪些

1 apache 
2 nginx
3 tomcat 
4 lighttpd
5 weblogic
6 IIS

13、nginx的各个版本区别

nginx各个版本的区别 Nginx官网提供了三个类型的版本 
Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版
Stable version:最新稳定版,生产环境上建议使用的版本 Legacy versions:遗留的老版本的稳定版

nginx最新版本
1.22.1,稳定版本:1.20.1

14、nginx access模块

编写一个Nginx的access模块,要求准许192.168.3.29/24的机器访问,准许10.1.20.6/16这个网段的所有机器访问,准许34.26.157.0/24这个网段访问,除此之外的机器不准许访问。

 location/{

  access 192.168.3.29/24;

  access 10.1.20.6/16;

  access 34.26.157.0/24;

  deny all;

}

15、nginx默认配置文件

events {}、http {}、和没有被 {}包裹的区域。
http {} 中还有 server {},以及 server {} 中的 location {}

解析:
  没有被 {} 包裹的部分为全局配置,如 worker_processes 1; 设置工作进程(子进程)数为 1
    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
  events {} 为 nginx 连接配置的模块,如 worker_connections 1024; 设置每一个子进程最大允许连 接 1024 个连接 
  http {} 为 nginx http 核心配置模块
  server {} 为虚拟主机配置模块,包括监听端口、监听域名等
  location {} URI 匹配

 16、nginx配置

源码编译安装步骤
1、安装依赖包,下载编译安装包并解压到/usr/local/src/目录下
2、进入解压后的nginx目录内,编译-make-make install,验证nginx版本及编译参数
3、创建nginx用户及用户组
4、修改数据目录/data/nginx用户及用户组权限
5、创建Nginx⾃启动脚本:/usr/lib/systemd/system/nginx.service
6、修改配置文件,添加nginx程序软链接
7、daemon-reload加载启动脚本,enable、start自启动和开启nginx服务
8、游览器验证是否访问web服务正常

四个主要目录:
    conf:所有的配置⽂件
    logs:存放访问⽇志错误⽇志等⽇志
    html:保存了nginx服务器的web⽂件
    sbin:保存nginx⼆进制启动脚本

 

 17、查看nginx的并发连接数

1 命令查看:netstat -apn | grep 'nginx: work' |wc -l
2 添加了http_stub_status_module模块,web页面查看status状态信息

18、nginx的优化参数(暂时不补充)

 

19、动静分离

将动态请求和静态请求区分访问

静态由Nginx处理, 动态由PHP处理或Tomcat处理;Nginx是通过url来区分请求的类型,并转发给不同的服务端。
根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路
1 Nginx根据客户端请求的url来判断请求的是否是静态资源,如果请求的url包含jpg、png,则由Nginx处理。 2 如果请求的url是.php或者.jsp等等,这个时候这个请求是动态的,将转发给tomcat处理。

好处:
  • api 接口服务化
  • 前后端开发并行
  • 减轻后端服务器压力,提高静态资源访问速度:


https://blog.csdn.net/dijichen0911/article/details/101965722?

 

 nginx面试题

20、C10k问题

所谓 c10k 问题,指的是服务器如何支持 10k 个并发连接
nginx 占有内存少,并发能力强

 

21、502/504报错分析

502 错误主要从四个方向入手:
1 php-fpm.conf 配置文件中max_children 最大子进程数 和 request_terminate_timeout
2 php.ini 中的 max_execution_time 参数
3 数据库死锁导致超时
4 网关服务是否启动,如 php-fpm

504 错误主要查看 nginx.conf 关于网关如 fastcgi 的配置
fastcgi_connect_timeout、fastcgi_send_timeout、fastcgi_read_timeout

22、漏桶算法和令牌桶算

每一个对外提供的 API 接口都是需要做流量控制的,不然会导致系统直接崩溃。

漏桶算法:可以控制端口的流量输出速率,平滑网络上的突发流量,实现流量整形,从而为网络提供一个稳定的流量。
令牌桶算法:用来控制发送到网络上的数据的数目,并允许突发数据的发送。

区别在于:
  漏桶算法能够强行限制数据的传输速率
令牌桶算法能够在限制数据的平均传输速率的同时还允许某种程度的突发传输

 

23、限制游览器访问+限制爬虫 --http_user_agent

if ($http_user_agent ~* "Firefox|MSIE")
{
     return 403;
}

# 添加如下内容即可防止爬虫
if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|
Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|
MSNBot|ia_archiver|Tomato Bot") { return 403; }

 

24、Nginx动态添加模块(Apache配置文件引用 .so)

1 下载需要的模块
2 查看之前编译的模块类型:nginx -v
3、./configure --add-module=下载模块地址 + 之前编译的选项参数
4 make # 不要make install,不然就真的覆盖

替换nginx二进制文件
  备份原来的nginx执行程序
    mv /usr/local/nginx-1.19.1/sbin/nginx /usr/local/nginx-1.19.1/sbin/nginx.bak
  # 将新编译的nginx执行程序复制到/usr/local/nginx-1.19.1/sbin/目录下
    cp /opt/nginx/sbin/nginx /usr/local/nginx-1.19.1/sbin/

25、Nginx是如何实现高并发的

一个 server 采用一个进程(或者线程)负责一个 request 的方式,那么进程数就是并发数
Nginx 的异步非阻塞工作方式正是利用了这点等待的时间。在需要等待的时候,这些进程就空闲出来待命了。因此表现为少数几个进程就解决了大量的并发问题。
多个连接对应一个进程

 26、nginx和apache对比

nginx:
    配置简单、高并发能力强,静态文件处理能力强,高度模块化,占用内存和资源少,启动容易,
  支持7层负载均衡,支持反向代理服务器,对 PHP 支持nginx 需要配合其他后端用 apache: rewrite能力强,模块丰富,bug较少,超稳定,对php支持简单,处理动态请求有优势

27、Nginx支持场景

Nginx 的常用使用场景包括 HTTP 服务器、静态服务器、反向代理、负载均衡、动静分离、统一访问入口、解决浏览器跨域问题和行为分析等。

28、Nginx特点:

热部署、高并发、低内存消耗、处理响应快、很高的可靠性
Nginx 是通过基于异步及非阻塞的事件驱动模型和多进程机制实现高性能的

29、Nginx三大功能

反向代理
负载均衡
动静分离

30、为什么nginx性能这么高

事件处理机制:异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决

31、nginx日常参数优化

防盗链、隐藏版本信息、404/502返回页面优化,最大上传文件大小、工作进程绑定,status状态页面开启

 

32、Nginx处理http请求

1 解析头部
2 匹配url
3 判断是否限速
4 连接控制,验证请求
5 返回响应
6 过滤返回的响应
7 记录日志

参考:nginx面试

 

 

posted @ 2022-10-31 17:26  我是大斌  阅读(101)  评论(0)    收藏  举报