Nginx的几乎所有核心功能,均依赖于精心编写的 .conf 配置文件来实现。唯有掌握配置之道,方能称得上真正驾驭了Nginx。无论是反向代理、限流控制,还是负载均衡,Nginx 的这些强大功能,无一不依托于其 .conf 文件的精妙配置。基于实战经验精心梳理了 Nginx 最常用、最实用的功能配置。满满干货,建议收藏备用。

一、基础配置
1.1 全局配置优化
nginx
user nginx nginx; # 明确运行用户(避免权限问题)
worker_processes auto; # 自动匹配CPU核心数
worker_cpu_affinity auto; # 自动绑定CPU核心(减少上下文切换)
worker_priority -5; # 提升进程优先级(需root权限)
worker_rlimit_nofile 65535; # 增大文件描述符限制
pid /var/run/nginx.pid; # 明确pid文件路径
关键说明:
-
worker_cpu_affinity在4核服务器上的示例配置:nginxworker_cpu_affinity 0001 0010 0100 1000; # 每个worker绑定独立核心 -
worker_priority范围为-20(最高)到19(最低),需谨慎调整。
1.2 Events模块调优
nginx
events {
worker_connections 16384; # 单worker最大连接数
use epoll; # Linux高效事件模型
multi_accept on; # 一次接受所有新连接
accept_mutex on; # 防止惊群效应(默认开启)
accept_mutex_delay 50ms; # 获取锁失败时的等待时间
}
性能影响:
- 高并发场景下,
multi_accept on可提升QPS 10%~15%。 accept_mutex_delay需根据服务器负载调整(低负载时设为0ms)。
二、核心功能配置:反向代理与负载均衡
2.1 单节点反向代理
nginx
server {
listen 80;
server_name api.example.com;
location /testapi/ {
proxy_pass http://178.168.1.10:9120/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 8M;
proxy_connect_timeout 10s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
生产环境优化:
-
添加健康检查:
nginxlocation /healthz { access_log off; return 200 "OK"; }
2.2 负载均衡(健康检查)
nginx
upstream openserver-api {
zone backend 64k; # 共享内存区域(用于状态同步)
least_conn; # 最少连接数策略
server 127.0.0.1:8900 weight=100 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8901 weight=100 max_fails=3 fail_timeout=30s;
# 主动健康检查(需nginx_upstream_check_module)
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "HEAD /healthz HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
server {
location /test-api/ {
proxy_pass http://openserver-api;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
}
}
策略对比:
| 策略 | 适用场景 | 缺点 |
|---|---|---|
| 轮询 | 无状态服务 | 不考虑服务器负载 |
| 最少连接数 | 长连接服务(如WebSocket) | 需状态同步 |
| IP Hash | 需要会话保持的场景 | 不均衡风险 |
三、安全加固:零信任架构实践
3.1 传输层安全
nginx
server {
listen 443 ssl http2;
server_name secure.example.com;
ssl_certificate /etc/ssl/certs/fullchain.pem;
ssl_certificate_key /etc/ssl/private/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_stapling on;
ssl_stapling_verify on;
# 禁用SSL压缩(防CRIME攻击)
ssl_compress off;
}
证书管理建议:
-
使用Let's Encrypt免费证书(配合Certbot自动续期)
-
定期检查证书有效期:
bashecho | openssl s_client -servername secure.example.com -connect secure.example.com:443 2>/dev/null | openssl x509 -noout -dates
3.2 协议级防护
nginx
server {
# 防止SSL剥离攻击
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# 内容安全策略(CSP)
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://trusted.cdn.com";
# 防止点击劫持
add_header X-Frame-Options "DENY";
# 禁用MIME嗅探
add_header X-Content-Type-Options "nosniff";
# 防止XSS攻击
add_header X-XSS-Protection "1; mode=block";
}
CSP策略生成工具:
- 使用Mozilla Observatory扫描并生成策略。
3.3 访问控制
nginx
# IP白名单(支持CIDR)
geo $allowed_ip {
default deny;
192.168.1.0/24 allow;
203.0.113.0/24 allow;
}
server {
location /admin/ {
if ($allowed_ip = deny) {
return 403;
}
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
动态IP限制:
-
结合
fail2ban动态封禁恶意IP:nginx# 在/etc/fail2ban/jail.d/nginx.conf中配置 [nginx-http-auth] enabled = true port = http,https filter = nginx-http-auth action = iptables-multiport[name=nginx-http-auth, port="http,https", protocol=tcp] logpath = /var/log/nginx/error.log maxretry = 3
四、性能优化:从毫秒到微秒的优化
4.1 静态资源加速
nginx
server {
location /static/ {
alias /var/www/static/;
expires 1y; # 长期缓存
add_header Cache-Control "public, no-transform";
gzip_static on; # 预压缩文件
etag off; # 禁用ETag(与Last-Modified二选一)
}
}
浏览器缓存策略:
| 资源类型 | Cache-Control策略 |
|---|---|
| HTML | no-cache, must-revalidate |
| CSS/JS | public, max-age=31536000 |
| 字体文件 | public, max-age=31536000 |
| API响应 | private, max-age=0 |
4.2 动态内容缓存(OpenResty集成)
nginx
# 使用Lua脚本实现多级缓存
location /api/data {
set $cache_key "$host$request_uri$cookie_user_id";
proxy_cache_key $cache_key;
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_use_stale error timeout updating http_500;
# Lua动态控制缓存
access_by_lua_block {
local cache_key = ngx.var.cache_key
local res = ngx.location.capture("/cache_check", { args = { key = cache_key } })
if res.status == 200 then
ngx.exit(ngx.HTTP_OK)
end
}
}
缓存策略设计:
- 热数据:缓存时间短(1~5分钟),频繁更新
- 冷数据:缓存时间长(24小时以上)
- 敏感数据:不缓存或签名校验
4.3 连接池优化
nginx
upstream backend {
server 127.0.0.1:8080;
keepalive 32; # 长连接数
}
server {
location / {
proxy_http_version 1.1;
proxy_set_header Connection ""; # 禁用短连接
}
}
TCP参数调优(/etc/sysctl.conf):
conf
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 4096
五、高可用架构:从单点到集群
5.1 主从配置同步
nginx
# 主服务器配置
http {
upstream backend {
server master.example.com:8080;
server slave.example.com:8080 backup;
}
}
# 从服务器配置(通过rsync同步配置)
*/5 * * * * /usr/bin/rsync -avz /etc/nginx/ root@slave.example.com:/etc/nginx/
自动化同步方案:
-
使用
ansible或puppet实现配置管理 -
结合
git钩子自动部署:bash# .git/hooks/post-receive #!/bin/bash TARGET="/etc/nginx" GIT_DIR="/var/repo/nginx.git" BRANCH="master" while read oldrev newrev ref do if [[ $ref = refs/heads/$BRANCH ]]; then echo "Ref $ref received. Deploying ${BRANCH} branch to production..." git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f $BRANCH nginx -t && systemctl reload nginx else echo "Ref $ref received. Doing nothing: only the ${BRANCH} branch may be deployed on this server." fi done
5.2 四层负载均衡(TCP/UDP)
nginx
stream {
upstream db_backend {
server 192.168.1.10:3306;
server 192.168.1.11:3306;
}
server {
listen 3306;
proxy_pass db_backend;
proxy_connect_timeout 1s;
proxy_timeout 3s;
}
}
适用场景:
- MySQL/Redis等数据库集群
- 游戏服务器负载均衡
- 自建VPN接入
5.3 动态DNS解析
nginx
resolver 8.8.8.8 114.114.114.114 valid=30s;
upstream dynamic_backend {
server backend.example.com:8080 resolve;
}
server {
location / {
proxy_pass http://dynamic_backend;
}
}
监控DNS变化:
bash
watch -n 1 "dig +short backend.example.com"
六、监控与故障排查
6.1 实时指标暴露
nginx
# 使用nginx-module-vts
http {
vhost_traffic_status_zone;
server {
listen 8080;
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format prometheus;
}
}
}
Grafana仪表盘配置:
- 导入Nginx Dashboard
- 关键指标:
nginx_http_requests_totalnginx_connections_activenginx_upstream_responses_total
6.2 动态日志追踪
nginx
# 使用OpenTelemetry集成
load_module modules/ngx_http_opentelemetry_module.so;
http {
opentelemetry_config /etc/nginx/otel.conf;
opentelemetry_tracer "nginx-exporter";
server {
location / {
opentelemetry_propagate_context on;
opentelemetry_attribute "http.method=$request_method";
}
}
}
Jaeger查询:
bash
curl -s "http://jaeger:16686/api/traces?service=nginx" | jq .
6.3 故障诊断工具包
| 工具 | 用途 | 命令 |
|---|---|---|
nginx -T |
测试配置并输出完整配置 | nginx -T -c /etc/nginx/nginx.conf |
strace |
跟踪系统调用 | strace -p $(cat /var/run/nginx.pid) |
tcpdump |
抓包分析 | tcpdump -i eth0 port 80 -w nginx.pcap |
slowlog |
记录慢请求(需编译模块) | slowlog_file /var/log/nginx/slow.log; slowlog_threshold 5s; |
七、云原生适配:Kubernetes与Service Mesh
7.1 Nginx Ingress Controller配置
yaml
# ingress-nginx注解示例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/canary: "true" # 金丝雀发布
nginx.ingress.kubernetes.io/canary-weight: "20"
nginx.ingress.kubernetes.io/configuration-snippet: |
add_header X-Robots-Tag "noindex";
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
金丝雀发布策略:
- 通过
canary-weight控制流量比例 - 结合Prometheus监控错误率自动调整权重
7.2 Service Mesh集成(Istio)
nginx
# 在Istio Sidecar中配置Nginx
server {
location / {
proxy_pass http://127.0.0.1:15001; # Envoy代理端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
流量镜像示例:
yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: mirror-example
spec:
hosts:
- web-service
http:
- route:
- destination:
host: web-service
subset: v1
weight: 90
mirror:
host: web-service
subset: v2
mirror_percentage:
value: 10.0
八、最佳实践
-
配置管理:
- 使用Git进行版本控制
- 通过CI/CD流水线自动测试与部署
- 关键配置变更需双人审核
-
性能基准:
- 使用
wrk或locust进行压力测试 - 目标:P99延迟<200ms,错误率<0.1%
- 使用
-
安全审计:
- 每月运行
nginx -V 2>&1 | grep -o with-http_ssl_module检查模块安全性 - 阅Nginx安全公告
- 每月运行
-
容灾设计:
- 多可用区部署
- 配置自动回滚机制
- 定期演练故障转移
附:常用模块推荐
| 模块名称 | 功能描述 | 安装方式 |
|---|---|---|
nginx-module-vts |
实时流量监控 | ./configure --add-module |
nginx-opentelemetry |
分布式追踪 | 编译安装 |
nginx-wasm-module |
WebAssembly运行时 | 实验性模块 |
nginx-upstream-check |
主动健康检查 | 第三方模块 |
nginx-lua-module |
动态脚本处理(OpenResty核心) | 编译安装 |
关注公众号获取更多技术干货 !
