[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;
    }
}
posted @ 2023-03-19 21:53  Yogile  阅读(424)  评论(0编辑  收藏  举报