proxy_set_header Connection ""的核心目的是清空客户端传来的Connection头,防止其透传干扰Nginx与后端间的HTTP/1.1长连接复用;必须配合proxy_http_version 1.1和upstream keepalive N才能生效。

proxy_set_header 不是用来“开启”长连接的,而是用来清理、修正或补全影响长连接行为的关键请求头,确保 Nginx 与后端之间能稳定复用 TCP 连接。它本身不建立连接,但配置不当会直接导致长连接被中断。
必须清空 Connection 头
Nginx 默认以 HTTP/1.0 转发请求,并自动添加 Connection: close。即使后端支持 keep-alive,只要收到这个头,就会关闭连接。所以要启用长连接,必须显式清除它:
- 写成 proxy_set_header Connection "";(空字符串),不是 "keep-alive" 也不是 "close"
- 这表示不向后端透传任何 Connection 指令,让 HTTP/1.1 协议默认行为生效
- 若客户端带了 Connection: close,不清除就会原样转发,后端立即断连
必须搭配 proxy_http_version 1.1
HTTP/1.0 不支持长连接语义,仅靠清空 Connection 头无效:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- proxy_http_version 1.1; 是强制启用 HTTP/1.1 的关键开关
- 它让 Nginx 使用持久连接模型,并配合 upstream keepalive 生效
- 没这行,keepalive 配置形同虚设,Nginx 仍走短连接
必须配合 upstream keepalive
proxy_set_header 只管请求头,真正维护连接池的是 upstream 块:
- 在 upstream 中声明 keepalive N;(如 keepalive 32)
- 表示每个 worker 进程为该后端缓存最多 N 个空闲长连接
- proxy_pass 必须指向 upstream 名称,不能直写 IP,否则 keepalive 不生效
WebSocket 场景要反向处理
Connection 头在 WebSocket 握手时含义完全不同,不能清空:
- 必须传 Connection: upgrade 和 Upgrade: websocket
- 推荐用 map 动态设置:map $http_upgrade $connection_upgrade { default upgrade; '' close; }
- 再配 proxy_set_header Upgrade $http_upgrade; 和 proxy_set_header Connection $connection_upgrade;
- 同时关闭缓冲:proxy_buffering off;,并调大超时时间

















