Nginx 服务启停方式

1. 前言

nginx 安装后,接下来我们就要学习如何启动、停止、重启 nginx 的服务

对于 nginx 服务的启停控制,在 linux 系统中也有多种方式,比如:信号控制、命令行控制

信号控制:使用 nginx 服务的信号来控制,这种方式里面涉及到一些信号,重点是理解这些信号所代表的含义

命令行控制:使用 sbin 目录下的 nginx 可执行的二进制文件来控制,这种方式日常开发中使用的比较多,非常重要

2. 信号控制

信号控制:只需要给 master 进程发送信号就可以来控制 nginx,在学习日志分割、服务升级时会用到信号控制这种方式

想要操作 nginx 的 master 进程,就需要获取到 master 进程的进程 ID(PID)

a. 查看主进程 ID

方式一:运行以下命令查看 nginx 进程

 
  1. ps -ef | grep nginx

方式二:通过 nginx.pid 文件查看 master 进程 PID

在使用 ./configure 命令预编译时,有两个参数 --prefix=PATH 用于指定 nginx 安装目录,--pid-path=PATH 用于指定 nginx 主进程 IP 存放位置,默认存放位置是 nginx 安装目录下的 logs/nginx.pid 文件中

运行以下命令查看 nginx 安装信息

 
  1. /usr/local/nginx/sbin/nginx -V

发现安装目录为 /usr/local/nginx,未指定 pid 存放目录,则主进程 ID 存放位置为 /usr/local/nginx/logs/nginx.pid

运行以下命令查看文件内容,也就是 nginx 的 master 进程 ID

 
  1. cat /usr/local/nginx/logs/nginx.pid

b. 信号控制用法

获取到 nginx 的主进程 ID 之后,能干什么

信号作用等同于
TERM/INT立即关闭整个服务nginx -s stop
QUIT“优雅” 的关闭整个服务,worker 进程处理完当前用户请求再关闭nginx -s quit
HUP重读配置文件并使用服务对新配置项生效nginx -s reload
USR1重新打开日志文件,可以用来进行日志切割nginx -s reopen
USR2平滑升级到最新版的 nginx-
WINCH所有子进程不在接收处理新连接,相当于给 worker 进程发送 QUIT 指令-

调用命令:

 
  1. # signal:信号
  2. # PID:nginx 的 master 线程 ID
  3. kill -[signal] PID

使用示例:

 
  1. # TERM:立即关闭 nginx 服务,1294 是 master 进程 ID
  2. kill -TERM 1294
  3. # QUIT:优雅的关闭 nginx 服务,1294 是 master 进程 ID
  4. kill -QUIT 1294

也可以使用下面这种写法,将 master 进程的 ID 改为命令输出结果,就不需要查看进程 ID 值了

 
  1. kill -TERM `cat /usr/local/nginx/logs/nginx.pid`

USR1 信号:发送该信号给 master 进程,告诉 nginx 重新开启日志文件

 
  1. # 删除日志文件
  2. rm -rf /usr/local/nginx/logs/access.log /usr/local/nginx/logs/error.log
  3. # 运行以下命令会重新创建 access.log、error.log
  4. kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

USR2信号:告诉 master 进程要平滑升级,将 nginx 从低版本升级到高版本,无需重启 nginx 服务,不影响用户访问

通过这两步操作之后,运行在服务器上的就是最新开启的 master 进程,具体怎么实现我们通过实例看下效果

给 master 进程发送 USR2 信号,可以看到打开了一份新的 master、worker 进程

 
  1. kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`

如下图所示,USR2 信号会生成 nginx.pid.oldbin 文件,用于记录旧的 master 进程 ID

假设我们确保 nginx 服务器已经升级成功,接下来运行以下命令

它的作用是等待旧的 worker 进程处理完用户请求后,将旧的 worker 进程和 master 进程都关闭掉

 
  1. kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`

执行完命令之后,就可以发现只剩下新的 master、worker 进程

WINCH 信号:所有子进程不在接收处理新连接,只关闭 woker 进程,不关闭 master 进程

 
  1. kill -WINCH `cat /usr/local/nginx/logs/nginx.pid`

QUIT 信号 和 WINCH 信号的区别?

都是等 worker 进程处理完当前用户请求再将 worker 进程关闭掉,WINCH 信号到此就结束了,而不会关闭 master 进程,但是 QUIT 信号会将 master 进程也关闭掉

3. 命令行控制

命令行控制:这种方式是使用 sbin 目录下的 nginx 可执行的二进制文件来进行 nginx 状态的控制

执行二进制文件的写法示例

 
  1. # 相对路径
  2. cd /usr/local/nginx/sbin
  3. ./nginx -s reload
  4. # 绝对路径
  5. /usr/local/nginx/sbin/nginx -s reload
  6. # 定义了环境变量或命令别名
  7. nginx -s reload

运行以下命令查看都有哪些参数可用

 
  1. nginx -h
