优化Nginx请求处理时间需聚焦连接建立、DNS解析、请求路径精简和系统资源调度四大瓶颈:启用keepalive复用TCP连接,配置resolver缓存DNS,关闭非必要日志,合理设置worker进程与内核参数。

优化 Nginx 处理请求到达服务器的时间损耗,关键在于缩短从客户端发起请求到 Nginx 完成接收、解析并转发的整个链路耗时。这不是单纯调高并发数,而是聚焦连接建立、协议处理、DNS 解析和内核交互等真实瓶颈点。
减少 TCP 连接建立开销
每次新建 TCP 连接都需三次握手,高频短连接会显著拉高首字节时间(TTFB)。启用 keepalive 并合理配置参数可复用连接:
- 在 upstream 块中设置 keepalive 32;(建议值 32–100),避免频繁建连
- 客户端侧保持长连接:keepalive_timeout 75;(略大于后端 connectionTimeout)
- 强制使用 HTTP/1.1:proxy_http_version 1.1; 并清空 Connection 头:proxy_set_header Connection "";
加速 DNS 回源解析
若 Nginx 作为反向代理需动态解析上游域名(如 CDN 回源),默认系统解析器无缓存、阻塞式查询极易拖慢请求起点:
- 显式配置 resolver 8.8.8.8 114.114.114.114 valid=30s;,启用 DNS 结果缓存
- 搭配 resolver_timeout 3s; 防止超时等待过久
- upstream 必须用命名 server(如
server origin.example.com;),再配合 keepalive,才能复用已解析 IP 和 TCP 连接 - 禁用变量式 proxy_pass(如
proxy_pass http://$host;),否则每次请求都触发新解析
精简请求处理路径
Nginx 的配置越靠近请求入口,执行越早;冗余指令或日志写入会增加延迟:
- 关闭非必要日志:在 location 级别设 access_log off;,尤其对静态资源或健康检查路径
- 避免在 stream 或 http 模块中混用 log_format / access_log,防止磁盘 I/O 干扰连接建立
- 简化 rewrite 和 if 判断逻辑,优先用 map 指令做条件映射,性能更稳定
- 静态资源直接由 Nginx 服务,不经过 proxy_pass:用 location ~* \.(js|css|png)$ { expires 7d; }
匹配系统级资源调度
连接抵达后能否被及时响应,取决于 worker 进程是否就绪、文件描述符是否充足、CPU 是否争抢:
- worker_processes 设为 CPU 物理核心数,启用 worker_cpu_affinity auto; 自动绑定
- 提升单进程能力:worker_rlimit_nofile 200000;,并同步调整系统 limits.conf 中 nofile 值
- events 块中启用 multi_accept on;,允许单次事件循环接受多个新连接
- 对长耗时后端(如报表导出),用 least_conn 负载算法 + 主动健康检查,避免请求发到已卡住的节点


















