一、安装运行

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学习资料整理一的更多相关文章

  1. iOS 开发学习资料整理(持续更新)

      “如果说我看得比别人远些,那是因为我站在巨人们的肩膀上.” ---牛顿   iOS及Mac开源项目和学习资料[超级全面] http://www.kancloud.cn/digest/ios-mac ...

  2. iOS 学习资料整理

    iOS学习资料整理 https://github.com/NunchakusHuang/trip-to-iOS 很好的个人博客 http://www.cnblogs.com/ygm900/ 开发笔记 ...

  3. Java 学习资料整理

    Java 学习资料整理 Java 精品学习视频教程下载汇总 Java视频教程 孙鑫Java无难事 (全12CD) Java视频教程 即学即会java 上海交大 Java初级编程基础 共25讲下载 av ...

  4. nginx 学习资料

    nginx 学习资料 table th:first-of-type { width: 90px; } table th:nth-of-type(2) { } table th:nth-of-type( ...

  5. F4NNIU 的 Docker 学习资料整理

    F4NNIU 的 Docker 学习资料整理 Docker 介绍 以下来自 Wikipedia Docker是一个开放源代码软件项目,让应用程序部署在软件货柜下的工作可以自动化进行,借此在Linux操 ...

  6. Git学习资料整理

    Git作为一个优秀的版本控制系统,是我们开发人员必须要学会使用的一个工具,接触git一年多以来,也看了不少相关资料,今天把我所看过的一些学习资源整理一下. Git入门当然首推廖雪峰廖老师的教程:Git ...

  7. NLP | 算法 学习资料整理

    UPDATE TIME: 2019-12-12 17:06:32 NLP: 对话系统: [ ] https://www.cnblogs.com/jiangxinyang/p/10789512.html ...

  8. DBN 入门学习资料整理

    建议按序阅读 1.Deep Learning 概述 Deep Learning(深度学习)学习笔记整理系列 : http://blog.csdn.net/zouxy09/article/details ...

  9. JAVA学习资料整理

    今天偶然间发现之前一个群里发过的一篇关于JAVA学习资料的东西.本着服务大众的精神,搬来了博客园: <JAVA编程思想>第四版(英文原版) 下载地址:http://115.com/file ...

随机推荐

  1. 题目分享R

    题意:有n只蚂蚁在木棍上爬行,每只蚂蚁的速度都是每秒1单位长度,现在给你所有蚂蚁初始的位置(蚂蚁运动方向未定),蚂蚁相遇会掉头反向运动,让你求出所有蚂蚁都·掉下木棍的最短时间和最长时间. 分析:(其实 ...

  2. 组队训练 K K - The Stream of Corning 2

    K - The Stream of Corning 2 这个题目不是很难,因为给你的这个S是单调递增的,所以就用优先队列+权值线段树就可以很快的解决了. 这个+读入挂可以优化,不过不用也没关系. #i ...

  3. spring的aop的注解配置

    一.使用注解的方式配置后置通知 第一步,创建通知类LogAdvice 第二步,要在spring主配置文件中声明以注解的方式配置spring aop  第三步,测试 二.其他异常配置 package c ...

  4. 软路由OpenWrt(LEDE)2020.4.6编译 UnPnP+NAS+多拨+网盘+DNS优化

    近期更新:2020.04.06编译-基于OpenWrt R2020.3.19版本,源码截止2020.04.06.   2020.04.06更新记录: 以软件包形式提供ServerChan(微信推送) ...

  5. Day_12【集合】扩展案例2_键盘录入一个字符串,对其进行去重,并将去重后的字符串组成新数组

    需求分析:键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符 思路: 1.键盘录入字符串 2.遍历字符串,将每个字符存储到集合中 3.将集合中重复的字符去掉 4.创建新集合,遍历老集合,获取老 ...

  6. java 8 stream、lambda表达式对list操作分组、过滤、求和、最值、排序、去重

    1.分组 通过groupingBy分组指定字段 list.stream().collect(Collectors.groupingBy(User::getSex)); 2.过滤 通过filter方法过 ...

  7. Python 简明教程 --- 0,前言

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io Life is short, you need Python! -- Bruce Eckel 0,关 ...

  8. 将mat文件中的数据按要求保存到txt文档中(批处理)

    之前有个老朋友,让帮忙将一个mat中的数据重新保存到txt中,由于数据比较多需要用到批处理,之前弄过很多次,但每次一到要用的时候总是忘记怎么写了,现在记录一下,免得后面老是需要上网搜.这里先说一个比较 ...

  9. LUNIX命令集

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户.多任务.支持多线程和多 CPU 的操作系统. Linux 能运行主要的 UNIX 工具软件 ...

  10. Interactive and non-interactive shell环境变量的差异

    背景 在mac上安装mosh server后,用mosh client去连接,一直报command not found的错 zsh: command not found: mosh-server 但是 ...