零、文章目录
Nginx03-使用
1、Nginx服务器启停命令
- 对于 Nginx 的启停在 Linux 系统中也有很多种方式,我们介绍两种方式:
- Nginx信号控制
- Nginx命令行控制
(1)Nginx信号控制
- 查看Nginx 中的 master 和 worker 进程
[root@localhost ~]# ps -ef |grep nginx
root 27103 1 0 12:29 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 27104 27103 0 12:29 ? 00:00:00 nginx: worker process
root 27189 1775 0 12:29 pts/0 00:00:00 grep --color=auto nginx
- **Nginx的工作方式:**Nginx 后台进程中包含一个 master 进程和多个 worker 进程,master 进程主要用来管理 worker 进程,包含接收外界的信息,并将接收到的信号发送给各个 worker 进程,监控 worker 进程的状态。当 worker 进程出现异常退出后,会自动重新启动新的 worker 进程。而 worker 进程则是专门用来处理用户请求的,各个 worker 进程之间是平等的并且相互独立,处理请求的机会也是一样的。
- 获取到 master 进程的进程号 PID的两种方式
# 方式1:通过命令打印进程信息
ps -ef | grep nginx
# 方式2:查看文件存储的PID
cat /usr/local/nginx/logs/nginx.pid
- 信号有哪些
信号 | 作用 |
---|---|
TERM/INT | 立即关闭整个服务 |
QUIT | "优雅"地关闭整个服务 |
HUP | 重读配置文件并使用服务对新配置项生效 |
USR1 | 重新打开日志文件,可以用来进行日志切割 |
USR2 | 平滑升级到最新版的nginx |
WINCH | 所有子进程不在接收处理新连接,相当于给work进程发送QUIT指令 |
- **如何通过信号控制 Nginx 的启停等相关操作:**调用命令为
kill -signal PID
,signal:即为信号;PID即为获取到的master线程ID
# 命令格式
kill -signal PID
# 格式一:
kill -TERM PID
# 立即关闭当前线程
kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
# 格式一:
kill -INT PID
# 立即关闭当前线程
kill -INT `cat /usr/local/nginx/logs/nginx.pid
- 案例演示如下
# 发送QUIT信号给master进程,master进程会控制所有的work进程不再接收新的请求,等所有请求处理完后,在把进程都关闭掉。
# 优雅 关闭线程
kill -QUIT PID
# 「优雅」关闭当前线程
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid`
# 发送HUP信号给master进程,master进程会把控制旧的work进程不再接收新的请求,等处理完请求后将旧的work进程关闭掉,然后根据nginx的配置文件重新启动新的work进程
# 重启 worker 进程
kill -HUP PID
# 重启当前 worker 进程
kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
# 发送USR1信号给master进程,告诉Nginx重新开启日志文件
# 重新打开日志文件
kill -USR1 PID
# 重新打开当前 Nginx 的日志文件
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
# 发送USR2信号给master进程,告诉master进程要平滑升级,这个时候,会重新开启对应的master进程和work进程,整个系统中将会有两个master进程,并且新的master进程的PID会被记录在`/usr/local/nginx/logs/nginx.pid`而之前的旧的master进程PID会被记录在`/usr/local/nginx/logs/nginx.pid.oldbin`文件中,接着再次发送QUIT信号给旧的master进程,让其处理完请求后再进行关闭
# 开启新的进程,但是不删除旧的进程
kill -USR2 PID
# 开启新的进程,但是不删除当前进程
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
# 关闭旧的线程
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
# 发送 WINCH 信号给 master 进程,让 master 进程控制不让所有的 worker 进程在接收新的请求了,请求处理完后关闭 worker 进程。注意 master 进程不会被关闭掉
# 停止 worker 进程,但是不停止 master 进程
kill -WINCH PID
# 停止当前 worker 进程,但是不停止 master 进程
kill -WINCH `cat /usr/local/nginx/logs/nginx.pid`
(2)Nginx命令行控制
- **查看命令参数:**此方式是通过可执行文件 nginx来进行控制,通过 nginx -h 来查看都有哪些参数可以用。
[root@localhost ~]# /usr/local/nginx/sbin/nginx -h
nginx version: nginx/1.26.2
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
[-e filename] [-c filename] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-T : test configuration, dump it and exit
-q : suppress non-error messages during configuration testing
-s signal : send signal to a master process: stop, quit, reopen, reload
-p prefix : set prefix path (default: /usr/local/nginx/)
-e filename : set error log file (default: /usr/local/nginx/logs/error.log)
-c filename : set configuration file (default: /usr/local/nginx/conf/nginx.conf)
-g directives : set global directives out of configuration file
-
命令参数说明
-
**-?和-h:**显示帮助信息
-
**-v:**打印版本号信息并退出
-
**-V:**打印版本号信息和配置信息并退出
-
**-t:**测试nginx的配置文件语法是否正确并退出
-
**-T:**测试nginx的配置文件语法是否正确并列出用到的配置文件信息然后退出
-
**-q:**在配置测试期间禁止显示非错误消息
-
**-s:**signal信号,后面可以跟 :
-
stop[快速关闭,类似于TERM/INT信号的作用]
-
quit[优雅的关闭,类似于QUIT信号的作用]
-
reopen[重新打开日志文件类似于USR1信号的作用]
-
reload[类似于HUP信号的作用]
-
-
**-p:**prefix,指定Nginx的prefix路径,(默认为: /usr/local/nginx/)
-
**-c:**filename,指定Nginx的配置文件路径,(默认为: conf/nginx.conf)
-
**-g:**用来补充Nginx配置文件,向Nginx服务指定启动时应用全局的配置
-
-
案例演示
# 查看版本
[root@localhost ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.26.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
configure arguments: --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --modules-path=/usr/local/nginx/modules --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --pid-path=/usr/local/nginx/logs/nginx.pid --lock-path=/usr/local/nginx/logs/nginx.lock
# 测试 Nginx 的配置文件语法是否正确
[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
# 指定 Nginx 的默认安装路径
[root@localhost ~]# /usr/local/nginx/sbin/nginx -p /usr/local/nginx/
# 指定 Nginx 的配置文件路径
[root@localhost ~]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
# 快速关闭Nginx
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s stop
# 重新加载配置文件
[root@localhost ~]# /usr/local/nginx/sbin/nginx
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload
# 重新指定配置参数,一般都是修改配置文件,使用命令指定比较少,但是也可以
# pid配置文件存放地址修改之后,stop会报错,因为stop使用的还是原来的pid文件中的id,所以只能使用信号关闭
[root@localhost ~]# /usr/local/nginx/sbin/nginx -g "pid logs/abc.pid"
2、Nginx版本升级
(1)概述
- **强行切换:**如果想对Nginx 的版本进行更新,或者要应用一些新的模块,最简单的做法就是停止当前的 Nginx 服务,然后开启新的 Nginx 服务。但是这样会导致在一段时间内,用户是无法访问服务器。
- **平滑升级:**为了解决这个问题,我们就需要用到 Nginx 服务器提供的平滑升级功能。这个也是 Nginx 的一大特点,使用这种方式,就可以使 Nginx 在 7 * 24 小时不间断的提供服务了。
- **需求案例:**Nginx 的版本最开始使用的是 Nginx-1.14.2,由于服务升级,需要将 Nginx 的版本升级到 Nginx-1.26.2,要求 Nginx 不能中断提供服务。
- 两种解决方案
- 使用 Nginx 服务信号完成 Nginx 的升级。
- 使用 Nginx 安装目录的 make 命令完成升级。
(2)环境准备
- 使用 Nginx 源码安装的方式将 1.14.2 版本安装成功并正确访问。
# 创建指定目录
mkdir -p /opt/nginx/core
# 切换到目录
cd /opt/nginx/core
# 下载nginx
wget http://nginx.org/download/nginx-1.14.2.tar.gz
# 解压
tar -xzf nginx-1.14.2.tar.gz
# 进入解压出的目录
cd nginx-1.14.2/
# 配置安装的路径
./configure --prefix=/usr/local/nginx
# 编译安装
make && make install
# 执行 nginx 文件
/usr/local/nginx/sbin/nginx
- 将 Nginx 1.26.2 版本进行参数配置和编译,不需要进行安装。
# 切换到目录
cd /opt/nginx/core
# 下载nginx
wget http://nginx.org/download/nginx-1.26.2.tar.gz
# 解压
tar -xzf nginx-1.26.2.tar.gz
# 进入解压出的目录
cd nginx-1.26.2/
# 执行配置文件
./configure
# 编译安装
make
(3)服务信号进行升级
- 第一步:将 1.14.2 版本的 sbin 目录下的 nginx 进行备份
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold
- 第二步:将 Nginx 1.26.2 安装目录编译后的 objs 目录下的 nginx 文件,拷贝到原来
/usr/local/nginx/sbin
目录下
cp /opt/nginx/core/nginx-1.26.2/objs/nginx /usr/local/nginx/sbin
- 第三步:发送信号 USR2 给 Nginx 的 1.14.2 版本对应的 master 进程
[root@localhost ~]# ps -ef|grep nginx
root 70727 1 0 15:47 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 70728 70727 0 15:47 ? 00:00:00 nginx: worker process
root 107883 1775 0 16:26 pts/0 00:00:00 grep --color=auto nginx
[root@localhost ~]# kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
[root@localhost ~]# ps -ef|grep nginx
root 70727 1 0 15:47 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 70728 70727 0 15:47 ? 00:00:00 nginx: worker process
root 108661 70727 0 16:27 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 108662 108661 0 16:27 ? 00:00:00 nginx: worker process
root 108735 1775 0 16:27 pts/0 00:00:00 grep --color=auto nginx
[root@localhost ~]# cd /usr/local/nginx/logs/
[root@localhost logs]# ll
总用量 12
-rw-r--r-- 1 root root 0 9月 25 15:47 access.log
-rw-r--r-- 1 root root 73 9月 25 16:27 error.log
-rw-r--r-- 1 root root 7 9月 25 16:27 nginx.pid
-rw-r--r-- 1 root root 6 9月 25 15:47 nginx.pid.oldbin #生成一个文件,存放的是1.14.2对应的PID
- 第四步:发送信号 QUIT 给 Nginx 的 1.14.2 版本对应的 master 进程,nginx.pid.oldbin也删除了,平滑升级完成
[root@localhost logs]# kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
[root@localhost logs]# ps -ef|grep nginx
root 108661 1 0 16:27 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 108662 108661 0 16:27 ? 00:00:00 nginx: worker process
root 113029 1775 0 16:32 pts/0 00:00:00 grep --color=auto nginx
[root@localhost logs]# ll
总用量 8
-rw-r--r-- 1 root root 0 9月 25 15:47 access.log
-rw-r--r-- 1 root root 73 9月 25 16:27 error.log
-rw-r--r-- 1 root root 7 9月 25 16:27 nginx.pid
[root@localhost logs]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.26.2
(4)make命令完成升级
- 第一步:将 1.14.2 版本的 sbin 目录下的 nginx 进行备份
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold
- 第二步:将 Nginx 1.26.2 安装目录编译后的 objs 目录下的 nginx 文件,拷贝到原来
/usr/local/nginx/sbin
目录下
cp /opt/nginx/core/nginx-1.26.2/objs/nginx /usr/local/nginx/sbin
- 第三步:进入到安装目录,执行 make upgrade
[root@localhost ~]# cd /opt/nginx/core/nginx-1.26.2/
[root@localhost nginx-1.26.2]# make upgrade
/usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
sleep 1
test -f /usr/local/nginx/logs/nginx.pid.oldbin
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
- 第四步:查看是否更新成功
[root@localhost nginx-1.26.2]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.26.2