[TOC] #### 1. 简介 --- nginx 是目前最流行的 web 服务器软件,也是目前互联网公司和网站的首选 nginx 发行版比较多,常用版本有两大阵营,我们平时使用最多的是开源版,本文使用的也是开源版 + nginx 开源版:<https://nginx.org> + nginx plus 商业版:<https://nginx.com> #### 2. 安装 --- nginx 有多种安装方式: 方式一:使用包管理器,这种方式比较简单,只需要一个 install 命令即可 [点击查看 CentOS 7 使用 Yum 安装 Nginx](https://www.itqaq.com/index/645.html) ```bash # MacOS brew install nginx # Windows scoop install nginx ``` 方式二:使用源码进行编译安装 [点击查看 CentOS 7 编译安装 Nginx](https://www.itqaq.com/index/626.html) nginx 是使用 c 语言开发的,那么也就可以像其他 c 语言项目一样,下载 nginx 的源码到自己的服务器上,然后执行预编译、编译和安装,这种方式比较灵活,可以自定义各种配置参数,适合于一些特殊的场景 这种方式也是比较麻烦的,因为编译安装的过程,可能会遇到各种各样的问题,需要有一定的排查和解决问题的能力 ```bash ./configure --prefix=/usr/local/nginx ``` 方式三:使用 Docker 安装,使用 docker 镜像来安装和运行 nginx 这种方式也是比较简单的,只需要执行几个 docker 命令就可以了,想要学习和体验已经足够满足了 ```bash docker pull nginx ``` #### 3. 服务启停 --- nginx 安装完成之后就可以来启动服务了,在 nginx 安装目录下的 sbin 目录下运行以下命令 回车之后没有任何提示消息的话,就表示启动成功了,这是 linux 系统的一个设计思想,没有消息就是最好的消息 如果启动失败的话会有提示,那么就需要根据提示信息来排查和解决问题 ```bash ./nginx ``` nginx 的服务启动之后,会作为一个后台进程一直运行,我们运行下面命令查看 nginx 进程 ```bash ps -ef | grep nginx ``` 这里只需要关注前面两个进程就可以了,一个是 master 进程,一个是 worker 进程  稍微解释一下 nginx 的进程模型,这里的 master 进程就是 nginx 的主进程 它主要负责读取和验证配置文件以及管理 worker 进程,worker 进程就是 nginx 的工作进程,负责处理实际的请求,master 进程只有一个,而 worker 进行可以有多个 master 进程和 worker 进程之间的关系就像是老板和员工的关系一样,老板负责管理员工,并且将工作分配给员工,员工负责完成具体的工作,worker 进程的数量可以通过配置文件来调整 上图中的第二列就是 PID,也就是进程 ID,PID 是 Linux 系统中每一个进程的唯一标识  还可以使用 lsof 命令来查看一个端口占用情况 ```bash lsof -i:80 ``` 有些系统没有自带 lsof 命令,需要手动安装【mac 已经自带,无需自行安装】 ```bash # centos yum install lsof -y ``` 我们可以看到 80 端口正被 nginx 的两个进行占用着 这两个进程的 PID 就是上面我们看到的 nginx 的进程 PID,表示 nginx 正在监听 80 端口  nginx 服务启动之后,我们可以通过 `./nginx -s 参数` 来控制 nginx 的停止或重启 ```bash ./nginx -s quit # 优雅停止 ./nginx -s stop # 立即停止 ./nginx -s reload # 重载配置文件 ``` #### 4. 目录结构 --- 在使用 nginx 之前,我们先对安装好的 nginx 目录文件进行一个分析,可以使用一个工具 tree,使用该命令可以方便的查看文件目录结构,要使用该命令需要先进行安装,运行以下命令即可 ```bash yum install tree -y ``` ##### 1. 目录概览 nginx 一般都是安装在 `/usr/local/nginx` 目录,本文默认您将 nginx 安装到此目录下 ```bash ./configure --prefix=/usr/local/nginx ``` nginx 安装完成后,在其安装目录下默认有下面四个目录 ``` ├── conf # 配置文件存放目录 ├── html # 默认站点目录 ├── logs # 日志文件存放目录 ├── sbin # nginx 主程序文件存放目录 ``` 如果你的目录下多了好几个以 `_temp` 为后缀的目录,无需关注,这几个目录都是 nginx 运行时产生的临时文件 ```bash ls /usr/local/nginx ```  nginx 目录结构一览图  ##### 2. conf 目录 --- conf:nginx 配置文件存放目录 可以将默认的配置文件分为三大类:cgi 相关配置文件 CGI(Common Gateway Interface):通用网关接口,主要解决的问题是从客户端发送一个请求和数据,服务端获取到请求和数据后可以调用 CGI 程序处理及相应结果给客户端的一种标准规范 ``` ├── fastcgi.conf # fastcgi 配置文件 ├── fastcgi.conf.default # fastcgi.conf 的备份文件 ├── fastcgi_params # fastcgi 参数配置 ├── fastcgi_params.default # fastcgi_params 的备份文件 ├── scgi_params # scgi 参数配置 ├── scgi_params.default # scgi_params 的备份文件 ├── uwsgi_params # uwsgi 参数配置 ├── uwsgi_params.default # uwsgi_params 的备份文件 ├── koi-utf ├── koi-win ├── win-utf ├── mime.types ├── mime.types.default ├── nginx.conf ├── nginx.conf.default ``` nginx.conf 为主配置文件,主配置文件会引用其他配置文件  当修改配置文件后,运行以下命令来检查配置文件的内容是否正确,当有错误时,会提示错误的位置和原因 ```bash ./nginx -t ``` nginx 的配置文件修改后,都是需要重新加载一下才会生效的 ```bash ./nginx -s reload ``` 在主配置文件 nginx.conf 中可以修改 worker 进程的数量 ``` # worker 进程数量默认只有一个 worker_processes 1; ``` 将 worker 进程数量设置为 3 个,重载 nginx 配置后,查看进程就能看到生效了 ``` worker_processes 3; ```  一般来说,worker 进程的数量保持和服务器 CPU 内核的数量相同是比较合适的,也可以设置为 `auto`,这样 nginx 就会根据内核的数量来自动设置 worker 进程的数量 ``` worker_processes auto; ``` ##### 3. logs 目录 --- logs 目录用来存放 nginx 日志文件和主进程 pid,日志文件比如:访问日志 (access.log) 和错误日志 (error.log)  nginx.pid 用来记录 nginx 主进程的 pid(当 nginx 服务启动后才会该文件)  ##### 4. sbin 目录 --- sbin 目录用于存放 nginx 主进程文件,根据它可以启动、停止 nginx 服务以及重载 nginx 配置  #### 5. 运行原理 --- **a. 基本运行原理** nginx 的高性能,其实和它的架构模式有关,nginx 默认采用的是多进程的方式来工作的 当通过 nginx 主进程文件启动 nginx 服务时,会开启主进程,然后主进程就会读取并校验配置文件(nginx.conf) 当配置文件没有错误时,会开启多个子进程,用于接受并响应请求 当有网络请求发送时,子进程就会接受请求,然后解析请求,读取配置文件,然后响应请求 **b. 总结** nginx 服务启动会运行一个主进程,多个子进程,主进程负责协调子进程  当配置文件更改了,我们会执行以下命令重新加载配置文件 ```bash ./nginx -s reload ``` 该命令会将子进程杀掉,在杀掉之前会留有时间完成之前用户的请求,并且告诉子进程不允许再接受新的请求了 当子进程把所有之前的请求完成后,子进程就会被杀掉了,新的子进程去读新的配置文件 验证上面的话,如下图所示,reload 之后,子进程的 pid 变了,主进程并没有变 ``` ps -ef | grep nginx /usr/local/nginx/sbin/nginx -s reload ```  nginx 基本运行原理如下图所示 