由于添加的是上面这三句,我怀疑 1Panel 的 ssh 功能是走的 websocket 协议, nginx 反向代理 websocket 协议时,就需要添加这三句。
那么为什么是这三句呢?每一句又分别作用于什么?
第一句proxy_http_version 1.1;
是声明协议,使得下面的配置可用。
下面两句都是为了设置两个请求头,分别是Upgrade和Connection。设置好这两个,后端的 1Panel 程序才知道要建立 websocket 连接来传输数据了。
- Upgrade
标识传输协议要升级/转换,如果是要转换为 websocket协议的话,此处的值就应该是websocket
。这个请求头代表客户端希望建立 websocket 协议进行通信, 后端的程序取到头信息后会返回101状态码(协议转换),然后就会建立 websocket 通信了。 - Connection
此处 Connection 头信息取值upgrade
,这表明这次客户端请求是要求进行协议升级/转换的请求。升级成什么协议呢?配合上一个配置句,是升级成websocket
协议,这样请求就完全了。
最后一个疑问:为什么一旦用 nginx 代理了,就需要设置这些了呢?不代理的时候不是好好的么?
答:这是因为这些请求头都是逐跳标头。意思就是这些标头都只能传递一层,不能透传,是逐级传递的。
当客户端直接于 1Panel 通信时,请求头能被后端接收到,所以一切正常;但是使用了 nginx 代理后,请求头就只能到 nginx 这一层,传递不到后端,我们就需要让 nginx 把请求头传递下去,形成逐层跳传,这样后端才能成功收到客户端的请求,实现协议的升级/转换。
参考Nginx反向代理websocket。