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

使用 bufferflush 减少磁盘 I/O。

8.2 错误日志级别

error_log /var/log/nginx/error.log warn;

生产环境建议设为 warnerror,避免 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 限制

results matching ""

    No results matching ""