NGINX 代理设置 ws:// 协议

NGINX 代理设置 ws:// 协议

我正在尝试设置 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,或者监听器中发生了一些应用程序错误。

相关内容