[Unraid 系列 v6.10+] 3 NGINX 反向代理 UNRAID webterminal 实现刷新异常处理
说明
我发现 Nginx 反向代理 Unraid 后,每分钟 webterminal/ttyd/
都会刷新一次,此前所有有关行为和显示都将清空。
原因
后来经过 Chrome 的 DevTools 检查查看 Network
项,发现:
- 每一分钟,
webterminal/ttyd/
都会向ws
发出一次upgrade
GET 请求。返回结果为101 Switching Protocols
更新成功,并重新生成一次 token 。
但是未经 Nginx 反向代理都没有问题,可以肯定是 Nginx 代理出现问题。
然后检查 Console
项,发现一直是以下 7 行循环显示:
(index):1 [ttyd] websocket connection opened
(index):1 [ttyd] WebGL renderer enabled
(index):1 [ttyd] Leave site alert disabled
(index):1 [ttyd] option: theme=[object Object]
(index):1 [ttyd] option: fontSize=15
(index):1 [ttyd] option: fontFamily=monospace
(index):1 [ttyd] websocket connection closed with code: 1006
其中, websocket connection closed with code: 1006
引起了我的注意,确定是 WebSocket 连接关闭了,代码是 1006 。就直接到网上去搜,找到: Nginx代理WebSocket方法 。
“默认情况下,如果代理服务器在 60 秒内没有传输任何数据,连接将被关闭。可以使用
proxy_read_timeout
指令增加此超时。”
处理
既然 proxy_read_timeout
默认为 60 ,而发送心跳数据被不在 webterminal/ttyd/
源码内部,保险起见不去更改系统文件。
就单独设置为 20 分钟无数据输入再进行连接中断: proxy_read_timeout 20m;
。
示例:
server {
listen [PORT] ssl http2;
server_name [DOMAIN];
ssl on;
root html;
index index.html index.htm;
# ssl ......
location / {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://[DOMAIN]:[PORT];
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 20m;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}