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