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


一、基础配置

1.1 全局配置优化

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核服务器上的示例配置:
    worker_cpu_affinity 0001 0010 0100 1000;  # 每个worker绑定独立核心
    
  • worker_priority 范围为 -20(最高)到 19(最低),需谨慎调整。

1.2 Events模块调优

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 单节点反向代理

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;
    }
}

生产环境优化

  • 添加健康检查:
    location /healthz {
        access_log off;
        return 200 "OK";
    }
    

2.2 负载均衡(健康检查)

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 传输层安全

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自动续期)
  • 定期检查证书有效期:
    echo | openssl s_client -servername secure.example.com -connect secure.example.com:443 2>/dev/null | openssl x509 -noout -dates
    

3.2 协议级防护

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策略生成工具

3.3 访问控制

# 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:
    # 在/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 静态资源加速

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集成)

# 使用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 连接池优化

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):

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 主从配置同步

# 主服务器配置
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/

自动化同步方案

  • 使用ansiblepuppet实现配置管理
  • 结合git钩子自动部署:
    # .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)

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解析

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变化

watch -n 1 "dig +short backend.example.com"

六、监控与故障排查

6.1 实时指标暴露

# 使用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_total
    • nginx_connections_active
    • nginx_upstream_responses_total

6.2 动态日志追踪

# 使用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查询

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配置

# 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)

# 在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;
    }
}

流量镜像示例

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

八、最佳实践

  1. 配置管理

    • 使用Git进行版本控制
    • 通过CI/CD流水线自动测试与部署
    • 关键配置变更需双人审核
  2. 性能基准

    • 使用wrklocust进行压力测试
    • 目标:P99延迟<200ms,错误率<0.1%
  3. 安全审计

    • 每月运行nginx -V 2>&1 | grep -o with-http_ssl_module检查模块安全性
    • Nginx安全公告
  4. 容灾设计

    • 多可用区部署
    • 配置自动回滚机制
    • 定期演练故障转移

附:常用模块推荐

模块名称 功能描述 安装方式
nginx-module-vts 实时流量监控 ./configure --add-module
nginx-opentelemetry 分布式追踪 编译安装
nginx-wasm-module WebAssembly运行时 实验性模块
nginx-upstream-check 主动健康检查 第三方模块
nginx-lua-module 动态脚本处理(OpenResty核心) 编译安装


关注公众号获取更多技术干货 !

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