Nginx03-使用

零、文章目录

Nginx03-使用

1、Nginx服务器启停命令

  • 对于 Nginx 的启停在 Linux 系统中也有很多种方式,我们介绍两种方式:
    • Nginx信号控制
    • Nginx命令行控制
(1)Nginx信号控制
  • 查看Nginx 中的 master 和 worker 进程
bash 复制代码
[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的两种方式
bash 复制代码
# 方式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
bash 复制代码
# 命令格式
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
  • 案例演示如下
bash 复制代码
# 发送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 来查看都有哪些参数可以用。
bash 复制代码
[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服务指定启动时应用全局的配置

  • 案例演示

bash 复制代码
# 查看版本
[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 版本安装成功并正确访问。
bash 复制代码
# 创建指定目录
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 版本进行参数配置和编译,不需要进行安装。
bash 复制代码
# 切换到目录
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 进行备份
bash 复制代码
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold
  • 第二步:将 Nginx 1.26.2 安装目录编译后的 objs 目录下的 nginx 文件,拷贝到原来 /usr/local/nginx/sbin 目录下
bash 复制代码
cp /opt/nginx/core/nginx-1.26.2/objs/nginx /usr/local/nginx/sbin
  • 第三步:发送信号 USR2 给 Nginx 的 1.14.2 版本对应的 master 进程
bash 复制代码
[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也删除了,平滑升级完成
bash 复制代码
[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 进行备份
bash 复制代码
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold
  • 第二步:将 Nginx 1.26.2 安装目录编译后的 objs 目录下的 nginx 文件,拷贝到原来 /usr/local/nginx/sbin 目录下
bash 复制代码
cp /opt/nginx/core/nginx-1.26.2/objs/nginx /usr/local/nginx/sbin
  • 第三步:进入到安装目录,执行 make upgrade
bash 复制代码
[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`
  • 第四步:查看是否更新成功
bash 复制代码
[root@localhost nginx-1.26.2]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.26.2
相关推荐
2401_840192271 小时前
nginx常用功能,网站、反向代理、四层代理、优化方法、python动态页面解析。
运维·nginx
代码敲上天.9 小时前
nginx从入门到精通
运维·nginx
一棵___大树9 小时前
【中间件】—一篇说明白API网关&常用API网关推荐
分布式·中间件
这孩子叫逆11 小时前
nginx负载均衡的五种算法
运维·nginx·负载均衡
qq_5864754312 小时前
前端 + Nginx + 后端架构的无感升级方案
前端·nginx·架构
杭州吉网运维日记14 小时前
Liunx各系统中间件查询脚本
中间件
keep75415 小时前
GitHub的使用
github
苹果酱05671 天前
端模一体,猎豹移动对大模型机器人发展路径清晰
java·开发语言·spring boot·mysql·中间件
raiseup21 天前
尚硅谷rabbitmq 2024 第18-21节 消息可靠性答疑一
java·中间件·rabbitmq
栀夏6131 天前
etcd 快速入门
中间件