参数描述
-? 和 -h显示帮助信息
-v查看 nginx 版本号
-V查看 nginx 版本号和配置信息
-t测试配置文件语法是否正确
-T测试配置文件语法是否正确,并输出用到的配置文件
-q配置测试期间不显示非错误消息
-p指定 nginx 的 prefix 路径,默认为:/usr/local/nginx
-c指定 nginx 的 配置文件路径,默认为:conf/nginx.conf
-g用于补充 nginx 配置,向 nginx 服务指定启动时应用全局的配置

-h
 
  1. # 下面两个命令作用是一样的
  2. nginx -?
  3. nginx -h
-v
 
  1. # 查看版本号
  2. nginx -v
  3. # 查看版本号和配置信息
  4. nginx -V

-q
 
  1. # 检测配置文件语法,运行命令可以看到没有错误信息,是正常的提示
  2. nginx -t
  3. # 因为没有错误信息,所以什么也没有输出(不显示非错误信息)
  4. nginx -tq

当有错误信息时,才会输出内容

-s

给 master 进程发送信号控制 nginx 的状态,可用的信号:stop, quit, reopen, reload

 
  1. # 快速关闭,类似于 TERM/INT 信号的作用,直接关闭 master、worker 进程
  2. nginx -s stop
  3. # 优雅关闭,类似于 QUIT 信号的作用,等待 worker 进程处理完请求再关闭 master、worker 进程
  4. nginx -s quit
  5. # 重新打开日志文件,类似于 USR1 信号的作用
  6. nginx -s reopen
  7. # 重载配置文件,类似于 HUP 信号的作用
  8. nginx -s reload
-c

-c 参数用于指定 nginx 使用的配置文件,默认使用的是 nginx 安装目录下的 conf/nginx.conf

接下来,我们看下具体效果

首先,我们使用默认的 nginx.conf 创建出一个新的配置文件,用于测试使用

 
  1. # 拷贝 nginx.conf 得到新的配置文件 abc.conf
  2. cp /usr/local/nginx/conf/nginx.conf /usr/local/abc.conf

为了区分两个配置文件,我们修改一下 abc.conf,故意造成语法错误

运行以下命令进行语法检测,查看命令输出就可以发现读取的配置文件不同

 
  1. # 没有指定配置文件,默认使用的是 /usr/local/nginx/conf/nginx.conf
  2. nginx -t
  3. # 检测 /usr/local/abc.conf 文件语法是否正常
  4. nginx -tc /usr/local/abc.conf

当前,也可以在启动的时候指定配置文件,这种写法你可能在很多地方看到过

 
  1. nginx -c /usr/local/abc.conf
-g

在 nginx.conf 中可以看到有个配置项用于指定 master 进程 ID 存放位置,默认是注释掉的

 
  1. # pid logs/nginx.pid;

我们可以在启动 nginx 时使用 -g 参数补充配置,如:指定 master 进程 ID 存放位置

但是,一般情况下这些内容我们都会在 nginx.conf 中指定,很少通过 -g 参数指定配置

 
  1. nginx -g "pid logs/abc.pid;"

使用 -g 参数指定 master 进程 ID 存放位置后,停止 nginx 服务会出现问题

 
  1. nginx -s stop

可以发现并没有从 abc.pid 查找进程 ID,此时没有办法使用命令行关闭的

但可以使用信号控制关闭

 
  1. kill -TERM `cat /usr/local/nginx/logs/abc.pid`

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/485557.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pytorch如何向tensor结尾添加元素或维度--torch.cat()、torch.unsqueeze()的用法

目录 示例1 矢量后增加元素 示例2 tensor维度增加1 示例3 另一种替代unsqueeze的方法 示例1 矢量后增加元素 使用torch.cat()函数 ptorch.Tensor([1,5,0]) ptorch.cat((p, torch.Tensor([4])), 0) 结果: 这里,cat的第一个输入变量用()包绕&#xf…

Java研学-SpringBoot(二)

二 Spring Boot 介绍 1 简介 Spring Boot是由Pivotal团队提供的全新框架,主要目标是简化Spring应用程序的配置和部署过程,减少开发者在项目搭建和配置上的工作量,让开发者能够更专注于业务逻辑的实现。它使用特定的方式来进行配置&#xff0…

FFmpeg拉取RTSP流并定时生成10秒短视频

生成效果: 视频时长为10秒 生成格式为FLV 输出日志: 完整实现代码如下: 需要在Mac和终端先安装FFmpeg brew install ffmpeg CMake文件配置: cmake_minimum_required(VERSION 3.27) project(ffmpeg_open_stream) set(CMAKE_CXX_STANDARD 17)#头文件包目录 include_director…

软件高级:软件产品线-双生命周期模型概念和例题

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

unity学习(70)——编译游戏发生错误1

要命 1.VersionControl 直接注释掉就可以了。一共有5处。 2. GraphView一处,也是注释掉就ok了 3.修改完以上6处后66s完成编译 4. 编译结果如下图所示 5. unity中成功实例化两个对象,但此时服务器炸了! 6.预构体数组越界 把naruto模型再往里面…

[网鼎杯 2018]Comment -----不会编程的崽

