运行和控制Nginx

2012年7月20日 发表评论 阅读评论
  1. Nginx命令行选项
  2. 启动、停止、重启nginx命令
  3. 如何重新加载nginx配置文件
  4. nginx程序不重启平滑升级可执行文件

 

nginx命令行参数

不像许多其他软件系统,Nginx 仅有几个命令行参数,完全通过配置文件来配置

-c </path/to/config> 为 Nginx 指定一个配置文件,来代替缺省的。

-t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。

-v 显示 nginx 的版本。

-V 显示 nginx 的版本,编译器版本和配置参数。

 

nginx控制信号

可以使用信号系统来控制主进程。默认,nginx 将其主进程的 pid 写入到 /usr/local/nginx/nginx.pid 文件中。通过传递参数给 ./configure 或使用 pid 指令,来改变该文件的位置。

主进程可以处理以下的信号:

TERM, INT 快速关闭
QUIT 从容关闭
HUP 重载配置
用新的配置开始新的工作进程
从容关闭旧的工作进程
USR1 重新打开日志文件
USR2 平滑升级可执行程序。
WINCH 从容关闭工作进程

尽管你不必自己操作工作进程,但是,它们也支持一些信号:

TERM, INT 快速关闭
QUIT 从容关闭
USR1 重新打开日志文件

 

nginx 启动、停止、重启命令

nginx启动

sudo /usr/local/nginx/nginx     (nginx二进制文件绝对路径,可以根据自己安装路径实际决定)

 

nginx从容停止命令,等所有请求结束后关闭服务

ps -ef |grep nginx

kill -QUIT  nginx主进程号

 

nginx 快速停止命令,立刻关闭nginx进程

ps -ef |grep nginx

kill -TERM nginx主进程号 

如果以上命令不管用,可以强制停止

kill -9 nginx主进程号

 

如果嫌麻烦可以不用查看进程号,直接使用命令进行操作
其中/usr/local/nginx/nginx.pid 为nginx.conf中pid命令设置的参数,用来存放nginx主进程号的文件
kill -信号类型(HUP|TERM|QUIT) cat /usr/local/nginx/nginx.pid
例如

nginx重启命令

nginx重启可以分成几种类型

1.简单型,先关闭进程,修改你的配置后,重启进程。
kill -QUIT cat /usr/local/nginx/nginx.pid
sudo /usr/local/nginx/nginx
2.重新加载配置文件,不重启进程,不会停止处理请求
3.平滑更新nginx二进制,不会停止处理请求

 

使用信号加载新的配置

Nginx 支持几个信号,能在它运行时控制其操作。其中最普通的是 15 ,用来中止运行的进程:

而最有趣的是能平滑改变 nginx 配置的选项(请注意,在重载前,要先测试一下配置文件):

 

当 nginx 接收到 HUP 信号,它会尝试先解析配置文件(如果指定配置文件,就使用指定的,否则使用默认的),成功的话,就应用新的配置文件(例如:重新打开日志文件或监听的套接 字)。之后,nginx 运行新的工作进程并从容关闭旧的工作进程。通知工作进程关闭监听套接字但是继续为当前连接的客户提供服务。所有客户端的服务完成后,旧的工作进程被关闭。 如果新的配置文件应用失败,nginx 将继续使用旧的配置进行工作。

 

平滑升级到新的二进制代码

你可以在不中断服务的情况下 - 新的请求也不会丢失,使用新的 nginx 可执行程序替换旧的(当升级新版本或添加/删除服务器模块时)。

首先,使用新的可执行程序替换旧的(最好做好备份),然后,发送 USR2 (kill -USR2 pid)信号给主进程。主进程将重命名它的 .pid 文件为 .oldbin (比如:/usr/local/nginx/logs/nginx.pid.oldbin),然后执行新的可执行程序,依次启动新的主进程和新的工作进程:

 

在这时,两个 nginx 实例会同时运行,一起处理输入的请求。要逐步停止旧的实例,你必须发送 WINCH 信号给旧的主进程,然后,它的工作进程就将开始从容关闭:

 

一段时间后,旧的工作进程处理了所有已连接的请求后退出,就仅由新的工作进程来处理输入的请求了:

 

这时,因为旧的服务器还尚未关闭它监听的套接字,所以,通过下面的几步,你仍可以恢复旧的服务器:

  • 发送 HUP 信号给旧的主进程 - 它将在不重载配置文件的情况下启动它的工作进程
  • 发送 QUIT 信号给新的主进程,要求其从容关闭其工作进程
  • 发送 TERM 信号给新的主进程,迫使其退出
  • 如果因为某些原因新的工作进程不能退出,向其发送 KILL 信号

新的主进程退出后,旧的主进程会由移除 .oldbin 前缀,恢复为它的 .pid 文件,这样,一切就都恢复到升级之前了。

如果尝试升级成功,而你也希望保留新的服务器时,发送 QUIT 信号给旧的主进程使其退出而只留下新的服务器运行:

 

  1. is Q
    2023年3月27日00:00 | #1

    文章内容有点老了,目前主流的发型版本应该都是使用systemd来管理进程了吧

  2. Martin
    2020年4月24日08:47 | #2

    @郑琦
    -s signal

  3. 郑琦
    2020年4月14日17:31 | #3

    nginx -s stop 的许多命令中 -s 是什么意思

  4. 22
    2019年4月19日09:41 | #4

    @大木爻手
    你那是将运行文件添加到/usr/sbin和/usr/bin,全局使用。

  5. ye
    2019年1月8日11:02 | #5

    不错!-!,以前学习的时候有提到过,不过很模糊,现在有个更清晰的认识

  6. icey
    2018年12月21日17:38 | #6

    @test
    因为不满足一个软件的简单使用方法,想要了解更多的运行原理等

  7. test
    2018年11月30日15:38 | #7

    @kkt
    所以是为什么呢

  8. kkt
    2018年11月23日17:20 | #8

    @大木爻手
    因为你不知道,不了解,才会问出这样的疑问吧?

  9. 大木爻手
    2018年10月17日10:47 | #9

    启动不是直接 nginx
    退出不是 nginx -s stop
    为什么文章要写的这么麻烦,杀线程?

  10. 2018年2月1日18:03 | #10

    学习了。不错。

  11. 2017年10月24日15:44 | #11

    abc :
    这个不错

  12. 2017年5月31日10:04 | #12

    不错,顶一个!!!!

  13. 2016年9月12日17:18 | #13

    有用!!!

  14. 2015年6月24日12:01 | #14

    ngnix :sudo service nginx configtest
    [FAIL] Testing nginx configuration: failed !

  15. ternus
    2015年6月13日20:02 | #15

    学习了,平滑升级这点命令有点少啊。

  16. abc
    2015年4月1日21:16 | #16

    这个不错

  17. 2015年2月9日15:02 | #17

    嗯 这一条很好,很重要

  18. Echo
    2014年1月13日22:33 | #18

    Nice~!

  19. pinefantasy
    2013年11月27日18:58 | #19

    通过传递参数给 ./configure 或使用 pid 指令,来改变该文件的位置。---这个没看懂,记住pid做什么呢

    • mood
      2013年11月27日21:32 | #20

      重启或者关闭的时候会读pid

    • 2014年4月15日07:36 | #21

      方便信号控制进程,不用每次都ps -ef |grep nginx来查看nginx的pid

  20. dayphosphor
    2013年10月15日17:39 | #22

    超不错~~

  21. jay61439476
    2012年12月24日10:09 | #23

    不错 这对实际生产很有帮助