Skip to content

性能与容量

Nginx 参数不存在可复制到所有环境的“最优模板”。性能由 Traffic Model、TLS、Response Size、Upstream Latency、CPU、Memory、File Descriptor 和 Network 共同决定。

Worker 与 Connection

nginx
worker_processes auto;
worker_rlimit_nofile 65535;

events {
    worker_connections 4096;
}

worker_connections 是每个 Worker 可打开的 Connection 上限,不只是 Client Connection。Reverse Proxy 通常还需要 Upstream Connection,因此不能直接用:

text
worker_processes × worker_connections = 最大并发请求数

实际容量还受 RLIMIT_NOFILE、System-wide File Limit、Listen Queue、Keepalive、HTTP/2 Stream、Upstream Pool 和其他 FD 使用影响。

Buffer 与临时文件

Client Body、Proxy Response 和 Header 都可能使用独立 Buffer。Buffer 太小可能写 Temporary File,太大又会放大每 Connection Memory Consumption。

应观察 Request/Response Distribution,再调整:

  • client_body_buffer_size
  • client_max_body_size
  • proxy_buffer_size
  • proxy_buffers
  • large_client_header_buffers

不要为了“高性能”统一配置成很大的数值。超大 Cookie/Header 应先治理来源。

Timeout

Directive控制对象
client_header_timeout等待 Client Request Header
client_body_timeout两次 Client Body Read 之间
send_timeout两次向 Client Write 之间
proxy_connect_timeout建立 Upstream Connection
proxy_send_timeout两次向 Upstream Write 之间
proxy_read_timeout两次从 Upstream Read 之间

这些多数是相邻 I/O Operation 之间的 Timeout,不一定是整个 Request 的绝对 Deadline。Long Polling、SSE、WebSocket 和 Large Upload 需要独立策略。

性能测试方法

  1. 明确 Request Mix、Response Size、Keepalive、TLS、并发和目标 SLO。
  2. 分别建立 Nginx-only、Upstream-only 和 End-to-end Baseline。
  3. 同时观察 Throughput、Latency Distribution、Error Rate 与 Resource Saturation。
  4. 每次只调整少量参数,保留配置和结果。
  5. 验证过载下是否出现 Timeout、Queue、Retry Amplification 和 Tail Latency。

只看平均 QPS 无法判断生产可用性,至少同时观察 p50、p95、p99、Upstream Response Time 和 Connection State。

日志变量

nginx
log_format timing '$request_id $remote_addr "$request" $status '
                  'rt=$request_time uct=$upstream_connect_time '
                  'uht=$upstream_header_time urt=$upstream_response_time '
                  'ua=$upstream_addr us=$upstream_status';

$request_time 覆盖 Nginx 观察到的完整 Request Time,$upstream_response_time 反映 Upstream Response 时间。两者差异可辅助判断 Client Transfer、Queue、Nginx Processing 与 Upstream,但不能仅凭一个字段直接下结论。