也许是我这种小白在反向代理中最常面临的问题
Nas上挂载过很多自用的站点,提供包括影音、docker管理、qB客户端之类的服务,在穿透到云端并使用Nginx进行反向代理时经常会遇到各种各样无法访问的问题:
- 在Portainer的容器中无法进入命令行,日志无法实时更新
- qB的web客户端永远无法登陆成功
- Pcs客户端无法打开
- 各种依赖websocket的服务
首先找到问题所在都很玄学,因为除非是非常具体的问题,否则连百度谷歌都找不到一点痕迹。
比如qB的web客户端无法登陆,百度到的都是什么忘记密码、密码错误之类的模糊问答,很难翻到正确的解决方案。
解决方案
最开始发现问题所在是因为Portainer的命令行问题,也可能是因为问题足够具体,我直接在Portainer的github issue page中发现了答案:Unable to console into containers · Issue #1887 · portainer/portainer (github.com)

按照提示在Nginx配置参数里加入proxy_set_header属性后,成功解决问题。
WebSockets应用程序会在客户端和服务器之间建立一个长连接,使得开发实时应用很容易。HTTP的Upgrade协议头机制用于将连接从HTTP连接升级到WebSocket连接,Upgrade机制使用了Upgrade协议头和Connection协议头。反向代理服务器在支持WebSocket协议方面面临着一些挑战。挑战之一是WebSocket是一个逐段转发(hop-by-hop)协议,因此当代理服务器拦截到来自客户端的Upgrade请求时,代理服务器需要将自己的Upgrade请求发送给后端服务器,包括适合的请求头。而且,由于WebSocket连接是长连接,与传统的HTTP端连接截然不同,故反向代理服务器还需要允许这些连接处于打开(Open)状态,而不能因为其空闲就关闭了连接。