使用 proxy_pass 指向本地 Unix Domain Socket(UDS)可消除网络栈开销,但需正确配置 URL 格式、权限路径、upstream keepalive 及后端适配,否则无法启用或性能归零。
直接用 proxy_pass 指向本地 Unix Domain Socket(UDS)是消除网络栈耗时最有效的方式——它绕过 TCP/IP 协议栈,数据在内核内存中直传,没有封包、解包、校验、路由等开销。但“写对”只是起点,“跑稳且高效”需要整套协同配置。
格式错误会导致启动失败或 502,不是性能问题而是根本不可用:
proxy_pass http://unix:/run/myapp.sock;(注意 http://unix: 前缀 + 绝对路径)proxy_pass unix:/run/myapp.sock;(缺 http://,报 invalid URL prefix)proxy_pass /run/myapp.sock;(被当域名处理,连不上)~、相对路径;不能加端口或 http:// 后再拼 unix:
Nginx worker 进程必须能“进目录、看文件、读写 socket”,三者缺一不可:
srw-rw----(即 660),属主可读写,属组可读写www-data)必须属于 socket 所属组,或直接是属主/run/)需有 x 权限(允许进入),/run/ 是推荐位置——tmpfs 内存文件系统,无磁盘 I/O、不被系统清理不启用 keepalive,每次请求都新建销毁 UDS 连接,低开销优势几乎归零:
upstream backend { server unix:/run/myapp.sock; keepalive 32; }
proxy_pass http://backend;(不是 unix:)proxy_http_version 1.1; 和 proxy_set_header Connection '';(清空客户端传来的 Connection: close)keepalive 32 表示每个 worker 进程最多缓存 32 个空闲连接;建议从 16 或 32 开始压测,过高易耗尽文件描述符UDS 性能释放依赖后端主动适配:
127.0.0.1:8000
--chmod-socket=660 --umask=007
After=nginx.service 控制顺序rm -f /run/myapp.sock
proxy_set_header Host $host;