使用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时,其查询参数不会被传递到上游服务器