proxy_pass 指向 Unix Socket 时必须用绝对路径且带 http://unix: 前缀;需配 proxy_http_version 1.1 和 proxy_set_header Host $host; 才能正常使用 upstream keepalive。

proxy_pass 指向 Unix Socket 时必须用绝对路径
Unix Socket 不是网络地址,proxy_pass 后不能写相对路径或省略前缀;Nginx 启动时会直接校验 socket 文件是否存在,路径错误会导致 nginx: [emerg] invalid URL prefix in "proxy_pass" 或启动失败。
- 正确写法:
proxy_pass http://unix:/var/run/backend.sock;(注意http://前缀 +unix:协议标识 + 绝对路径) - 错误写法:
proxy_pass unix:/tmp/app.sock;(缺http://)、proxy_pass /tmp/app.sock;(格式完全非法) - socket 文件权限需让 Nginx worker 进程可读写,常见做法是把 socket 放在
/var/run/下,并由后端服务以nginx用户或同组用户创建
upstream 中配置 keepalive 必须搭配 proxy_http_version 1.1
Unix Socket 本身不支持 HTTP/1.0 的连接复用,但 Nginx 的 keepalive 指令依赖 HTTP/1.1 的长连接机制。若只配 keepalive 32 却没改协议版本,上游连接仍会按 HTTP/1.0 关闭,keepalive 形同虚设。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 必须显式设置:
proxy_http_version 1.1;(放在location或upstream块内) -
keepalive参数值不是“总连接数”,而是“每个 worker 进程维护的空闲连接池大小”,过高可能耗尽 socket 资源,建议从16或32开始压测 - 配合
proxy_set_header Connection '';清除客户端传来的Connection: close,避免干扰长连接建立
proxy_pass 使用变量时无法启用 upstream 的 keepalive
一旦 proxy_pass 的 URL 包含变量(如 proxy_pass http://$backend;),Nginx 就无法将该请求路由到预定义的 upstream 块,也就无法复用其中配置的 keepalive 连接池 —— 每次请求都会新建 TCP 连接(或 Unix Socket 连接),失去性能优势。
- 想用变量动态选后端?改用
map+upstream名称变量:proxy_pass http://$upstream_name;,其中$upstream_name是一个合法的 upstream 名(如backend_v1),这样仍能走 keepalive - Unix Socket 场景下更推荐固定 upstream 定义,避免变量解析开销和连接池失效
- 调试时可用
curl -v观察响应头中是否有Connection: keep-alive,并检查 Nginx 日志中upstream sent too big header类报错(常因 keepalive 复用旧连接导致 header 缓存污染)
Unix Socket 转发时 Host 头默认丢失,必须手动补全
当 proxy_pass 指向 Unix Socket,Nginx 默认的 proxy_set_header Host $proxy_host; 会把 $proxy_host 解析为空(因为无域名/IP),导致后端收不到 Host 头 —— 对依赖 Host 路由的框架(如 Django、Flask 的 subdomain 支持)直接 404 或路由错乱。
- 务必覆盖:
proxy_set_header Host $host;或更稳妥地写死为后端期望的值,例如proxy_set_header Host backend.local; - 同时建议补全真实客户端 IP:
proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - Unix Socket 不经过网络栈,
$remote_addr仍是客户端真实 IP,这点和 TCP 代理一致,无需额外处理
proxy_http_version 1.1 和 proxy_set_header Host 这两个看似“次要”的指令 —— 它们不报错、不阻断启动,但会让 Unix Socket + keepalive 的全部优化归零。


















