返回首页

生产级 Nginx 性能优化 — 从内核到 K8s 全链路

📅 创建于 2026-05-29 🔄 更新于 2026-05-29 📝 483 字

来源:运维技术圈 | 发布日期:2026-05-26

生产级 Nginx 性能优化

Nginx 性能调优是在 CPU、内存、网络 I/O 之间寻求平衡的艺术。核心内功:看懂底层逻辑,摸透流量特性,结合监控数据,小步快跑地验证式调优。

优化框架总览

第一道防线:OS 内核调优(文件句柄 + TCP 协议栈)
第二道防线:Nginx 全局指令(Worker + Events)
第三道防线:HTTP 层 I/O 调优(sendfile/gzip/缓存)
第四道防线:Upstream 代理调优(Buffer/超时/重试)
云原生场景:K8S sysctl / 优雅停机 / Ingress-Nginx ConfigMap
监控兜底:stub_status / VTS / nginx-prometheus-exporter

第一道防线:操作系统内核调优

文件句柄限制

# /etc/security/limits.conf
* soft nofile 655350
* hard nofile 655350

# /etc/sysctl.conf
fs.file-max = 655350

TCP 协议栈压榨

# TIME-WAIT 复用(短连接场景极其重要)
net.ipv4.tcp_tw_reuse = 1

# ⚠️ 绝对不要开启 tcp_tw_recycle(新内核已废弃,NAT 下严重丢包)

# FIN-WAIT-2 等待时间
net.ipv4.tcp_fin_timeout = 15

# TIME_WAIT 最大数量
net.ipv4.tcp_max_tw_buckets = 262144

# 全连接/半连接队列
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 262144

# TCP Keepalive(默认 2h,缩短到 10min)
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 3

# TCP 缓冲区(大文件传输或高延迟网络)
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

第二道防线:Nginx 全局指令

Worker 进程与 CPU 亲和性

worker_processes auto;                 # 自动按 CPU 核心数设定
worker_cpu_affinity auto;              # 绑核(1.9.10+ 支持 auto)
worker_rlimit_nofile 655350;           # worker 进程最大文件数

Events 事件模型

events {
    use epoll;                         # Linux 必选 epoll
    worker_connections 65535;          # 每 worker 最大连接数
    multi_accept on;                   # 一次性接受所有新连接(缓解惊群)
}

理论最大并发 = worker_processes × worker_connections,反向代理场景一个请求占两个连接,实测量需减半。

第三道防线:HTTP 层 I/O 调优

http {
    ## 基础 I/O
    sendfile on;                       # 零拷贝,大幅提升静态文件传输
    tcp_nopush on;                     # 累积到最大报文再发送(配合 sendfile)
    tcp_nodelay on;                    # 禁用 Nagle 算法(低延迟优先)

    ## 长连接
    keepalive_timeout 60;              # 客户端长连接超时
    keepalive_requests 10000;          # 单连接最大请求数

    ## Gzip 压缩
    gzip on;
    gzip_comp_level 5;                 # 1(最快)~9(最慢),建议 4~5
    gzip_vary on;                      # 代理缓存识别
    gzip_min_length 1024;              # <1KB 不压缩
    gzip_types text/plain text/css text/javascript ...
    gzip_disable "msie6";

    ## 请求体限制与缓存
    client_body_buffer_size 128k;
    client_max_body_size 100m;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 8k;

    ## 静态文件缓存(防磁盘 IO 成为瓶颈)
    open_file_cache max=65535 inactive=60s;
    open_file_cache_valid 80s;
    open_file_cache_min_uses 2;

    ## 日志缓冲(防日志写入拖慢主流程)
    access_log /var/log/nginx/access.log main buffer=64k flush=5s;
}

第四道防线:Upstream 代理调优

Proxy Buffer

location / {
    proxy_buffering on;                # 开启代理缓冲
    proxy_buffer_size 8k;              # 响应头 buffer 大小
    proxy_buffers 8 64k;               # 响应体 buffer 数量和大小
    proxy_busy_buffers_size 128k;      # 发送给客户端时的最大 buffer
}

Proxy Buffer 让 Nginx 飞速接收后端响应后缓存到内存,再慢慢发给客户端,迅速释放后端线程。

超时与重试

location / {
    proxy_connect_timeout 3s;          # 内网连接超时(建议 2-5s)
    proxy_read_timeout 15s;            # 等待后端响应超时
    proxy_send_timeout 15s;            # 发送请求给后端超时

    # 失败重试(防止雪崩放大)
    proxy_next_upstream error timeout invalid_header
        http_500 http_502 http_503 http_504;
    proxy_next_upstream_tries 3;       # 限制重试次数
}

云原生(K8s)场景

Pod sysctl 调整

securityContext:
  sysctls:
  - name: net.core.somaxconn
    value: "65535"
  - name: net.ipv4.ip_local_port_range
    value: "1024 65535"

优雅停机

worker_shutdown_timeout 30s;           # 等现有请求处理完再退出

配合 K8s Deployment:

terminationGracePeriodSeconds: 45
# preStop hook 确保 Endpoint 摘除后再关进程

Ingress-Nginx ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: ingress-nginx-controller
data:
  max-worker-connections: "65535"
  keep-alive: "60"
  keep-alive-requests: "10000"
  upstream-keepalive-connections: "64"

监控

location /nginx_status {
    stub_status on;                    # 开启基本状态
    access_log off;
    allow 10.0.0.0/8;
    deny all;
}

核心指标:

  • Active connections — 当前活跃连接,持续高需排查或扩容
  • Reading / Writing / Waiting — Waiting 高说明长连接复用好,但过高就需调小 keepalive_timeout

推荐方案: Nginx VTS 模块或 nginx-prometheus-exporter 将 QPS、状态码、响应耗时接入 Prometheus + Grafana。

关联页面

页面关联点
nginx-config-pitfallsNginx 配置常见踩坑(gzip/worker 连接/文件描述符等)
nginx-security-config-guideNginx 安全加固配置
nginx-502-504-connection-reset-guide502/504/Connection Reset 排障
nginx-load-balancing-strategy-guide负载均衡策略指南
linux-kernel-tuning-guideLinux 高并发内核优化(含网络参数)