彻底解决群晖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

WinSCP 连接群晖后打开 /usr/syno/share/nginx/Portal.mustache
切记,修改前先备份,先备份,先备份,重要的事情总是要说三遍,备份是一种好习惯
在 location 部分中添加以下内容:
| 1 | proxy_set_headerUpgrade $http_upgrade; | 

重启 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 方便。
利用 Portainer 的 Exec Console 功能

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

终极大法
方案特点:彻底解决
socket已停止问题,不受网络的限制,不需要安装第三方软件,不需要设置反向代理。
更换浏览器是一种治标不治本的方法,我先描述下我遇到的现象:
- 在 Windows 台式机上,Google Chrome出了socket已停止错误,换成Microsoft Edge却是正常的;
- 在 MacOS 笔记本上,Google Chrome和Safari均正常;
上面的现象说明,群晖本身并没有问题,因为如果是群晖的问题,应该所有的浏览器都不行才对,所以问题一定是出在浏览器本身。
下面是以 Google Chrome 为例,详细描述了解决的过程,如果你只想知道结果,那就往下拉到最后吧。
- 首先想到的是 - 清除浏览数据。但是操作完成后故障依旧;
- 接着 - 重置权限。点击地址栏前的- 不安全–>- 网站设置

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

- 清除 LocalStorage。Google Chrome浏览器中用快捷键Ctrl + Shift + I打开开发者工具,找到Application

在 Storage 中包含了 Local Storage 、Session Storage 和 Cookies 

挨个清理,先清 Local Storage,选中 http://192.168.0.199:5000/ 右键 Clear,故障依旧;
接着清 Session Storage,方法跟上一步一样,故障还是依旧;
最后清 Cookies ,方法跟上一步一样,清完后需要重新登录

终于恢复正常了

比较遗憾的是没有确定到具体的键值。
参考文档
HomeAssistant设置https访问后的问题 | 老苏的blog
地址:https://laosu.tech/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
