使用nginx做websocket的反向代理在网上一找一大推,然后也按照这种方式进行了配置(其它配置忽略)
http {
map $http_upgrade $connection_upgrade {
default upgrade ;
'' close ;
}
server{
location /ws/ {
proxy_pass http://192.168.3.1:9000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
然而调试的时候得到了以下的响应
Handshake status 403 None
### closed ###
起初一直以为是后端服务器的问题,经过几番周转,最后发现还是nginx配置的问题,可以在location中添加以下的配置来解决这问题
proxy_set_header Origin '';
最终的正确配置为
http {
map $http_upgrade $connection_upgrade {
default upgrade ;
'' close ;
}
server{
location /ws/ {
proxy_pass http://192.168.3.1:9000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Origin '';
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
注意:如果proxy_pass后面没有任何URL路径信息(比如/,/xxx等),则反向代理的地址会包含location中的匹配部分,否则只会拼接匹配后的剩余路径
附件:去除查询参数
location /socket.io/ {
if ( $query_string != "" ) {
set $args "";
}
proxy_pass http://10.216.81.45:8084/a/b?Authorization=U5NGU4MDE1MzRjNTdjZTcy;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Origin '';
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
当访问地址为:/socket.io/?age=123时,其查询参数不会被传递到上游服务器