开启 tcp_nodelay 能有效减少小包延迟,特别适合 WebSocket、长连接 API 等交互式场景;它禁用 Nagle 算法,使每个 write() 数据立即发送,需配合 keepalive 和 HTTP/1.1 长连接使用。

开启 tcp_nodelay 能有效减少小包延迟,特别适合 WebSocket、长连接 API、实时通知等交互式场景——它禁用 Nagle 算法,让小数据包不等待合并,立即发出。
tcp_nodelay 的作用机制
Nagle 算法默认启用,会将小于 MSS 的多个小 TCP 包缓存,等收到前一个包的 ACK 或积累够一整包再发,以提升带宽利用率。但对低延迟要求高的交互请求(如用户按键响应、消息推送),这种攒包行为会造成 20–200ms 的额外延迟。tcp_nodelay on 直接关闭该算法,确保每个 write() 调用的数据立即封装发送。
在 Nginx 中正确启用
该指令仅在 http 块或其子块(server、location)中生效,且只对启用了 keepalive 的连接起作用:
- 确保已配置
keepalive_timeout(如keepalive_timeout 65;),否则连接很快关闭,tcp_nodelay不生效 - 在
http块中全局启用:tcp_nodelay on; - 若只需特定接口启用,可放在
location块内,例如实时消息端点:location /api/v1/ws {<br> tcp_nodelay on;<br> proxy_pass http://backend;<br> proxy_http_version 1.1;<br> proxy_set_header Upgrade $http_upgrade;<br> proxy_set_header Connection "upgrade";<br>}
搭配使用的关键配置
tcp_nodelay 单独开启效果有限,需配合以下设置才能真正降低端到端延迟:
-
启用 HTTP/1.1 长连接:后端代理时设
proxy_http_version 1.1和proxy_set_header Connection ""(清空 Connection 头,避免被中间设备断连) -
调优 keepalive 参数:如
keepalive_requests 1000;(单连接最大请求数)、keepalive_timeout 65s;(连接空闲超时) -
后端也要支持快速响应:若上游应用本身有写缓冲或同步阻塞逻辑,Nginx 层的
tcp_nodelay无法绕过这些延迟
是否需要关闭 sendfile?
当同时启用 sendfile on(用于高效静态文件传输)和 tcp_nodelay on 时,Nginx 会自动在 sendfile 场景下忽略 tcp_nodelay(因 sendfile 绕过用户态,Nagle 控制权交由内核)。所以无需手动关 sendfile —— 它与交互式动态请求天然隔离。静态资源走 sendfile,API/WebSocket 流量走普通 proxy_pass + tcp_nodelay,二者互不影响。










