我正在尝试为 Web 应用程序(特别是 JupyterLab,但这个问题是通用的)编写 Nginx 反向代理配置。
Web 应用程序在多个不相交的 URL 层次结构中使用多个 WebSocket 端点。例如,
/jupyter/api/yjs/...
/jupyter/terminals/...
/jupyter/api/collaboration/room/...
- (和别的)
都是 WebSocket 端点。我写了一个临时配置,如下所示:
location /jupyter/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
client_max_body_size 0;
proxy_pass http://jupyter;
}
location ~ ^/jupyter/api/yjs/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://jupyter;
}
<repeated sections for other WebSockets endpoints>
然而,WebSockets 端点的完整列表并未记录在案。我尝试分析 nginx 和应用程序日志并推断哪些 URL 需要被代理为 WebSocket,但这显然不可靠。
有没有办法编写 nginx 配置,以便将所有传入的 WebSockets 请求代理为 WebSockets,将纯 HTTP 请求代理为纯 HTTP,而不需要在 nginx 配置中对 WebSockets 位置进行硬编码?