想用线路优化机反代大内存机,都是些自己 Docker 的小工具,emby 、miniflux 、哪吒面板之类的。
都是使用的 Nginx Proxy Manager ,原网站一切正常,用了 SSL ,反代 HTTPS 。
最后在 websockets 这里卡住了,websocket support 打开了,所有的同步加载的东西全都无法连接,哪吒面板“实时同步通断断开”,lobehub 接收完了之后再一起回复,而不是一个字一个字的往外蹦。
问 chatgpt4 说我配置正常的,GOOGLE 也查不到解决方案,麻烦大佬帮我看下配置是不是有问题。
#PROXY-START/
client_max_body_size 100M;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For '$proxy_add_x_forwarded_for';
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Sec-WebSocket-Extensions $http_sec_websocket_extensions;
proxy_set_header Sec-WebSocket-Key $http_sec_websocket_key;
proxy_set_header Sec-WebSocket-Version $http_sec_websocket_version;
proxy_cache off;
proxy_redirect off;
proxy_buffering off;

location / {
proxy_ssl_server_name on;
proxy_ssl_name example.com;
proxy_ssl_protocols TLSv1.2 TLSv1.3;
proxy_pass example.com/;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host example.com;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

location ~* .(gif|png|jpg|css|js|woff|woff2)$
{
proxy_ssl_server_name on;
proxy_ssl_name example.com;
proxy_ssl_protocols TLSv1.2 TLSv1.3;
proxy_pass example.com;
proxy_set_header Host example.com;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
expires 1h;#图片缓存浏览器过期时间
}

location /ws {
proxy_pass example.com;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header Origin $scheme://$host;
proxy_cache_bypass $http_upgrade;
}

#PROXY-END/

写的头大了,换了方式,使用 WireGuard 组网,反代内网 IP ,直接简单多了。

多半是 /ws 这个路径的锅

你核实一下,上游的路径也是/ws 吗?以及:之前看到的 proxy_set_header Connection "Upgrade";这里都是大写

刚开始没写这个路径,发现所有同步加载的全出问题,GOOGLE 不停搜,最后改成这样还是不行,实在是不知道咋改了。

“问 GPT 说是正常的”那说明你思路有问题你应该思考的是:到底错在哪了

使用原网址看了,使用的是 wss://example.com/ws ,大写改了还是不行。

#4 反复问过 GPT4 了,一直说 看不到明显的错误,代码看起来配置得很好,给我了几个可能,我挨个排查没有发现有问题,折腾几个小时都没搞定,头都搞炸了。

原网址是 wss你现在这个 server 开启 ssl 了吗?或者你让客户端改为访问 ws 试试?是客户端报错还是服务器报错啊?发一下浏览器开发者工具里原始的错误信息和服务器日志

对啊,这就是个方法问题你自己没掌握技能,啥都问 GPT ,那怎么可能每次都顺利呢?

#8 服务器日志显示的都是这种无效信息2024/01/02 03:54:29 [notice] 1206#1206: signal process started2024/01/02 04:29:23 [notice] 1264#1264: signal process started2024/01/02 04:35:12 [notice] 1274#1274: signal process started2024/01/02 04:35:30 [notice] 1284#1284: signal process started2024/01/02 04:39:27 [notice] 1294#1294: signal process started浏览器报错:WebSocket connection to 'wss://example.com/ws' failed: connect @ (索引):685 function connect() { const wsProtocol = window.location.protocol == "https:" ? "wss" : "ws" const ws = new WebSocket(wsProtocol + '://' + window.location.host + '/ws'); ws.onopen = function (evt) { canShowError = true; $.suiAlert({ title: '实时通道已建立', description: '可以实时获取最新监控数据啦', type: 'success', time: '2', position: 'top-center', }); }

#7 全都开启了 SSL ,反代 HTTP 就自动跳回了原网站,不用 HTTPS 也不安全啊,一些服务是需要登录的。

浏览器开发者工具看看 network 那个页

#11 GET /ws HTTP/1.1Host: example.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0Accept: /Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflate, brSec-WebSocket-Version: 13Origin: example.comSec-WebSocket-Extensions: permessage-deflateSec-WebSocket-Key: eATpcJD9XCDSjNBtoEDjEQ==DNT: 1Connection: keep-alive, UpgradeSec-Fetch-Dest: emptySec-Fetch-Mode: websocketSec-Fetch-Site: same-originPragma: no-cacheCache-Control: no-cacheUpgrade: websocketHTTP/1.1 502 Bad GatewayServer: openrestyDate: Tue, 02 Jan 2024 05:07:08 GMTContent-Type: text/htmlContent-Length: 154Connection: keep-aliveStrict-Transport-Security: max-age=63072000; preload

bad gateway 看起来应该是 nginx 的问题了你开启 error_log 看一下对应时刻的内容把日志级别开得更详细一点

#13 nginx proxy manager 日志2024/01/01 14:25:49 [error] 58950#58950: 339383 SSL_do_handshake() failed (SSL: error:1408F10B:SSL routines:ssl3_get_record:wrong version number) while SSL handshaking to upstream, client: 188.188.188.188, server: example.com, request: "GET / HTTP/2.0", upstream: " 172.17.0.1:8008/", host: "example.com"2024/01/01 14:25:49 [error] 58950#58950: 339383 SSL_do_handshake() failed (SSL: error:1408F10B:SSL routines:ssl3_get_record:wrong version number) while SSL handshaking to upstream, client: 188.188.188.188 server: example.com, request: "GET /favicon.ico HTTP/2.0", upstream: " 172.17.0.1:8008/favicon.ico", host: "example.com", referrer: " example.com/"这是 SSL 的问题吗

上游也是 SSL ?? upstream: " 172.17.0.1:8008/"

这两条日志跟 /ws 路径没关系。

三个 proxy_pass 搞出三种风格: proxy_pass example.com/; proxy_pass example.com; proxy_pass example.com;

之前反代 wss 遇到过类似的问题,可以看看这篇文章 nowtime.cc/news/1844.html

配置里的 upstream 是 443 和 80 端口,日志中的是 upstream 是 8008 端口。原因就藏在你认为没关系而替换的这几行。

#17 proxy_pass 这个其实是手误,原配置三个都是 HTTPS 。原网站和中转机都配置了 SSL ,原主机配置域名反代 172.17.0.1:8088 ,这是本机配置域名的反代。

这两行已经加了的,还是没用

upstream proxy102 { server localhost:9999;}server { listen 3478 ssl http2 default_server; server_name xxx.yyy.com; ssl_certificate /etc/nginx/keys/xxx.pem; ssl_certificate_key /etc/nginx/keys/xxx.key; location /wss { proxy_pass proxy102; #代理到上面的地址去 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_read_timeout 86400; proxy_send_timeout 86400; }}

是不是 upstream 写错了 172.17.0.1:8008 不能加 Slisten 8008 ssl;才能加 S

如果理解这几行的差异,就不会写出这样的失误。想解决问题先拿张纸画一下部署的逻辑结构吧,不是随便抓住一根稻草就能救命。

我的建议是,改用 lucky 反代,一开始也是用 nginx ,nginxwebui 之类的,现在用 lucky ,非常舒服,什么配置都不用写,非常强大