发送信号控制 nginx「建议收藏」

发送信号控制 nginx

大家好,又见面了,我是全栈君。

目录

  • 修改配置
  • 滚动日志文件
  • 在运行中升级可执行文件

可通过发送信号给 nginx 进行控制。nginx 主进程的 PID 默认被写入 /usr/local/nginx/logs/nginx.pid。
pid 文件的路径被可在配置时修改,使用 pid 指令指定其他路径。nginx 主进程支持如下信号:

 

TERM, INT   快速关闭 nginx
QUIT        优雅地关闭 nginx
HUP         修改配置,keeping up with a changed time zone (only for FreeBSD and Linux),
            以新配置启动新的 worker 进程,优雅地关闭老的 worker 进程。
USR1        重新打开日志文件
USR2        升级可执行文件
WINCH       优雅地关闭 worker 进程

也可发送信号给某个 worker 进程,支持的信号有:

 

TERM, INT   快速关闭 nginx
QUIT        优雅地关闭 nginx
USR1        重新打开日志文件
WINCH       为调试bug,非正常地关闭 worker 进程(需在配置中使用 debug_points 指令)

修改配置


要让 nginx 重新加载配置文件,需要给 nginx 主进程发送一个 HUP 信号。nginx 主进程收到信号之后,首先检查配置的语法,然后尝试应用新配置,比如:打开日志文件,或者建立新的监听套接字。如果应用新配置失败,nginx 对改动进行回滚,并继续以旧的配置进行工作。如果成功,nginx 启动新的 worker 进程,并发送关闭消息给旧的 worker 进程要求它们优雅地关闭。旧的 worker 进程关闭监听套接字,并继续完成当前的用户请求,等用户的请求完成后,就会关闭。

我们以一个例子来演示这个过程,在 Linux 中执行:
ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'

该命令生成如下输出:

 

  PID  PPID USER     %CPU    VSZ WCHAN  COMMAND
 5638     1 root      0.0  45116 rt_sig nginx: master process nginx
 5960  5638 nginx     0.0  45356 ep_pol nginx: worker process

当发送一个 HUP 信号给 nginx 主进程
kill -s HUP 6538

执行 ps 命令,可看到 worker 进程的 PID 改变了,输出改变为:

 

 PID  PPID USER     %CPU    VSZ WCHAN  COMMAND
5638     1 root      0.0  45116 rt_sig nginx: master process nginx
6302  5638 nginx     0.0  45564 ep_pol nginx: worker process

执行 kill -s HUP 6538 的效果与重新加载 nginx 配置的命令相同:
nginx -s reload

滚动日志


滚动日志之前,日志需要被重命名,然后发送 USR1 信号给 nginx 主进程。主进程 re-open 当前所有已经打开的日志文件,并以 worker 进程当前的用户身份,给重新打开的日志文件定义 owner 身份(chown)。成功 re-open 之后,主进程关闭所有打开的日志文件,并发送消息给 worker 进程要求它 re-open 日志文件。worker 进程也会打开新的日志文件,并立即关闭旧的日志文件。之后,对旧的日志文件就可以进行推送处理,
比如进行压缩处理。

示例:

cd 到日志目录:

 

[root@lamp1 nginx]# cd /var/log/nginx
[root@lamp1 nginx]# ls
access.log  error.log

重命名 access.log 文件为 access.log.1,执行 nginx -s reopen 命令,查看滚动日志情况:

 

[root@lamp1 nginx]# mv access.log access.log.1
[root@lamp1 nginx]# nginx -s reopen
[root@lamp1 nginx]# ls
access.log  access.log.1  error.log

重命名 error.log 文件为 error.log.1,执行 nginx -s reopen 命令,查看滚动日志情况:

 

[root@lamp1 nginx]# mv error.log error.log.1
[root@lamp1 nginx]# nginx -s reopen
[root@lamp1 nginx]# ls
access.log  access.log.1  error.log  error.log.1

注:kill -s HUP 与 nginx -s reopen 效果相同。

查看日志文件的属主,为 nginx,nginx 是 worker 进程的执行身份,看看前面“修改配置”小节的 ps 命令输出:

 

[root@lamp1 nginx]# ll
total 12
-rw-r--r-- 1 nginx root    0 Jun 29 07:58 access.log
-rw-r--r-- 1 nginx root 4055 Jun 28 17:29 access.log.1
-rw-r--r-- 1 nginx root   63 Jun 29 07:59 error.log
-rw-r--r-- 1 nginx root 1260 Jun 29 07:58 error.log.1

在运行中升级可执行文件


为升级 nginx 可执行程序,首先将旧的 nginx 可执行文件替换为新的可执行文件,然后发送 USR2 信号给 nginx 主进程。nginx 主进程第一步会重命名 pid 文件,给原来的 pid 文件添加 .oldbin 后缀,比如 /usr/local/nginx/logs/nginx.pid.oldbin,然后启动新 nginx 可执行文件并依次启动新的 worker 进程。

 

  PID  PPID USER    %CPU   VSZ WCHAN  COMMAND
