作为悲催的跨境电商,免不了每天都要和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中可能会解决这个问题。