nginx代理websocket 经常有奇怪的情况,遇到一个项目的nginx配置的,拷贝过去,在另外一个项目就是代理不成功,不生效,经过研究,总结下经验
1、在nginx.conf 配置文件中的 http 模块中添加一下
map $http_upgrade $connection_upgrade { default upgrade; '' close; }
2、在server模块下的 需要代理的 location 下面添加一下
location / { proxy_pass http://192.168.1.100; proxy_http_version 1.1; proxy_read_timeout 800s; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Origin ""; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
3、总结
其中第一步,测试发现部分不加这段 配置也可以正常代理websocket,建议加一下
第二步中的5、6、7行尤为最重要
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
这两行必加
Origin 这行实践中也是部分不加上也可以,但是部分不加上怎么都不行,要么显示403 要么显示 websocket 已完成 状态,并非正常的101 状态。
其他的可以按照是实际情况添加。