Nginx进程模型与Worker配置
Nginx采用Master-Worker多进程架构:Master进程管理配置加载与Worker启停,Worker进程处理实际请求。Worker数量配置直接决定并发处理能力。auto模式让Nginx自动检测CPU核心数并创建等量Worker:
worker_processes auto;
auto模式在大多数场景下是正确选择。每个Worker进程单线程事件循环(epoll/kqueue),Worker数量等于CPU核心数可避免上下文切换开销。CPU超线程场景下auto可能创建过多Worker,可通过worker_cpu_affinity手动绑定核心。
Worker连接数配置决定单个Worker可同时处理的连接上限:
worker_connections 65536;
总并发连接数 = worker_processes x worker_connections。4核8G服务器配置4×65536=262144并发连接。实际可用连接数受系统fd限制约束,需配合内核参数fs.file-max和ulimit调整。
事件模型优化:epoll配置与连接处理
Linux环境下Nginx默认使用epoll事件模型,关键参数:
events {
use epoll;
worker_connections 65536;
multi_accept on;
accept_mutex off;
}
multi_accept on允许Worker一次调用accept接收多个新连接,减少系统调用次数,高并发短连接场景效果明显。accept_mutex控制Worker间获取新连接的互斥:Nginx 1.11.3后默认关闭,多Worker同时监听同一端口,内核将连接均匀分配。开启accept_mutex在高并发下增加锁竞争延迟,不建议。
SO_REUSEPORT方案在Nginx 1.9.1+支持:
http {
listen 80 reuseport;
}
reuseport让每个Worker拥有独立监听socket,内核层面做连接分发,彻底消除锁竞争。压测数据显示reuseport在高QPS场景下P99延迟降低30%-50%。
长连接与Keepalive配置
HTTP Keepalive减少TCP连接建立开销,对代理场景尤为关键。客户端侧Keepalive:
http {
keepalive_timeout 65s;
keepalive_requests 10000;
}
keepalive_timeout控制空闲长连接保持时长,65秒适合浏览器场景。API网关场景可缩短至30秒释放资源。keepalive_requests限制单条长连接最大请求数,防止连接长期占用累积内存泄漏,10000次对多数场景足够。
上游(Upstream)Keepalive是性能调优的重点。默认配置下Nginx与后端每请求建一条连接再关闭,高QPS下产生大量TIME_WAIT。开启上游Keepalive后Nginx与后端保持连接池:
upstream backend {
server 10.0.0.1:8080;
server 10.0.0.2:8080;
keepalive 32;
}
server {
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
keepalive 32表示对每个Worker维持32条空闲长连接。proxy_http_version 1.1和proxy_set_header Connection空字符串是必须配置:HTTP/1.1默认长连接,清空Connection头部避免传递close指令。缺少这两个配置则上游Keepalive不生效。
代理缓冲区与传输优化
Nginx作为反向代理时,缓冲区配置影响响应速度与内存占用:
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
缓冲机制:Nginx先从后端读取响应存入缓冲区,缓冲区满后写入临时文件,同时向客户端发送已缓冲内容。小响应在缓冲区内完成零拷贝发送,大响应流式传输避免内存溢出。
大文件传输或流式API(SSE/WebSocket)场景需关闭缓冲:
proxy_buffering off;
proxy_request_buffering off;
proxy_buffering off让Nginx逐字节转发后端响应,不缓存直接流式传输,适用于视频流、大文件下载。proxy_request_buffering off关闭请求体缓冲,客户端请求体直接流式转发后端,适合大文件上传。
超时参数精细调优
超时配置直接关系连接释放与资源回收:
client_header_timeout 15s;
client_body_timeout 30s;
send_timeout 30s;
proxy_connect_timeout 5s;
proxy_read_timeout 60s;
proxy_send_timeout 30s;
proxy_connect_timeout建议5秒内,后端不可用时快速失败触发upstream重试。proxy_read_timeout按后端业务最长响应时间设置,普通API 60秒足够,长时间轮询或SSE场景需调整至120-300秒。
日志与性能监控配置
高并发场景下访问日志I/O成为瓶颈,按需调整:
access_log off;
更灵活的方案是条件日志,只记录异常请求:
map $status $loggable {
~^[23] 0;
default 1;
}
access_log /var/log/nginx/access.log combined if=$loggable;
性能监控通过stub_status模块获取实时连接数据:
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
返回的Active connections、accepts/handled/requests、Reading/Writing/Waiting指标配合Prometheus nginx_exporter采集,可建立连接数、请求率、等待队列深度的监控面板和告警规则。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/nginx-gao-bing-fa-pei-zhi-diao-you-worker-jin-cheng-mo-xing/