Nginx的优化思路和匹配优先级
**▶ Nginx优化方案:**
**• 基础优化:**
▪ 使用最新稳定版本
▪ 选择合适的编译参数
减少不必要的模块可以提升Nginx启动速度和运行效率
**• 性能优化:**
▪ 调整worker进程:
默认worker_processes数量通常设置为CPU核心数:
worker_processes auto;
手动指定,如8核COU:
worker_processes 8;
worker_connections指定每个worker能同时处理的最大连接数
worker_connections 10240; #建议值:10240
▪ 开启高效事件模型:
events {
use epoll; #linux推荐使用epoll(IO多路复用epoll)
worker_connections 1024
}
▪ 启用sendfile:
开启sendfile可以提高文件传输效率
sendfile on; #减少数据拷贝,提高传输效率。
tcp_nopush on; #减少网络包数量,提高吞吐量。
tcp_nodelay on; #减少TCP延迟,提高小数据包响应速度
▪ 增大缓存和缓冲区:
client_body_buffer_size 512k; #请求体缓冲区大小
client_header_buffer_size 32k; #普通请求头缓冲区大小
large_client_header_buffers 4 64k; #超大请求头缓冲区大小,分4个缓冲区,每个缓冲区64k
▪ 设定合理的Keepalive:
keepalive_timeout 65; #TCP连接保持时间,不宜过大过小
keepalive_requests 10000; #限制单个链接的最大请求数
**• 反向代理优化:**
▪ 配置缓存:
对于静态资源或可缓存的后端响应,可以使用proxy_cache:
/var/cache/nginx:缓存文件存放在服务器的这个目录下
levels=1:2 缓存文件分两级目录存放
(比如/var/cache/nginx/a/1b/xxx),防止单个目录文件太多导致性能下降
keys_zone=cache_zone:10m:定义10MB的缓存索引空间
max_size=1g:缓存最多占1G磁盘空间,满了就淘汰旧缓存
inactive=60m:60分钟内未使用的缓存将被清理
完整配置:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache_zone:10m max_size=1g inactive=60m;
server { #引用缓存
location / { #引用缓存
proxy_cache cache_zone; #引用上面定义的共享内存区域
proxy_cache_valid 200 302 10m; #对200/302状态码的响应,缓存10分钟
proxy_cache_valid 404 1m; #对404状态码的响应,只缓存1分钟
proxy_pass htto://backend; #反代理到后端服务器
}
}
▪ 启用gzip压缩:
gzip on;
gzip_comp_level 5; #压缩级别,推荐4~6之间
一般不压缩(磁盘够用),压缩级别过高会导致速度变慢
gzip_min_length 1024; #小于1KB的数据不压缩
▪ 限制请求速率:
防止DDoS或恶意攻击:
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
server { #rate=5r/s:限制每秒最多5个请求
location / {
limit_req zone=zone burst=10 nodelay;
} #burst=10:允许突发10个请求
}
tips:rate一般不会设置过低,会导致部分正常访问不了,一般会是在发现服务器被恶意攻击之后,设置rate值变小,迅速降低服务器负载
**• 负载均衡优化:**
▪ 选择合适的负载均衡算法
least_conn; #选择连接最少的服务器
▪ 开启HTTP/2:
server {
listen 443 ssl http2; #监听443端口,启用ssl加密、http2协议
ssl_certificate /etc/nginx/ssl/server.pem; #证书文件
ssl_certificate_key /etc/nginx/ssl/server.key; #私钥文件
**• 日志监控优化:**
▪ 关闭不必要的日志:
生产环境可以关闭access_log,仅保留error_log级别crit以上的错误
access_log off;
▪ 监控Nginx运行状态:
启用stub_status模块:
Nginx 会返回一份实时状态报告,告诉你当前服务器“忙不忙”、“处理了多少请求”。
server {
location /nginx_status {
stub_status on; #启用内置的状态统计模块
access_log off; #关闭访问日志记录
allow 127.0.0.1; #仅允许本机ip(127.0.0.1)访问
deny all; #拒绝所有其他IP的访问
}
}
**• 安全优化:**
▪ 隐藏Nginx版本信息:
server_tokens off;
▪ 限制请求方法:
if ($request_method !~^(GET|POST|HEAD)$) {
#依托开发需求配置
return 444; #444:直接关闭TCP连接,不发送任何响应
}
▪ 保护关键路径:
location ~^(wp-admin|admin|config){
deny all; 匹配以这些开头的所有请求,拒绝访问,返回403
}
**▶ 总结**
Nginx的优化:
1.使用最新版本
2.不需要的模块,不编译安装
3.worker_processes=cpu核心数
4.worker_connections 10240
5.开启高效事件模型
6.启用sendfile、tcp_nopush、tcp_nodelay
7.设定合理的Keepalive
8.配置代理缓存
9.合理配置gzip压缩等级
10.限制IP请求速率
11.使用http2
12.隐藏nginx的版本 deny掉admin页面访问

**▶ Nginx的匹配优先级**
① =:精确匹配(最高优先级)
• 例子:location=/login
解释:只匹配/login,其他不匹配。
适用场景:登录页、固定API接口
② ^~前缀匹配(如果匹配,就不再检查正则)
• 例子:location ^~ /static/
解释:匹配以/static/开头的所有路径,不检查后面的正则规则。
适用场景:静态资源(图片、CSS、JS)
③ ~或~*正则匹配(按代码顺序匹配)
• ~:区分大小写 ~*:不区分大小写
解释:按照配置文件里的顺序匹配,先写的优先匹配。
适用场景:动态路由(比如根据URL后缀匹配不同后端)
④ /通用前缀匹配(最低优先级)
• 例子:location /
解释:匹配所有请求,但优先级最低,前面都没有匹配上才会匹配它。
适用场景:默认路由
**▶ 匹配顺序总结**
1.先检查 = 精确匹配 -------->命中就直接返回,不再往下找
2.再检查 ^~前缀匹配 ----------->命中就直接返回,不再检查正则
3.按顺序匹配正则------------->第一个匹配的正则生效
4.最后用 / 通用匹配----------->兜底(默认)