33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx
33134 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)
33135 33126 nobody   0.0  1380 kqread nginx: worker process (nginx)
33136 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)
36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

这时新旧 worker 进程都继续接受请求。如果将 WIHCH 信号发送给第一个主进程,它会发送消息给它的 worker 进程,要求他们优雅地关闭,之后第一个主进程的 worker 进程开始退出:

 

  PID  PPID USER    %CPU   VSZ WCHAN  COMMAND
33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx
33135 33126 nobody   0.0  1380 kqread nginx: worker process is shutting down (nginx)
36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

过一会儿之后,只有新的 worker 进程继续处理请求:

 

  PID  PPID USER    %CPU   VSZ WCHAN  COMMAND
33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx
36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

应注意的是,旧的主进程不会关闭它的监听套接字,并可在需要时重新启动它的 worker 进程。如果因为某些原因新的可执行文件不能正确工作,可采用下列的其中一种方法:

  • 发送 HUP 信号给旧的主进程。旧的主进程会启动新的 worker 进程,但不会重读配置文件。之后,可发送 QUIT 信号给新主进程,让所有新主进程的 worker 进程优雅地关闭。

  • 发送 TERM 信号给新主进程。新主进程收到 TERM 信号之后,会发送消息给它的 worker 进程,要求他们立即退出,之后这些 worker 进程将立即退出。(如果 worker 进程因为某些原因不能立即退出,应发送 KILL 信号令其强制性地退出)当新主进程退出后,旧主进程会自动启动新的 worker 进程。

如果新主进程退出,旧主进程会将 pid 文件的 .oldbin 后缀删除。

如果升级成功完成,应发送 QUIT 信号关闭旧主进程,只留下新主进程:

 

 PID  PPID USER    %CPU   VSZ WCHAN  COMMAND
36264     1 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111903.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • RestSharp_restbed

    RestSharp_restbedRestSharp介绍RestSharp是一个.NET平台下REST和HTTPAPI的开源客户端库,支持的平台包括.NET3.5/4、Mono、MonoforAndroid、MonoTouch、WindowsPhone7.1Mango、WindowsPhone8.1。RestSharp可以简化用户访问Restful的服务过程,在这里下载代码可以让用户更简单的使用RestSha…

    2022年9月8日
  • sublime 激活码【2021.7最新】

    (sublime 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlTR0LFTT656-eyJsaWN…

    2022年3月22日
  • java判断空对象为空_Java判断对象是否为空(包括null ,””)的方法[通俗易懂]

    java判断空对象为空_Java判断对象是否为空(包括null ,””)的方法[通俗易懂]本文实例为大家分享了Java判断对象是否为空的具体代码,供大家参考,具体内容如下packagecom.gj5u.publics.util;importjava.util.List;/***判断对象是否为空**@authorRex**/publicclassEmptyUtil{/***判断对象为空**@paramobj*对象名*@return是否为空*/@Supp…

    2022年6月22日
  • Java 自定义类加载器教程[通俗易懂]

    Java 自定义类加载器教程[通俗易懂]Java自定义类加载器教程除了在面试中遇到类的加载器的概率会高外,在实际的工作中很少接触。但是一个程序员想要成长为大牛就必须对一些JVM的底层设计有些了解。在此基础上我们阅读一些源码和框架会显得更轻松。好了废话不多说,我们接着前面的文章,乘热打铁。来实现一个Java自定义类加载器吧。要实现Java自定义的类加载器,我们需要继承ClassLoader。并且需要了解Java的双亲委派模型。loadClassloadClass默认实现如下:publicClass<?>

    2022年9月6日
  • Spring Boot Configuration Annotation Processor not found in classpath解决方法

    版权声明: 这是我在学习SpringBoot入门中遇到的第一个问题,其实就是说提示的classpath中找不到,查询此注解的使用关系怎么指定classpath。如果是配置在application.properties下的,Spring默认在加载的时候就会转到容器里面。所有说问题很简单:解决方案: 其实这个可能就是你没有在maven中导入自动装配映射的依赖包 &amp;amp;amp;lt;!– …

    2021年11月30日
  • 搭建zuul网关_zuul网关的请求和响应

    搭建zuul网关_zuul网关的请求和响应1.概述Zuul是netflix开源的一个APIGateway服务器,本质上是一个webservlet应用(filter过滤器)。是微服务的请求入口,保护微服务的安全;默认集成ribbon,hystrix。Zuul在云平台上提供动态路由【实现请求的分发(负载均衡)】,监控,弹性,安全,鉴权,限流等边缘服务的框架。Zuul相当于是设备和Netflix流应用的Web网站…

    2022年8月15日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号