作为悲催的跨境电商,免不了每天都要和GFW做斗争。最近明显的感觉的ssh到服务器延时越来越好,随手ping一下40%以上的丢包率,使我无言以对。
ssh到服务器中,shell明显的卡顿和延时,使得工作中大部分的时间都是在等待服务器的响应,这样的工作效率我无法接受,经过相关的研究和了解,mosh作为一个不错的ssh替代方案,使用udp协议传输数据,相信会比tcp协议在应对gfw方面具有更高的存活率和可到达性。我们可以这样理解,mosh在本质上和ssh是一样的,只不过是底层协议发生了变化。想了解关于mosh的具体情况,可以直接google。
实际上我已经在公司自己的本地开发服务器ubuntu上部署了mosh,运行十分完美,没有出现特别延时和卡顿现象,由于本地开发服务器使用的是动态域名解析和网关路由的DMZ技术,以前在家里使用ssh连接开发服务器,还是会时不时的掉线。
当我打算直接的生产服务器部署mosh时,却出现了意料不到的问题。生产服务器环境为debian jessie。
安装很简单,直接apt-cache search mosh结果显示,debian的repository中已包含该软件包。那么直接apt-get install mosh.
安装完之后,使用命令mosh-server检查mosh服务端的状态。意外出现了,mosh服务端没有运行,提示我
mosh-server needs a UTF-8 native locale to run. Unfortunately, the local environment (LANG=) specifies the character set "US-ASCII", The client-supplied environment ([no charset variables]) specifies the character set "US-ASCII". LANG= LANGUAGE= LC_CTYPE="POSIX" LC_NUMERIC="POSIX" LC_TIME="POSIX" LC_COLLATE="POSIX" LC_MONETARY="POSIX" LC_MESSAGES="POSIX" LC_PAPER="POSIX" LC_NAME="POSIX" LC_ADDRESS="POSIX" LC_TELEPHONE="POSIX" LC_MEASUREMENT="POSIX" LC_IDENTIFICATION="POSIX" LC_ALL=
使用env命令打印一下服务器的环境变量设置,查看服务器的配置情况。
发现默认的有关语言的配置中,变量LANG和LANGUAGE都为空,而Debian默认的语言设置的US-ASCII,而mosh运行需要UTF8的语言包,这里mosh官方有完整的说明,为何要使用UTF8,这里不做解释。所以问题就出在服务器环境中语言的设置问题。
//由于mosh会接管ssh,所以mosh会读取ssh的相关配置,这里我们需要打开debian的sshd配置文件。
那么如何配置debian的系统环境,将语言设置为utf8呢。这里debian的官方文档有十分详细的说明。
https://wiki.debian.org/Locale#SSH_Server
第一步使用dpkg-reconfigure locales命令来配置查看系统语言包。
或是修改/etc/locale.gen文件,将en_US.UTF-8和zh_CN.UTF-8这两行的注释取消。
再使用命令locale-gen命令重新生成后语言包。
然后使用命令locale -a检查系统现在可用的语言包
C C.UTF-8 en_US.utf8 POSIX zh_CN.utf8
可以发现中英文的UTF-8语言包都有了,这样无论我们客户端环境,语言是中文还是英文都无所谓,只要是UTF-8版本就可以直接使用mosh来通信。
这里还有一个问题,由于sshd_config配置文件中,我将AcceptEnv LANG LC_*选项激活了,就使得远程的terminal客户端可以将自己的本地环境变量LANG值传递到sshd服务器,从而覆写生产服务器debian的LANG配置,如果ssh客户端和服务端的LANG值不相同,那么客户端和服务端是无法通信的,mosh就无法使用。所以,这里不建议将此选项激活,而是注释掉。而实际上debian sshd配置文件,默认该选项是禁用的。
该配置的都已经配置完了,下面使用命令mosh-server检查mosh服务端的状态。
MOSH CONNECT 60001 UGAt9iWfJD0zB37eO9MIlA [mosh-server detached, pid = 20348]
以上的命令执行结果表明,mosh服务端正常运行。
在客户端mosh到服务器,连接正常,从此再也不怕shell卡了。
这里还有一个问题,就是mosh由于在实现方式上与ssh的不同,导致了mosh界面scroll功能只能借助于快捷键上下翻页,而无法使用鼠标滚轮或是触控板。
根据mosh官方的解释,他们目前正在修复这一bug,在下一个版本的mosh中可能会解决这个问题。