Nginx 性能优化指南
本文档旨在提供一套系统、实用的 Nginx 性能调优建议,适用于高并发 Web 服务场景。适用于 Nginx 1.18+ 版本。
1. 概述
Nginx 是一个高性能的 HTTP 和反向代理服务器,广泛用于负载均衡、静态资源服务、API 网关等场景。合理配置可显著提升吞吐量、降低延迟、提高稳定性。
2. 系统层面优化
2.1 文件描述符限制
Nginx 高并发时会消耗大量文件描述符(FD),需调整系统限制:
# /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
# /etc/systemd/system/nginx.service(若使用 systemd)
[Service]
LimitNOFILE=65536
重启服务后生效。
2.2 网络内核参数调优
编辑 /etc/sysctl.conf:
# 增加连接队列大小
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 5000
# TIME_WAIT 快速回收(谨慎使用,某些 NAT 场景可能有问题)
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# 扩大本地端口范围(适用于反向代理场景)
net.ipv4.ip_local_port_range = 1024 65535
# TCP 缓冲区优化
net.ipv4.tcp_rmem = 4096 16384 67108864
net.ipv4.tcp_wmem = 4096 16384 67108864
应用配置:
sysctl -p
3. Nginx 全局配置优化
user nginx;
worker_processes auto; # 自动匹配 CPU 核心数
worker_rlimit_nofile 65535; # 每个 worker 最大 FD 数
events {
use epoll; # Linux 下高性能事件模型
worker_connections 65535; # 每个 worker 最大连接数
multi_accept on; # 一次接受多个新连接
}
说明:
worker_processes * worker_connections≈ 最大并发连接数。
4. HTTP 模块优化
http {
sendfile on; # 零拷贝传输
tcp_nopush on; # 累积数据包再发送(配合 sendfile)
tcp_nodelay on; # 实时小包立即发送(适用于交互式应用)
keepalive_timeout 65; # 长连接超时(秒)
keepalive_requests 1000; # 单连接最大请求数
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
client_body_buffer_size 128k;
client_max_body_size 10m; # 根据业务调整上传大小
reset_timedout_connection on; # 主动关闭超时连接,释放资源
server_tokens off; # 隐藏版本号,增强安全
}
5. 静态资源优化
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y; # 强缓存 1 年
add_header Cache-Control "public, immutable";
log_not_found off; # 不记录 404 日志
access_log off; # 关闭访问日志(可选)
}
启用
gzip压缩文本资源:
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
gzip_comp_level 6;
6. 动态内容与反向代理优化
6.1 反向代理配置
upstream backend {
server 10.0.0.10:8080 max_fails=3 fail_timeout=30s;
server 10.0.0.11:8080 max_fails=3 fail_timeout=30s;
keepalive 32; # 后端长连接池大小
}
server {
location /api/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
}
}
6.2 启用缓冲减少后端压力
proxy_buffering on;
proxy_buffer_size 16k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
7. 安全与限流
7.1 连接与请求限速
# 全局限速(基于 IP)
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req_zone $binary_remote_addr zone=req:10m rate=10r/s;
server {
limit_conn addr 20; # 单 IP 最多 20 个并发连接
limit_req zone=req burst=20 nodelay; # 限速 + 突发
}
7.2 防止 DDoS
- 使用
ngx_http_limit_conn_module和ngx_http_limit_req_module - 配合防火墙(如 iptables 或云 WAF)
- 禁用不必要的 HTTP 方法:
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 405;
}
8. 监控与日志优化
8.1 访问日志格式优化
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time"';
access_log /var/log/nginx/access.log main buffer=16k flush=5s;
使用
buffer和flush减少磁盘 I/O。
8.2 错误日志级别
error_log /var/log/nginx/error.log warn;
生产环境建议设为 warn 或 error,避免 info 级别日志过多。
8.3 集成监控
- 使用 Prometheus + nginx_exporter
- 或启用
stub_status模块:
location /nginx_status {
stub_status on;
access_log off;
allow 10.0.0.0/8;
deny all;
}
9. 常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 502 Bad Gateway | 后端宕机或超时 | 检查 proxy_*_timeout,确认后端健康 |
| 499 Client Closed Request | 客户端提前断开 | 优化前端加载,或忽略该状态码 |
| CPU 100% | 正则匹配过多、SSL 握手频繁 | 优化 location 匹配顺序,启用 SSL session cache |
| 连接拒绝 | worker_connections 不足 |
提高 worker_connections 并检查系统 FD 限制 |