-
Nginx 支持的负载均衡算法
- 轮询
- 加权轮询
- ip 哈希
- url 哈希
- 最小连接数
- 最小平均响应时间
- 随机
-
location 的匹配顺序
- 精准匹配
=
^~
:路径长者优先- 正则匹配:
~
和~*
- 通用匹配:
/
,路径长者优先。
- 精准匹配
-
servername 的匹配顺序
- 精准 server name 匹配
- 以 * 通配符开始的泛域名
- 以 * 通配符结束的泛域名
- 匹配正则表达式
- listen 指定的 default server_name
- http 模块下的第一个 server 配置块中的 server_name
-
重新加载配置文件的流程
- 向 master 发送 reload 信号
- 校验配置文件语法
- 打开新的监听端口
- master 用新配置文件启动新的 worker 子进程
- master 进程向旧 worker 子进程发送 quit 信号
- 旧 worker 进程关闭监听句柄,处理完当前连接后结束进程
-
Nginx 调优
-
合理设置 Nginx worker 进程数,并绑定不同 CPU
可以通过
worker_cpu_affinity
将 Nginx worker 进程绑定到不同的 CPU 上,避免多个进程竞争同一个 CPU 资源,充分利用 CPU 多核资源.1 2
worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;
-
使用 epoll 时间驱动模型,合理设置单个进程的最大连接数以及最大打开文件数量
1 2 3 4 5
events { use epoll; worker_connections 15000; worker_rlimit_nofile 65535; }
-
开启 access_log_buffer缓冲区
在高并发场景下,nginx 日志写入磁盘可能会极大的影响 nginx 的性能。
-
开启高效文件传输模式,开启 gzip 压缩
- 配置段
sendfile
参数用于开启文件高效传输模式 - 配置段
gzip
参数可用于开启压缩功能
1 2 3 4
http { gzip on; sendfile on; }
- 配置段
-
配置 Nginx 连接超时时间
- 配置段
keepalive_timeout
参数用于设置客户端连接保持会话的超时时间,超过这个时间服务器会关闭该连接 - 配置段
client_header_timeout
参数用于设置读取客户端请求头数据的超时时间。如果读取请求头超时,服务器将返回 “Request time out (408)” 错误. - 配置段
client_body_timeout
参数用于设置读取客户端请求主体数据的超时时间。如果读取请求体超时,服务器将返回 “Request time out (408)” 错误. - 配置段
send_timeout
参数用于指定响应客户端的超时时间,如果超时,Nginx 将会关闭连接.
1 2 3 4 5 6 7
http { # 在大并发时,需要合理调小如下参数 keepalive_timeout 65; client_header_timeout 15; client_body_timeout 15; send_timeout 25; }
- 配置段
-
限制连接和限制请求速率
1 2 3 4 5
http { limit_conn_zone $binary_remote_addr zone=addr:10m; # 设置 $binary_remote_addr 客户端地址的地址区域为 10m limit_conn ${zone} ${num}; # 设置指定 zone 的最大连接数 limit_conn_status ${http_code}; # 设置超过最大连接数的状态码,默认 503 }
-
使用缓存,合理配置 Nginx expires
expires
参数用于设置用户访问内容的缓存时间。用户会在本地浏览器中缓存这些内容,直到超过缓存时间。多用于配置静态内容1 2 3
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ { expires 3650d; }
-
限制上传文件大小
1 2 3
http { client_max_body_size 8m; # 设置客户端最大请求体大小为8M }
-
-
安全
-
隐藏版本号
在配置文件
http
配置段中添加server_tokens off;
-
只允许指定客户端访问
1 2 3 4
location / { allow 192.168.1.1/24; deny all; }
-
配置防盗链
根据 HTTP
referer
字段实现防盗链: referer 是 HTTP 的一个首部字段,用于指明用户请求的 URL 是从哪个页面通过链接跳转过来的1 2 3 4 5 6
location ~ .*\.(gif|jpg|jpeg|png|bm|swf|flv|rar|zip|gz|bz2)$ { valid_referers none blocked *.test.com *.abc.com; # 表示这些地址可以访问上面的媒体资源 if ($invalid_referer) { # 如果不是从以上域名访问,则返回 403 return 403 }
-
-
Nginx常用信号
kill 信号 解释 nginx 命令 TERM(15), INT(2) 快速停止 nginx -s stop QUIT(3) 优雅的停止 nginx -s quit HUP(1) 优雅的启动新的进程重新加载配置文件 nginx -s reload USR1(10) 日志文件滚动 nginx -s reopen USR2(12) 升级二进制可执行文件 - WINCH(28) 优雅的关闭 worker 进程
Nginx 面试题
💬评论