记录NgInx协议升级
客户端websocket的连接一直在报错重新连接始终找不到问题,经过一顿百度最后得出是需要配置NgInx的协议升级转换。
先看客户端的ws的请求和http的请求
http请求头
ws的请求头
这两个请求里面有一个非常重要的key:Upgrade
http的Connection:keep-alive
ws的Connection:Upgrade
ws请求头中是包含Upgrade请求头的而http没有
首先,让我们来理解一下什么是HTTP Upgrade机制。它是一种允许客户端和服务器之间通过已建立的HTTP连接来切换到不同协议(如WebSocket)的机制。当客户端希望切换到新协议时,它会发送一个特殊的请求头"Upgrade"给服务器,并在请求头"Connection"中包含“upgrade”值。
我个人理解就是当Connection请求头里包含Upgrade的时候意味着这个请求则从http转换到其他的协议了,具体可以通过Upgrade请求头查看。
NgInx作为代理是通过map $http_upgrade $connection_upgrade进行处理的
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
location / {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
首先map http_upgrade connection_upgrade 是定义了一个映射关系即http请求头中如果upgrade存在,则将变量$connection_upgrade的值“upgrade”,否则被设置为“close”。
然后在location块内部使用proxy_set_header指令将$connection_upgrade变量的值设置给Connection请求头,再将通过proxy_set_header将头upgrade的值设置源 $http_upgrade的值。为这样就可以将客户端的协议升级请求正确地转发给后端服务。