nginx学习资料整理一
一、安装运行
1.1、安装环境支撑
1、gcc 环境,一般情况linux 系统自带该环境,也可自行下载安装使用新版本;
2、pcre 环境,一般需自行安装,其是一个perl库,包含正则表达式等功能,http模块使用pcre来解析正则表达式配置的URI匹配规则;
3、zlib环境,一般需要自行安装,免费的无损数据压缩库;nginx 使用 zlib 对 http 包的内容进行 gzip 压缩;
4、openssl环境,一般需要自行安装,安全套接字层密码库,用于支持ssl与https协议;
1.2、环境安装
1、gcc环境检测
目前使用centos 系统,装在virtualBox中,可使用命令检测是否安装gcc环境,如下:
命令:gcc -v
若未安装,请自行百度安装
2、安装pcre环境
a、下载pcre 包,目前使用是 pcre-8.13.tar.gz
a、解压包到指定目录
命令: tar -zxvf pcre-8.13.tar.gz
b、配置pcre ,先进入解压后的目录,再执行以下命令
命令: ./configure --prefix=安装目录
c、编译pcre 包,在解压后的目录下,执行
命令:make
d、安装pcre环境 ,在解压后的目录下,执行
命令:make install
e、验证pcre环境,安装是否成功
命令: ./pcre-config --version
3、安装zlib库
下载zlib包,官网:http://www.zlib.net/ ,目前使用 zlib-1.2.11.tar.gz
3、解压包到指定目录
命令: tar -zxvf zlib-1.2.11.tar.gz
c、配置zlib,并指定utf-8编码,先进入解压后的目录,再执行以下命令
命令: ./configure --prefix=安装目录
d、编译zlib包,在解压后的目录下,执行
命令:make
e、安装zlib环境 ,在解压后的目录下,执行
命令:make install
4、安装openssl 环境
a、下载openssl 包,官网:https://www.openssl.org/source/ ,目前使用 openssl-1.0.2j.tar.gz
解压包到指定目录
命令: tar -zxvf openssl-1.0.2j.tar.gz
c、配置openssl,先进入解压后的目录,再执行以下命令
命令: ./config --prefix=安装目录
d、编译openssl包,在解压后的目录下,执行
命令:make
e、安装openssl环境 ,在解压后的目录下,执行
命令:make install
1.3、安装nginx
1、下载nginx安装包,https://nginx.org/download/ ,目前使用nginx-1.9.9.tar.gz
2、解压包到指定目录
命令: tar -zxvf nginx-1.9.9.tar.gz
3、配置nginx,先进入解压后的目录,再执行以下命令
./configure --prefix=/opt/nginx/install/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-pcre=/opt/pcre/pcre-8.13 --with-openssl=/opt/openssl/openssl-1.0.2j --with-zlib=/opt/zlib/zlib-1.2.11
注:--prefix=安装目录
--with-pcre=安装的pcre目录
--with-openssl=安装的openssl目录
--with-zlib=安装的zlib目录
--with-http_ssl_module : 使用https协议模块。默认情况下,该模块没有被构建。前提是openssl与openssl-devel已安装
--with-http_stub_status_module : 用来监控 Nginx 的当前状态
--with-http_realip_module : 通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如X-Real-IP 或 X-Forwarded-For),意义在于能够使得后台服务器记录原始客户端的IP地址
--add-module=PATH : 添加第三方外部模块,如nginx-sticky-module-ng或缓存模块。每次添加新的模块都要重新编译(Tengine可以在新加入module时无需重新编译)
--with-http_gzip_static_module:gzip 压缩相关
4、编译nginx包,在解压后的目录下,执行
命令:make
5、安装nginx环境 ,在解压后的目录下,执行
命令:make install
6、验证安装是否成功,进入配置的安装路径,执行以下命令:
注:syntax is ok ,test is successful 表示安装成功
1.4、运行nginx
1、启动nginx,命令:./sbin/nginx ,如下:
2、访问首页,如下:
1.5、虚拟机相关设置
查看访火墙的状态: systemctl status firewalld
启动访火墙:systemctl start firewalld
启用访火墙区域端口和协议组合:firewall-cmd --zone=public --add-port=8080/tcp --permanent
插入访火墙接入访问ip表端口:/sbin/iptables -I INPUT -p tcp --dport 8088 -j ACCEPT
nohup java -jar upstream-0.0.1-SNAPSHOT.jar --server.port=8888 >/dev/null 2>&1 &
二、nginx基本情况
2.1、基本命令
启动 ./sbin/nginx
停止 ./sbin/nginx -s stop
重启 ./sbin/nginx -s reload
查看进程 ps -ef|grep nginx
2.2、目录结构
./nginx 安装目录:
./conf 配置文件目录:
./sbin 命令bin目录:
./html 默认web目录:
./logs 日志文件目录:
2.3、默认配置
./nginx/conf/nginx.conf 文件:
1、配置nginx 开机启动,以centos 为例:
a、切换到/usr/lib/systemd/system/目录,创建nginx.service文件
vi nginx.service
b、写入以下文件,注意修改目录
[Unit] Description=nginx After=network.target
[Service]
Type=forking
ExecStart=/opt/nginx/install/nginx/sbin/nginx
ExecReload=/opt/nginx/install/nginx/sbin/nginx -s reload
ExecStop=/opt/nginx/install/nginx/sbin/nginx quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
c、设为开机启动
systemctl enable nginx.service
d、查看状态
systemctl status nginx.service
重启机器自动运行后的状态:
注:nginx 启动后分为master进程与worker进程,worker进程处理对外请求,master不处理对外请求,管理worker进程
三、nginx 配置
3.1、全局配置
1、user 配置,用于指定nginx worker进程的用户、用户组,可对nginx 进程权限控制
如:user root root ,指定root 用户,root 用户组运行
2、worker_processes 配置,用于指定nginx进程数,默认为1
如:worker_processes 2;
3、pid 配置,用于指定进程id存储文件
如:pid logs/nginx.pid;
4、error_log 配置,用于指定全局模块错误日志
语法:error_log file [ debug | info | notice | warn | error | crit ]
如:error_log logs/error.log info;
5、include配置,用于指定需包含的配置文件
如:include vhosts/*.conf;
6、其他全局配置,请参考官方文档
https://www.nginx.cn/doc/core/mainmodule.html
3.2、events 模块
配置nginx服务器与用户的网络连接参数,主要是配置每个进程的最大连接数,使用哪种事件驱动模型处理请求;是否允许同时接受多个网路连接,开启多个网络连接序列化等。
示例:
events { accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport worker_connections 1024; # 最大连接数 client_header_buffer_size 4k; open_file_cache max=2000 inactive=60s; open_file_cache_valid 60s; open_file_cache_min_uses 1 }
1、accept_mutex 配置,设置网路连接序列化,防止惊群现象发生,默认为on
2、multi_accept 配置,设置一个进程是否同时接受多个网络连接,默认为off
3、worker_connections配置,配置一个进程的最大连接数,默认与系统有关,一般为1024,最大不能超过系统连接数,
如:worker_connections 1024,
客户端最大连接数(理论值):worker_processes * worker_connections
反向代理后最大连接数:worker_processes * worker_connections/4
4、worker_rlimit_nofile配置,指定一个nginx进程最多打开文件数,配置成与linux内核数一致,可使用ulimit -n 查看系统数;
如:worker_rlimit_nofile:65536
5、事件驱动模型配置,Nginx服务器提供了多个事件驱动器模型来处理网络消息。其支持的类型有:select、poll、kqueue、epoll、rtsing、/dev/poll以及eventport。
* select:只能在Windows下使用,这个事件模型不建议在高负载的系统使用
* poll:Nginx默认首选,但不是在所有系统下都可用
* kqueue:这种方式在FreeBSD 4.1+, OpenBSD2.9+, NetBSD 2.0, 和 MacOS X系统中是最高效的
* epoll: 这种方式是在Linux 2.6+内核中最高效的方式
* rtsig:实时信号,可用在Linux 2.2.19的内核中,但不适用在高流量的系统中
* /dev/poll: Solaris 7 11/99+,HP/UX 11.22+, IRIX 6.5.15+, and Tru64 UNIX 5.1A+操作系统最高效的方式
* eventport: Solaris 10最高效的方式
注:若未配置该项,nginx则会选择适合系统的配置,一般poll ,但在linux 高版本中建议选择epoll ;
6、其他相关配置,请参考官方文档
https://www.nginx.cn/doc/core/events.html
3.3、HTTP 模块
可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
3.3.1、http core 核心模块
1、default_type 配置,设置默认类型,默认值为text/plain
如:default_type application/octet-stream;
2、sendfile配置,指定是否使用sendfile系统调用来传输文件,默认为off。sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝。
如:sendfile on;
3、keepalive_timeout配置,连接超时时间,默认值为75 ,
如:keepalive_timeout 75s ;
4、tcp_nopush配置,使用sendfile 时,设置tcp_nopush 用于解决阻塞,与tcp_nodelay互斥;
如:tcp_nopush on ;
5、其他相关配置 (来源于网上)
include mime.types; #主模块指令,实现对配置文件所包含的文件设定,可以减少主配置文件的复杂度,类似apache中的include方法。
default_type application/octet-stream; #属于http核心模块指令,这里默认类型为二进制流,也就是当文件类型未定义是使用这种方式,例如在没有配置php环境时,nginx是不予解析的,此时,用浏览器访问php文件就会出现下载窗口
charset utf-8; #默认编码
server_names_hash_bucket_size 128; #服务器名字的hash表大小
proxy_headers_hash_max_size 51200; #设置头部哈希表的最大值,不能小于你后端服务器设置的头部总数
proxy_headers_hash_bucket_size 6400; #设置头部哈希表大小
client_header_buffer_size 32k; #用于指定来自客户端请求头headerbuffer大小,对于大多数请求,1KB的缓冲区大小已经足够,如果自定义了消息头或有更大的cookie,可以增加缓冲区大小。这里设置为32KB
large_client_header_buffers 4 128k; #用来指定客户端请求中较大的消息头的缓存最大数量和大小,“4”为个数,“128”为大小,最大缓存为4个128KB。
sendfile on; #开启高效文件传输模式,将tcp_nopush和tcp_nodely两个指令设置为on,用于防止网络阻塞。
autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on; #防止网络阻塞
tcp_nodelay on; #防止网络阻塞
keepalive_timeout 120; #用于设置客户端连接保持活动的超时时间,在超过这个时间之后服务器会关闭该链接。
client_header_timeout 3m; #用于设置客户端请求读取超时时间,如果超过这个时间,客户端没有发送任何数据,nginx将返回“request time out (408)”错误。
client_body_timeout 3m; #用于设置客户端请求主体读取超时时间,默认值为60.如果超过这个时间,客户端还没有发送任何数据,nginx将返回“Request time out(408)”
server_tokens off; #修改或隐藏Nginx的版本号
client_body_buffer_size 256k; # 缓冲区代理缓冲用户端请求的最大字节数
send_timeout 3m; #服务器超时设置
#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
fastcgi_connect_timeout 300; #指定连接到后端fastCGI的超时时间
fastcgi_send_timeout 300; #向fastCGI请求的超时时间,这个值是指已经完成两次握手后向fastCGI传送的超时时间
fastcgi_read_timeout 300; #接收fastCGI应答的超时时间,这个值已经完成两次握手后接收fastCGI应答的超时时间
fastcgi_buffer_size 64k; #指定读取fastCGI应答第一部分需要用多大的缓冲区,一般第一部分应答不会超过1k,一般设置为64k
fastcgi_buffers 4 64k; #指定本地需要用多少和多大的缓冲区来缓冲fastCGI的应答
fastcgi_busy_buffers_size 128k; #默认值是fastcgi_buffers的两倍
fastcgi_temp_file_write_size 128k; #在写入fastcgi_temp_path是用多大的数据块,默认值是fastcgi_buffers两倍
#gzip模块设置
gzip on; #开启 #gzip压缩输出
gzip_min_length 1k; #用于设置允许压缩的页面最小字节数,页面字节数从header头的content-length中获取,默认值是0,
不管页面多大都进行压缩,建议设置成大于1k的字节数,小于1k可能会越压越大最小压缩文件大小
gzip_buffers 4 16k; #表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级
gzip_types text/plain application/x-javascript text/css application/xml;
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_vary on; #选项可让前端的缓存服务器缓存经过gzip压缩的页面,例如,用squid缓存经过nginx压缩的数据。
limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用
6、参考官网
https://www.nginx.cn/doc/standard/httpcore.html
3.4、日志配置
1、log_format 配置,用于指定nginx输出日志格式
语法: log_format name format [format ...]
如:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
参数 |
说明 |
示例 |
$remote_addr |
客户端地址 |
219.227.111.255 |
$remote_user |
客户端用户名称 |
— |
$time_local |
访问时间和时区 |
18/Jul/2014:17:00:01 +0800 |
$request |
请求的URI和HTTP协议 |
“GET /article-10000.html HTTP/1.1” |
$http_host |
请求地址,即浏览器中你输入的地址(IP或域名) |
www.ha97.com |
198.98.120.87 |
||
$status |
HTTP请求状态 |
200 |
$upstream_status |
upstream状态 |
200 |
$body_bytes_sent |
发送给客户端文件内容大小 |
1547 |
$http_referer |
url跳转来源 |
https://www.google.com/ |
$http_user_agent |
用户终端浏览器等信息 |
“Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C; |
$ssl_protocol |
SSL协议版本 |
TLSv1 |
$ssl_cipher |
交换数据中的算法 |
RC4-SHA |
$upstream_addr |
后台upstream的地址,即真正提供服务的主机地址 |
10.36.10.80:80 |
$request_time |
整个请求的总时间 |
0.165 |
$upstream_response_time |
请求过程中,upstream响应时间 |
0.002 |
2、access_log配置,指令日志文件存放路径 ,
如:access_log logs/access.log main;
3.5、server 配置模块
配置虚拟主机的相关参数,一个http中可以有多个server。
#虚拟主机的配置
server { #listen指定虚拟主机服务器端口 Listen 80; #server_name用来指定ip地址或者域名,多个域名之间用空格分开 server_name www.ha97.com ha97.com; #index用于设定访问的默认首页地址 Index index.html index.htm index.php; #root指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以使绝对路径 root /data/www/ha97; #charser用于设置网页的默认编码格式 Charest gb2312; #access_log用来指定此虚拟机的访问日志存放路径 access_log /data/logs/nginx/goods.access.log; #error_log 用来指定此虚拟机的错误日志存放路径 error_log /data/logs/nginx/goods.error.log; #配置请求的路由,以及各种页面的处理情况。 location / { root html; index index.html index.htm; }
}
3.6、upstream 配置模块
用于负载均衡配置
upstream demo.com { least_conn; #调度算法 server 192.168.137.3:8888; server 192.168.137.3:8881; server 192.168.137.3:8881 backup; }
nginx的负载均衡支持4种调度算法:
轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统自动剔除,使用户访问不受影响,
weight 指定轮询权值,weight值越大,分配到的访问几率越高,主要用于后端每个服务器性能不均的情况下
ip_hash 每个请求按访问ip的hash结果分配,这样来自同一个ip的访客固定访问一个后端服务器,有效解决动态网页
存在的session共享问题
fair 比上面连个更加智能的算法,此种算法可以依据页面大小和加载时间长短智能的进行负载均衡,也就是根据后端服务器的
响应时间来分配请求,响应时间短的优先分配,nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载nginx的upstream_fair模块
url_hash 此方法按访问的url的hash结果来分配请求,是每个url定向到同一个后端服务器,可以进一步提高后端缓存
服务器的效率,nginx本身是不支持url_hash,如果需要使用这种调度算法,必须安装nginx的hash软件包
在http upstream模块中,可以通过server指令指定后端服务器的ip地址和端口,同时还可以设定每个后端服务器在
负载均衡调度中的状态,常用的几种状态有:
down 表示当前的server暂时不参与负载均衡
backup 预留的备份机器,当其他所有的非backup机器出现故障或者忙的时候才会请求backup机器,因此这台机器的压力最轻
max_fails 允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误
fail_timeout 在经历了max_fails此失败后,暂停服务的时间,max_fails可以和fail_timeout一起使用
3.7、location 区段
用于反向代理不同服务器,参考官网:
https://www.nginx.cn/doc/standard/httpproxy.html
基本语法如下:location [=|~|~*|^~|@] pattern{……}
示例:
location / { proxy_pass http://localhost:8000; proxy_set_header X-Real-IP $remote_addr; }
1、相关解析:
location / { proxy_pass http://127.0.0.1:88; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #以下是一些反向代理的配置,可选。 proxy_set_header Host $host; client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数, proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时) proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小 (proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 }
2、优先级
1:带有“=“的精确匹配优先
2:没有修饰符的精确匹配
3:正则表达式按照他们在配置文件中定义的顺序
4:带有“^~”修饰符的,开头匹配
5:带有“~” 或“~*” 修饰符的,如果正则表达式与URI匹配
6:没有修饰符的,如果指定字符串与URI开头匹配
nginx学习资料整理一的更多相关文章
- iOS 开发学习资料整理(持续更新)
“如果说我看得比别人远些,那是因为我站在巨人们的肩膀上.” ---牛顿 iOS及Mac开源项目和学习资料[超级全面] http://www.kancloud.cn/digest/ios-mac ...
- iOS 学习资料整理
iOS学习资料整理 https://github.com/NunchakusHuang/trip-to-iOS 很好的个人博客 http://www.cnblogs.com/ygm900/ 开发笔记 ...
- Java 学习资料整理
Java 学习资料整理 Java 精品学习视频教程下载汇总 Java视频教程 孙鑫Java无难事 (全12CD) Java视频教程 即学即会java 上海交大 Java初级编程基础 共25讲下载 av ...
- nginx 学习资料
nginx 学习资料 table th:first-of-type { width: 90px; } table th:nth-of-type(2) { } table th:nth-of-type( ...
- F4NNIU 的 Docker 学习资料整理
F4NNIU 的 Docker 学习资料整理 Docker 介绍 以下来自 Wikipedia Docker是一个开放源代码软件项目,让应用程序部署在软件货柜下的工作可以自动化进行,借此在Linux操 ...
- Git学习资料整理
Git作为一个优秀的版本控制系统,是我们开发人员必须要学会使用的一个工具,接触git一年多以来,也看了不少相关资料,今天把我所看过的一些学习资源整理一下. Git入门当然首推廖雪峰廖老师的教程:Git ...
- NLP | 算法 学习资料整理
UPDATE TIME: 2019-12-12 17:06:32 NLP: 对话系统: [ ] https://www.cnblogs.com/jiangxinyang/p/10789512.html ...
- DBN 入门学习资料整理
建议按序阅读 1.Deep Learning 概述 Deep Learning(深度学习)学习笔记整理系列 : http://blog.csdn.net/zouxy09/article/details ...
- JAVA学习资料整理
今天偶然间发现之前一个群里发过的一篇关于JAVA学习资料的东西.本着服务大众的精神,搬来了博客园: <JAVA编程思想>第四版(英文原版) 下载地址:http://115.com/file ...
随机推荐
- 题目分享R
题意:有n只蚂蚁在木棍上爬行,每只蚂蚁的速度都是每秒1单位长度,现在给你所有蚂蚁初始的位置(蚂蚁运动方向未定),蚂蚁相遇会掉头反向运动,让你求出所有蚂蚁都·掉下木棍的最短时间和最长时间. 分析:(其实 ...
- 组队训练 K K - The Stream of Corning 2
K - The Stream of Corning 2 这个题目不是很难,因为给你的这个S是单调递增的,所以就用优先队列+权值线段树就可以很快的解决了. 这个+读入挂可以优化,不过不用也没关系. #i ...
- spring的aop的注解配置
一.使用注解的方式配置后置通知 第一步,创建通知类LogAdvice 第二步,要在spring主配置文件中声明以注解的方式配置spring aop 第三步,测试 二.其他异常配置 package c ...
- 软路由OpenWrt(LEDE)2020.4.6编译 UnPnP+NAS+多拨+网盘+DNS优化
近期更新:2020.04.06编译-基于OpenWrt R2020.3.19版本,源码截止2020.04.06. 2020.04.06更新记录: 以软件包形式提供ServerChan(微信推送) ...
- Day_12【集合】扩展案例2_键盘录入一个字符串,对其进行去重,并将去重后的字符串组成新数组
需求分析:键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符 思路: 1.键盘录入字符串 2.遍历字符串,将每个字符存储到集合中 3.将集合中重复的字符去掉 4.创建新集合,遍历老集合,获取老 ...
- java 8 stream、lambda表达式对list操作分组、过滤、求和、最值、排序、去重
1.分组 通过groupingBy分组指定字段 list.stream().collect(Collectors.groupingBy(User::getSex)); 2.过滤 通过filter方法过 ...
- Python 简明教程 --- 0,前言
微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io Life is short, you need Python! -- Bruce Eckel 0,关 ...
- 将mat文件中的数据按要求保存到txt文档中(批处理)
之前有个老朋友,让帮忙将一个mat中的数据重新保存到txt中,由于数据比较多需要用到批处理,之前弄过很多次,但每次一到要用的时候总是忘记怎么写了,现在记录一下,免得后面老是需要上网搜.这里先说一个比较 ...
- LUNIX命令集
Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户.多任务.支持多线程和多 CPU 的操作系统. Linux 能运行主要的 UNIX 工具软件 ...
- Interactive and non-interactive shell环境变量的差异
背景 在mac上安装mosh server后,用mosh client去连接,一直报command not found的错 zsh: command not found: mosh-server 但是 ...