Nginx 通过 proxy_pass 代理到 Unix 域套接字(UDS)可提升性能与安全性,配置需用 http://unix:/绝对路径,注意权限、路径规范及 502 错误排查,支持 upstream 负载与健康检查。

在 Nginx 中使用 proxy_pass 代理到 Unix 域套接字(Unix Domain Socket,UDS),是一种高效、安全且低开销的进程间通信方式,特别适合本地服务(如 Gunicorn、uWSGI、Node.js 应用)与 Nginx 之间的通信。
为什么用 Unix 域套接字而不是 localhost:端口?
Unix 域套接字绕过 TCP/IP 协议栈,减少系统调用和上下文切换,性能略高;同时不暴露端口,提升安全性;还能避免端口冲突和防火墙干扰。适用于 Nginx 与后端服务同机部署的典型场景。
基础配置语法:proxy_pass 指向 socket 文件
Nginx 1.3.13+ 支持直接将 proxy_pass 指向 unix:/path/to/socket。注意路径必须是绝对路径,且 Nginx 工作进程需有读写权限。
示例配置:
location / {
proxy_pass http://unix:/var/run/myapp.sock;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
⚠️ 关键点:
- 协议前缀必须是
http://unix:(不能省略http://) - socket 路径不能包含空格或特殊字符;建议用
/var/run/或/tmp/下的规范路径 - Nginx 主进程和 worker 进程需对 socket 文件及其父目录有执行(
x)权限,对 socket 文件本身有读写(rw)权限
常见权限与调试问题
配置后返回 502 Bad Gateway,大概率是权限或路径问题:
- 检查 socket 文件是否存在:
ls -l /var/run/myapp.sock - 确认 Nginx worker 用户(如
www-data或nginx)能否访问该文件及上级目录:sudo -u www-data ls -l /var/run/myapp.sock - 确保 socket 所在目录(如
/var/run)对 Nginx 用户可进入(即目录有x权限) - 若应用启动晚于 Nginx,socket 文件可能尚未创建 —— 可配合 systemd 的
After=nginx.service或使用 socket 激活机制
进阶:配合 upstream 实现负载与健康检查
虽然单个 UDS 通常对应一个本地服务,但你仍可用 upstream 块封装,便于未来扩展或添加重试逻辑:
upstream backend {
server unix:/var/run/app1.sock max_fails=2 fail_timeout=10s;
# 可再加其他 socket 或 TCP server(混合模式)
# server unix:/var/run/app2.sock backup;
}
<p>server {
location / {
proxy_pass <a href="https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e">https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e</a>;
proxy_next_upstream error timeout http_500 http_502;
}
}
注意:max_fails 和 fail_timeout 对 UDS 同样生效,Nginx 会尝试连接 socket 文件并检测是否可写,失败后按策略切换或重试。










