无法通过 nginx 代理通过 WebSocket 进行连接

无法通过 nginx 代理通过 WebSocket 进行连接

我的设置包括运行于http://本地主机:9222如果我直接通过 WebSocket 客户端连接它,它就可以工作。

我想在它前面放置一个 Nginx 服务器块作为代理(稍后我将添加身份验证等)。

我的配置是:

server {
    # Logic configuration

    server_name chrome.example.eu;

    access_log /opt/chrome/access.log;
    error_log /opt/chrome/error.log;

    location / {
        proxy_pass http://127.0.0.1:9222;
        proxy_http_version 1.1;
        proxy_set_header Host $host;

        location /devtools/page/ {
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_read_timeout 86400;
        }
    }

    # Networking

    listen 80;
}

HTTP 部分运行良好。如果我打开http://chrome.mydomain.eu。但是无法建立websocket连接。

浏览器尝试连接,ws://chrome.example.eu/devtools/page/6877e641-fc1e-4196-bb55-0c3e1608af4a但服务器未升级到 WebSocket 连接。Nginx 返回 404 响应,error.log 包含一行我无法理解的内容:

*690 open()“/usr/share/nginx/html/devtools/page/6877e641-fc1e-4196-bb55-0c3e1608af4a”失败(2:没有此文件或目录),客户端:130.79.192.16,服务器:chrome.example.eu,请求:“GET /devtools/page/6877e641-fc1e-4196-bb55-0c3e1608af4a HTTP/1.1”,主机:“chrome.example.eu”

为什么 nginx 会尝试打开静态文件,因为没有try_files? 为什么 nginx 不让 Chrome 实例处理该请求(并且它在父位置块中有效)?

我觉得我缺少了一些简单的东西,但我尝试了很多小的变化都没有成功。

辅助问题:此外,当浏览器要求 ws:// 流时,我可以摆脱子位置块吗?(也就是说,自动协议升级而无需对 WebSocket URL 进行硬编码)——如果您有任何其他建议,请不要犹豫。

答案1

您是否尝试过为子位置设置 proxy_pass?据我所知,内容处理程序不会被继承。

相关内容