我的设置包括运行于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?据我所知,内容处理程序不会被继承。