我正在尝试设置 NGINX 来代理 Web 套接字流量。我在 NGINX(端口 80)上运行一个网页,该网页具有来自端口 8080 的 MJPEG 源,并且还通过端口 8090 接收 Web 套接字流量。我可以代理 MJPEG 流,但不能代理 Web 套接字。在我的网页中,客户端 javascript 无需代理即可正常连接,使用以下行:
var conn = new WebSocket('ws://192.168.0.14:8989/ws');
为了代理这个,我尝试设置以下 NGINX 配置:
#Proxy the Web Socket Traffic
#----------------------------------------------
location /sock/ {
proxy_pass ws://localhost:8989/ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
#Proxy the MJPEG Streamer feed
#----------------------------------------------
location /mjpeg/ {
proxy_pass http://localhost:8080/;
}
然后将客户端 javascript 更改为以下内容:
var conn = new WebSocket('http://192.168.0.14/sock/');
但是当我重新启动 NGINX 时,结果如下:
nginx.service 作业失败。请参阅“systemctl status nginx.service”和“journalctl -xn”了解详情。
如果我将代理传递行更改为“proxy_passhttp://本地主机:8989/ws;” 然后 NGINX 服务成功重启,但我无法再建立 Web 套接字连接。
我还需要配置其他什么才能让 NGINX 代理到 ws:// 地址吗?如果要升级协议,http:// 是否等效?如果后者是真的,那为什么它不起作用?
我注意到这篇文章中他们在代理传递语句中使用了 ws://。但这对我来说不起作用NGINX:如何将 http(s) 流量代理到一个服务器并将 ws(s) 流量代理到另一台服务器?
答案1
没有可用的 nginx 文档提及该ws://
方案可在配置中使用。难怪 nginx 无法启动,我敢打赌它抱怨的是配置错误。
你肯定有正确的配置对于 websockets 代理。至于为什么它不起作用 - 仍有待确定,这可能是由于多种原因造成的:没有人真正监听 tcp/8989,或者监听器中发生了一些应用程序错误。