彻底解决群晖Docker终端机socket已关闭问题

这个界面大家应该不陌生吧,当你打开 Docker 容器的 终端机 时,提示socket已停止 的错误,而且要命的是,所有容器都不能使用 终端机 了,如果你在网上搜索解决方案,基本上就 3 种:

  • 第一种简单粗暴,直接换浏览器,我也试成功过,比如 Google Chrome 出问题了,换成 Microsoft Edge 就 OK 了;如果是 MacOS,换成 Safari 也一样能解决;
  • 第二种利用反向代理实现 WebSocket 通讯;
  • 第三种是利用第三方工具;

其实这几种方法都是正确的,只是网上语焉不详,并没有对场景进行详细的描述,导致了大家没有找到适合的方法,所以认为这些方法都是扯淡。

其实遇到 socket已停止 的错误分两种情况:

  • 一种是本地(局域网)模式下出现这种错误
  • 另一种是远程(互联网)模式下出现这种错误

其他属于上面两种情况的组合,比如远程、本地都出现这种报错,又或者一端出现了另一端正常

解决方案

反向代理法

DSM 6.2.1 以下

方案特点:可以解决从外网访问群晖时出现的 socket已停止 的错误,但是对于局域网发生的 socket已停止 错误无能为力。

这个版本的群晖自带的 nginx 不支持 websocket ,Synology DSM 6 反向代理的配置修复程序项目地址:https://github.com/orobardet/dsm-reverse-proxy-websocket

title

WinSCP 连接群晖后打开 /usr/syno/share/nginx/Portal.mustache

切记,修改前先备份,先备份,先备份,重要的事情总是要说三遍,备份是一种好习惯

location 部分中添加以下内容:

1
2
3
proxy_set_headerUpgrade   $http_upgrade;
proxy_set_headerConnection "upgrade";
proxy_read_timeout 86400;

title

重启 httpd

1
sudo synoservicecfg --restart nginx

DSM 6.2.1 及以上

方案特点:不仅可以解决从外网访问群晖时出现的 socket已停止 的错误,对于局域网发生的 socket已停止 错误可能同样生效。

从 DSM 6.2.1 开始,不再需要修改 Portal.mustache 文件,如果按照上面的方法,反而可能导致错误 。

可以参考这篇文章 Synology Docker 終端機出現 Socket 已關閉(https://snippetinfo.net/mobile/media/3090)

这个方法我自己没试过,但是我的一个朋友告诉我亲测有效,下图是他微信上发我的图。

第三方工具法

方案特点:这个方案不受网络的限制。但是需要安装 Portainer ,除非你本身就在用这个软件管理 docker,不然还要多学习一款软件的使用,不如群晖自带的 Docker 方便。

利用 PortainerExec Console 功能

完全不受浏览器的影响,即便 Google Chrome 已经出了 socket已停止 的错误,透过 Portainer 也完全可以正常使用

终极大法

方案特点:彻底解决 socket已停止 问题,不受网络的限制,不需要安装第三方软件,不需要设置反向代理。

更换浏览器是一种治标不治本的方法,我先描述下我遇到的现象:

  • 在 Windows 台式机上,Google Chrome 出了 socket已停止 错误,换成 Microsoft Edge却是正常的;
  • 在 MacOS 笔记本上,Google ChromeSafari 均正常;

上面的现象说明,群晖本身并没有问题,因为如果是群晖的问题,应该所有的浏览器都不行才对,所以问题一定是出在浏览器本身。

下面是以 Google Chrome 为例,详细描述了解决的过程,如果你只想知道结果,那就往下拉到最后吧。

  1. 首先想到的是清除浏览数据。但是操作完成后故障依旧;

  2. 接着 重置权限。点击地址栏前的 不安全 –> 网站设置

清除数据 ,再 重置权限,故障依旧;

  1. 清除 LocalStorageGoogle Chrome 浏览器中用快捷键 Ctrl + Shift + I 打开 开发者工具,找到 Application

Storage 中包含了 Local StorageSession StorageCookies

挨个清理,先清 Local Storage,选中 http://192.168.0.199:5000/ 右键 Clear,故障依旧;

接着清 Session Storage,方法跟上一步一样,故障还是依旧;

最后清 Cookies ,方法跟上一步一样,清完后需要重新登录

终于恢复正常了

比较遗憾的是没有确定到具体的键值。

参考文档

HomeAssistant设置https访问后的问题 | 老苏的blog
地址:https://laosu.ml/2020/08/09/HomeAssistant%E8%AE%BE%E7%BD%AEhttps%E8%AE%BF%E9%97%AE%E9%81%87%E5%88%B0%E7%9A%84%E5%9D%91/

Synology Docker 終端機出現 Socket 已關閉 | 老洪的 IT 學習系統
地址:https://snippetinfo.net/mobile/media/3090