前言:为什么 Nginx 仍是生产环境的首选
在云原生和微服务架构盛行的今天,Nginx 凭借其高并发处理能力、低内存占用和灵活的配置体系,依然是 Web 服务器和反向代理领域的事实标准。无论是 Kubernetes 集群中的 Ingress Controller,还是传统的 LAMP/LEMP 架构,Nginx 都扮演着关键角色。本文将深入 Nginx 的生产配置,从基础调优到安全加固,帮助开发者构建稳定高效的服务基础设施。
根据 W3Techs 的统计数据,Nginx 在全球排名前 1000 万的网站中占据了超过 30% 的份额,并且这个数字还在持续增长。学习 Nginx 的生产配置不仅是运维工程师的必备技能,也是全栈开发者进阶的必经之路。

一、核心配置参数调优
1.1 工作进程与连接数
Nginx 采用 master-worker 多进程模型,合理配置 worker 进程数量是性能优化的第一步。以下是一个经过生产验证的基础配置模板:
1
2
3
4
5
6
7
8
9
10 worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;
events {
worker_connections 10240;
use epoll;
multi_accept on;
accept_mutex_delay 100ms;
}
参数说明:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| worker_processes | auto | 自动检测 CPU 核心数,每个 worker 绑定一个核心 |
| worker_connections | 10240 | 每个 worker 最大并发连接数,配合 ulimit 调整 |
| use epoll | epoll | Linux 平台最高效的事件驱动模型 |
| multi_accept | on | 一次 accept 多个连接,提高吞吐量 |
注意:
1 | worker_rlimit_nofile |
需要与系统级别的 ulimit 配合。需要在 /etc/security/limits.conf 中设置:
1
2 * soft nofile 65535
* hard nofile 65535
1.2 sendfile 与 TCP 优化
Nginx 的静态文件处理能力是其核心优势,正确配置 sendfile 和 TCP 参数可以显著提升性能:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 连接超时设置
keepalive_timeout 65;
keepalive_requests 1000;
client_body_timeout 10;
client_header_timeout 10;
send_timeout 10;
# 客户端请求体大小
client_max_body_size 10m;
client_body_buffer_size 128k;
}
1 | tcp_nopush |
和
1 | sendfile |
配合使用时,Nginx 会在数据包累积到一定大小后才发送,减少了 TCP 小包数量,显著提升网络利用率。而
1 | tcp_nodelay |
则适用于需要低延迟的应用场景,如 API 服务。
二、反向代理与负载均衡配置
2.1 upstream 负载均衡策略
Nginx 的 upstream 模块支持多种负载均衡算法,选择合适的策略对后端服务的稳定性至关重要:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 upstream backend {
# 最少连接算法
least_conn;
# 保持会话亲和性(可选)
# ip_hash;
# 后端服务器列表
server 10.0.1.1:8080 weight=5 max_fails=3 fail_timeout=30s;
server 10.0.1.2:8080 weight=3 max_fails=3 fail_timeout=30s;
server 10.0.1.3:8080 backup;
# 健康检查(需要 nginx-plus 或 ngx_http_upstream_check_module)
# check interval=3000 rise=2 fall=5 timeout=1000 type=http;
# check_http_send "GET /health HTTP/1.0\r\n\r\n";
# check_http_expect_alive http_2xx http_3xx;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend;
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_set_header X-Forwarded-Proto $scheme;
# 后端超时设置
proxy_connect_timeout 5;
proxy_read_timeout 30;
proxy_send_timeout 30;
}
}
常见的负载均衡算法对比:
| 算法 | 指令 | 适用场景 |
|---|---|---|
| 轮询(Round Robin) | 默认 | 后端服务器配置均衡 |
| 最少连接 | least_conn | 请求处理时间差异大 |
| IP 哈希 | ip_hash | 需要会话保持(Session) |
| 通用哈希 | hash $request_uri | 缓存命中率优化 |
| 随机 | random | 分布式环境,避免热点 |
2.2 缓存加速
合理配置缓存可以大幅减少后端压力,以下是一个完整的缓存配置示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 # 缓存定义
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=static:100m
inactive=7d max_size=10g use_temp_path=off;
server {
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2?)$ {
proxy_cache static;
proxy_cache_valid 200 30d;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating http_500 http_502;
proxy_cache_background_update on;
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
# 缓存键
proxy_cache_key $scheme$proxy_host$request_uri;
# 绕过缓存的条件
proxy_no_cache $cookie_nocache $arg_nocache;
proxy_cache_bypass $cookie_nocache $arg_nocache;
# 添加缓存状态头
add_header X-Cache-Status $upstream_cache_status;
proxy_pass http://backend;
}
}
这里的关键参数
1 | proxy_cache_use_stale |
在源站故障时提供过期缓存,实现优雅降级。
1 | proxy_cache_background_update |
允许在缓存过期时异步更新,用户请求不会阻塞等待。
三、HTTPS 与 SSL/TLS 安全加固
3.1 现代 TLS 配置
TLS 配置是安全基础设施的核心,以下配置基于 Mozilla SSL Configuration Generator 的现代级别推荐:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 server {
listen 443 ssl http2;
server_name example.com;
# 证书路径
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# 仅使用 TLS 1.2 和 1.3
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_ecdh_curve secp384r1:secp521r1:prime256v1;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;
resolver_timeout 5s;
# HSTS
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# 会话缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
}
OCSP Stapling 是一项重要的性能优化,它让 Nginx 代替客户端向 CA 查询证书吊销状态,并将结果缓存后提供给客户端,省去了客户端单独查询的步骤,同时提升了隐私性。
3.2 HTTP 自动跳转 HTTPS
1
2
3
4
5 server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
同时建议实现
1 | HSTS preload |
,将域名提交到 https://hstspreload.org,使得浏览器内置的 HSTS 列表强制使用 HTTPS 连接,彻底杜绝中间人攻击。
四、安全防护配置
4.1 请求频率限制
速率限制是防止 DDoS 和暴力破解的第一道防线:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 # 定义限制区域
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=30r/s;
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=5r/m;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
# API 限流(突发流量允许+延迟处理)
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
limit_conn conn_limit 50;
proxy_pass http://backend;
}
# 登录接口严格限流
location /login {
limit_req zone=login_limit burst=3 nodelay;
limit_req_status 429;
proxy_pass http://backend;
}
# 返回友好的限流提示
error_page 429 = @rate_limit;
location @rate_limit {
default_type application/json;
return 429 '{"code":429,"message":"请求过于频繁,请稍后再试"}';
}
}
注意
1 | burst=20 nodelay |
的含义:允许突发 20 个请求的瞬时流量,超出速率的请求会立即被处理(nodelay),但超过 burst 的请求直接返回 429。如果不加 nodelay,超出的请求会排队等待,可能导致延迟累积。
4.2 安全头与防攻击
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 server {
# 安全头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
# CSP 内容安全策略
add_header Content-Security-Policy "
default-src 'self';
script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn.example.com;
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;
font-src 'self' data:;
connect-src 'self' https://api.example.com;
frame-ancestors 'none';
" always;
# 隐藏 Nginx 版本号
server_tokens off;
}
Content-Security-Policy (CSP) 是防御 XSS 攻击的最有效手段之一。通过白名单机制告诉浏览器哪些来源的资源是可信的,任何不在白名单中的脚本都会被浏览器阻止执行。建议根据实际业务需求精确配置,不要过度使用
1 | unsafe-inline |
。
4.3 防止文件泄露
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 # 禁止访问隐藏文件
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
# 禁止访问敏感文件
location ~* (\.(bak|conf|log|sql|sh|md|env|git|svn|swp|tar|gz|zip))$ {
deny all;
return 404;
}
# 限制访问特定路径
location /admin {
allow 10.0.0.0/8;
allow 192.168.0.0/16;
deny all;
proxy_pass http://backend;
}
五、日志与监控
5.1 日志格式优化
良好的日志格式有助于故障排查和性能分析:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 # JSON 格式日志(便于日志分析系统处理)
log_format json_combined escape=json
'{'
'"timestamp":"$time_iso8601",'
'"remote_addr":"$remote_addr",'
'"request_method":"$request_method",'
'"request_uri":"$request_uri",'
'"status":$status,'
'"body_bytes_sent":$body_bytes_sent,'
'"request_time":$request_time,'
'"upstream_response_time":"$upstream_response_time",'
'"http_referer":"$http_referer",'
'"http_user_agent":"$http_user_agent",'
'"http_x_forwarded_for":"$http_x_forwarded_for"'
'}';
access_log /var/log/nginx/access.log json_combined buffer=32k flush=5s;
error_log /var/log/nginx/error.log warn;
使用
1 | buffer=32k flush=5s |
可以减少磁盘 I/O 操作,在高并发场景下可以显著降低日志写入对性能的影响。同时,JSON 格式的日志对 ELK 或 Loki 等日志分析系统更加友好。
5.2 状态监控页面
1
2
3
4
5
6
7 location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
allow 10.0.0.0/8;
deny all;
}
通过
1 | stub_status |
模块可以获取 Nginx 的实时运行状态,包括活跃连接数、请求总数等指标。配合 Prometheus 的
1 | nginx_exporter |
可以构建完整的 Nginx 监控面板。
六、性能基准测试
配置完成后,使用以下工具进行性能验证:
1
2
3
4
5
6
7
8
9
10
11
12
13 # 安装测试工具
apt-get install -y apache2-utils # ab 命令
# 或
pip install hey
# 基准测试(1000 请求,100 并发)
ab -n 1000 -c 100 -k https://example.com/
# 更现代的工具
hey -n 10000 -c 200 -m GET https://example.com/api/test
# 压测并输出详细信息
wrk -t12 -c400 -d30s --latency https://example.com/
测试结果分析要点:
- Requests per second:每秒请求数,越高越好
- Time per request:平均请求处理时间,越低越好
- Transfer rate:吞吐量,受限于带宽
- Failed requests:必须为 0
- Connection Times:关注 min、avg、max 和偏差
一个经过优化的 Nginx 实例,在 2 核 4G 的云服务器上,通常可以达到 10000+ QPS 的静态文件处理能力和 5000+ QPS 的反向代理处理能力。
七、常见问题排查
7.1 502 Bad Gateway
最常见的原因是后端服务未启动或超时。检查后端服务状态,并适当增加
1 | proxy_read_timeout |
的值。也可以开启
1 | proxy_next_upstream |
实现自动故障转移:
1 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
7.2 413 Request Entity Too Large
上传文件大小超过限制。调整
1 | client_max_body_size |
值,同时需要确保后端服务(如 PHP-FPM 的
1 | upload_max_filesize |
)也做了相应调整。
7.3 连接数不足
如果出现
1 | worker_connections are not enough |
错误,检查系统 ulimit 和 Nginx 的 worker_connections 配置。同时可以使用
1 | ss -s |
查看系统当前连接状态,确认是否达到了端口上限。
总结
Nginx 的配置优化是一个持续迭代的过程,没有放之四海皆准的完美配置。本文介绍的配置参数和优化策略提供了一个可靠的生产环境起点,但实际部署时还需要结合业务特点、服务器硬件规格和流量模式进行微调。建议使用 AB 测试工具对不同配置进行对比验证,用数据驱动优化决策。
安全方面,永远记住”纵深防御”的原则——Nginx 层面的安全配置只是防护体系的一部分,还需要配合 Web 应用防火墙(WAF)、入侵检测系统(IDS)等多层防护手段来构建完整的安全架构。
最后,保持关注 Nginx 官方更新和安全公告,及时升级版本以修复已知漏洞。一个稳定的 Nginx 服务是构建可靠互联网应用的基础,值得投入时间和精力做好配置。
汤不热吧