非阻塞I/O是Nginx默认启用的底层模式,优化关键在于避免空转、减少拷贝、匹配业务节奏、精准控资源;需用epoll(ET模式)、multi_accept on、分层调优buffer、启用sendfile与tcp_nopush/tcp_nodelay、收紧超时及ulimit。

非阻塞 I/O 本身不是“开关式配置”,而是 Nginx 默认启用的底层运行模式;性能优化的关键,在于让这个模式不被低效操作拖累——即避免空转、减少拷贝、匹配业务节奏、精准控制资源生命周期。
事件驱动必须用对机制
Linux 下默认使用 epoll,但需确认未回退到低效的 select/poll。显式声明 use epoll; 可避免某些旧版本或容器环境的自动降级。epoll 的 ET(边缘触发)模式已在 1.15.10+ 默认启用,它只在状态变化时通知一次,配合非阻塞 recv/send 能最大限度减少重复检查。若业务含大量短连接(如 API 请求),建议开启 multi_accept on;,让单次事件循环尽可能多地接受新连接,缓解瞬时并发高峰下的排队延迟。
缓冲区要按请求类型分层调优
统一设大 buffer 不仅浪费内存,还易引发碎片和落盘抖动。应区分场景配置:
- API 接口(JSON/REST):client_header_buffer_size 1k;client_body_buffer_size 8k;large_client_header_buffers 4 8k(防 JWT 或 Cookie 过长导致 400)
- 文件上传:client_body_buffer_size 提至 32k–64k,并严格匹配 client_max_body_size,避免小文件反复写 temp 目录
- 反向代理:proxy_buffer_size 至少 12k(容纳 Spring Boot/Django 响应头);proxy_buffers 8 16k(共 128k 缓冲空间);流式响应(SSE/gRPC)则设 proxy_buffering off
零拷贝与系统调用要真正生效
sendfile on 是静态小文件提效核心,但它极易被破坏:
- 只要启用了 gzip、sub_filter、add_header 等需修改响应体的模块,Nginx 就自动退回到 read()+write() 模式,失去零拷贝优势
- 务必配对启用 tcp_nopush on;(填满 TCP 报文段)和 tcp_nodelay on;(禁用 Nagle,防小包延迟)
- 高频小文件服务应关闭 access_log,并用 open_file_cache 缓存 stat()/open() 结果,例如:open_file_cache max=10000 inactive=60s; open_file_cache_valid 60s;
连接与资源生命周期必须收紧
非阻塞不等于无限容忍慢客户端。过长的空闲连接会占用事件槽位,变相降低吞吐:
- client_header_timeout 和 client_body_timeout 应设为业务可接受的最小值(如 15s / 60s),超时立即断连
- keepalive_timeout 建议设为 15–30s,兼顾复用收益与连接回收效率
- worker_connections 设为 10240 或更高,但需同步调高系统级限制:ulimit -n 65536,否则文件描述符先耗尽