网鼎杯的题啊,每次都能记忆犹新,又get到了不少。 这种发帖的界面在ctf中不少见了,多半是二次注入。但是这个二次注入并不单纯。在一道大坎之前,必定存在小坎。这不,先登录。 先别急着怀疑是否为其他漏洞。仔细观察&…

EasyPOI操作Excel从零入门

教程介绍 我们不造轮子,只是轮子的搬运工。(其实最好是造轮子,造比别人好的轮子)开发中经常会遇到excel的处理,导入导出解析等等,java中比较流行的用poi,但是每次都要写大段工具类来搞定这事儿…

网络协议栈--网络层--IP协议

目录 本节重点网络层IP协议一、 基本概念二、 IP协议报头格式三、网段划分(重要)四、特殊的IP地址五、IP地址的数量限制六、私有IP地址和公网IP地址七、路由八、IP协议全部内容一览图 本节重点 1、理解网络层的作用, 深入理解IP协议的基本原理 2、对整个TCP/IP协议有系统的理解…

SQLiteC/C++接口详细介绍sqlite3_stmt类(八)

返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(七) 下一篇: SQLiteC/C接口详细介绍sqlite3_stmt类(九) 27、sqlite3_column_int 函数 sqlite3_column_int 用于返…

吴恩达2022机器学习专项课程(一) 3.5 可视化成本函数

问题预览 为什么要可视化成本函数?可视化之后的成本函数是什么样子?如何在三维空间里通过w和b找到一个成本函数的值?如何在三维空间里找到成本函数的最小值? 解读 可视化成本函数:为了更加方便的看到不同的w和b&…

web CSS笔记1

CSS(Cascading Style Sheets) 美化样式 CSS通常称为CSS样式表或层叠样式表(级联样式表),主要用于设置HTML页面中的文本内容(字体、大小、对齐方式等)、图片的外形(宽高、边框样式、边距等)以及…

再仔细品品Elasticsearch的向量检索

我在es一开始有向量检索,就开始关注这方面内容了。特别是在8.X之后的版本,更是如此。我也已经把它应用在亿级的生产环境中,用于多模态检索和语义检索,以及RAG相关。 也做过很多的优化:ES 8.x 向量检索性能测试 & 把…

Vue2谷粒商城

1.初始化项目 npm init -y 2. 安装vue 2 npm install vue^2 3.编写基本代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sc…

构建以太网交换网络——(生成树实验)

实验介绍 关于本实验 以太网交换网络中为了进行链路备份&#xff0c;提高网络可靠性&#xff0c;通常会使用冗余链路。但是使用冗余链路会在交换网络上产生环路&#xff0c;引发广播风暴以及MAC地址表不稳定等故障现象&#xff0c;从而导致用户通信质量较差&#xff0c;甚至…

PB 级速度,单一数据库操作:走进 Amazon Aurora Limitless Database 的神奇

在数字时代的浪潮中&#xff0c;数据库管理面临着前所未有的挑战和复杂性。对于许多应用程序开发者而言&#xff0c;维护数据库、确保一致性保证、执行升级和备份等日常操作变得越来越复杂。随着应用程序规模的不断扩大&#xff0c;这些任务可能变得琐碎而繁重。传统的数据库管…

前端Webpack5高级进阶课程

课程介绍 本套视频教程主要内容包含React/Vue最新版本脚手架分析、基于Webpack5编写自己的loader和plugin等&#xff0c;让你开发时选择更多样&#xff0c;最后&#xff0c;用不到一百行的代码实现Webpack打包。通过本套视频教程的学习&#xff0c;可以帮你彻底打通Webpack的任…

美团2024届秋招笔试第二场编程真题

要么是以0开头 要么以1开头 选择最小的答案累加 import java.util.Scanner; import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和…

计算机网络⑦ —— 网络层协议

1. ARP协议 在传输⼀个 IP 数据报的时候&#xff0c;确定了源 IP 地址和⽬标 IP 地址后&#xff0c;就会通过主机路由表确定 IP 数据包下⼀跳。然⽽&#xff0c;⽹络层的下⼀层是数据链路层&#xff0c;所以我们还要知道下⼀跳的 MAC 地址。由于主机的路由表中可以找到下⼀跳的…

多模态检索增强生成的简单介绍

原文地址&#xff1a;An Easy Introduction to Multimodal Retrieval Augmented Generation 2024 年 3 月 20 日 如果检索增强生成(RAG) 应用程序可以处理多种数据类型&#xff08;表格、图形、图表和图表&#xff09;而不仅仅是文本&#xff0c;那么它的实用性就会呈指数级…

2023年全国职业院校技能大赛(网络系统管理赛项)样题三

2023****年全国职业院校技能大赛 GZ073****网络系统管理赛项 赛题第3套 模块A&#xff1a;网络构建 ​ 目 录 任务清单… 1 &#xff08;一&#xff09;基础配置… 1 &#xff08;二&#xff09;有线网络配置… 1 &#xff08;三&#xff09;无线网络配置… 3 &#…