Nginx reopen reload作用及工作过程

本文详细介绍了Nginx服务器的安装、配置文件重载及日志切割方法,探讨了如何通过发送信号实现配置更新和日志文件的无缝切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载 https://www.cnblogs.com/xd502djj/p/5594992.html

Nginx reopen reload作用及工作过程

2012-12-05  categories:nginx  author:sch

原创文章,转载请指明出处并保留原文url地址

一.Nginx简介

Nginx (“engine x”) 是俄罗斯人Igor Sysoev(塞索耶夫)编写的一款高性能的 HTTP 和反向代理服务器。Nginx 已经在俄罗斯最大的门户网站── Rambler Media(www.rambler.ru)上运行了4年时间,同时俄罗斯超过20%的虚拟主机平台采用Nginx作为反向代理服务器。在国内,已经有新浪博客、新浪播客、搜狐通行证、网易新闻、网易博客、金山逍遥网、金山爱词霸、校内网、YUPOO相册、豆瓣、迅雷看看等多家网站、频道使用 Nginx 服务器。

Nginx优点及介绍网络上非常多,大家自己去找一下

http://www.nginx.org/    下载

http://www.nginx.com/    文档及支持

这两个网站是nginx本身的网站,可以下载程序及查看文档。不过好像nginx文档一般不是很全。

二.Nginx安装

以centos为例安装nginx 供参考,详情参考nginx网站

编译Nginx的要求如下:

磁盘空间:需要保证有10MB以上的剩余磁盘空间。Nginx安装完毕后会占据4MB左右的磁盘空间,实际的磁盘空间需求会因编译设置和是否安装第三方模块而有所不同。

GCC编译器及相关工具:GCC全称为GNU Compiler Collection,  是GNU社区推出的功能强大、性能优越的用于编程开发的自由编译器,是GNU的代表作品之一,目前可以编译的语言包括:C、C++、Objective-C、Fortran、Java等。您必须确保您的操作系统安装有GCC编译器。

另外,您还必须安装Autoconf和Automake工具,它们用于自动创建功能完善的Makefile,当前大多数软件包都是用这一工具生成Makefile的,Nginx也不例外。在CentOS系统下,您可以使用yum命令安装GCC编译器及相关工具:

yum -y install gcc gcc-c++ autoconf automake

模块依赖性:Nginx的一些模块需要其他第三方库的支持,例如gzip模块需要zlib库,rewrite模块需要pcre库,ssl功能需要openssl库等。同样,如果是在CentOS系统下,我们可以使用yum命令安装或下载源码包编译安装这些模块依赖的库:

yum -y install zlib zlib-devel openssl openssl–devel pcre pcre-devel

Nginx在Linux环境下可以通过编译源码的方式来安装,最简单的安装命令如下:

tar zxvf nginx-版本号.tar.gz

cd nginx-版本号

./configure

make

make install

按照以上命令,Nginx将被默认安装到/usr/local/nginx目录下。

您可以通过/configure –help命令查看Nginx可选择的编译选项。

编译选项举例如下:

–prefix=<path>   Nginx安装路径。如果没有指定,默认为/usr/local/nginx

–sbin-path=<path>   Nginx可执行文件安装路径。只能安装时指定,如果没有指定,默认为<prefix>/sbin/nginx

–conf-path=<path>   在没有给定 –c 选项下默认的nginx.conf的路径。如果没有指定,默认为<prefix>/conf/nginx.conf

–pid-path=<path>     在nginx.conf中没有指定pid指令的情况下,默认的Nginx.pid的路径。如果没有指定,默认为<prerix>/logs/nginx.pid

三.Nginx命令

Nginx命令帮助如下

$ /opt/ngx/sbin/nginx -h

nginx version: nginx/0.8.45

Usage: nginx [-?hvVt] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:

  -?,-h         : this help   // 帮助

  -v            : show version and exit // 显示版本

  -V            : show version and configure options then exit // 显示版本及配置选项

  -t            : test configuration and exit // 测试配置文件,非常重要

  -s signal     : send signal to a master process: stop, quit, reopen, reload // 发送信号

  -p prefix     : set prefix path (default: /opt/nginx-0.8.45/)

  -c filename   : set configuration file (default: conf/nginx.conf) // 指定配置文件

  -g directives : set global directives out of configuration file

wps_clip_image-10198

上图是nginx官方网站对nginx信号的解释文档截取

下面是一些常见nginx命令

nginx -c /path/to/nginx.conf  // 以特定目录下的配置文件启动nginx:

nginx -s  reload  // 修改配置后重新加载生效

nginx -s  reopen   // 重新打开日志文件

nginx -s stop  // 快速停止nginx

nginx -s quit  // 完整有序的停止nginx

nginx -t     // 测试当前配置文件是否正确

nginx -t -c /path/to/nginx.conf  //测试特定的nginx配置文件是否正确

其他命令大家自己查资料了,一般都有介绍。下面我们来讨论一下

四.Nginx日志切割

为什么要切割日志?一般Nginx安装好后有些人会打开日志记录,有些人会关闭日志记录,打开日志记录的人一般都会把架设在Nginx上的所有网站日志都存在同一个文件里(比如我存在access.log日志文件里),这样日积月累所有网站的访问记录就会把日志文件越积越大,当需要查看日志文件的时候一看就是一大串,不方便查找。现在,如果我把每天的日志文件分割开来用相应的日期标识出来这样就大大方便查找了。

我是建议打开日志记录,日志记录里面存放着很多有用的东西。比如:浏览器名称,可以方便你对网站的排版做出调整;IP地址,如果网站收到攻击,你就可以查到那个IP地址。

Linux下我们可以简单的把日志文件mv走,但是你会发现mv走后新的日志文件没有重新生成,一般linux下用的文件句柄,文件被打开情况下你mv走文件,但是原来操作这个文件的进程还是有这个文件的inode等信息,原进程还是读写原来的文件,因此简单的mv是无法生效的。

因此建议过程如下

1. mv原文件到新文件目录中,这个时候 nginx还写这个文件(写入新位置文件中了)

2. 调用nginx -s  reopen用来打开日志文件,这样nginx会把新日志信息写入这个新的文件中

这样完成了日志的切割工作, 同时切割过程中没有日志的丢失。

五.Nginx配置文件重载

Nginx工作过程中,包括master进程,多个worker进程,worker进程负责具体的http等相关工作,master进程主要是进行控制等控制。当修改完成nginx的配置文件后,需要采用

nginx -t    测试被修改的配置文件是否正确,若是不正确继续修改,直到测试通过为止, 在测试过程中,对nginx工作没有任何影响(测试仅仅是master的工作,worker负责具体工作,测试中仅仅master测试一些配置文件结构定义等。)

wps_clip_image-7114

当新的配置文件测试通过后,我们可以通过

nginx -s  reload 命令加载修改后的配置文件,命令下达后发生如下事件

1. Nginx的master进程检查配置文件的正确性,若是错误则返回错误信息,nginx继续采用原配置文件进行工作(因为worker未受到影响)

2. Nginx启动新的worker进程,采用新的配置文件

3. Nginx将新的请求分配新的worker进程

4. Nginx等待以前的worker进程的全部请求已经都返回后,关闭相关worker进程

5. 重复上面过程,知道全部旧的worker进程都被关闭掉

以上过程是参考nginx官方的相关文档后得出。

 

 

 

<think>我们正在讨论的是`nginx -s reopen`命令是否会重启Nginx进程。据提供的引用内容,我们可以明确以下几点: 1. 引用[1]和引用[2]都解释了`nginx -s reopen`的作用:它用于重新打开日志文件,而不是重启Nginx进程。 2. 引用[1]特别指出,当默认的日志文件被移走或重命名后,执行该命令会创建一个新的默认日志文件,后续日志将写入这个新文件。如果默认日志文件仍然存在,则该命令不会产生效果。 3. 引用[2]和引用[3]展示了日志切割的典型步骤:先移动/重命名旧日志文件,然后执行`nginx -s reopen`命令,让Nginx重新打开新的日志文件。 因此,可以明确回答:**`nginx -s reopen`命令不会重启Nginx进程**。它只是向Nginx主进程发送一个信号,要求重新打开日志文件。这个过程不会中断Nginx的服务,也不会重启工作进程。 ### 详细解释: - **Nginx信号处理机制**:Nginx主进程可以接收多种信号,例如: - `-s stop`:立即停止服务 - `-s quit`:优雅停止服务(等待处理完当前连接) - `-s reload`:重新加载配置文件(会重启工作进程,但不停止服务) - `-s reopen`:重新打开日志文件 - **`reopen`的工作原理**: 1. 当执行`nginx -s reopen`时,主进程会接收到`USR1`信号。 2. 主进程通知所有工作进程重新打开日志文件(通过重新打开文件描述符)。 3. 工作进程关闭旧的日志文件描述符,并打开新的日志文件(如果原文件被移动,则创建新文件)。 4. **整个过程不涉及进程重启**,服务持续运行,不会中断。 ### 验证方法: 1. **观察进程ID**: - 执行`ps -ef | grep nginx`记录主进程ID - 执行`nginx -s reopen` - 再次检查进程ID,主进程和工作进程的ID都不会改变 2. **日志验证**: - 重命名当前日志文件(如`mv access.log access_old.log`) - 执行`nginx -s reopen` - 观察新产生的`access.log`文件,日志会继续写入 ### 注意事项: - 在Windows系统中,执行命令需使用完整路径(如`D:\nginx\nginx.exe -s reopen`)[参考之前回答]。 - 确保执行命令的用户有权限操作Nginx进程和日志目录。 ### 相关问题: 1. `nginx -s reload`和`nginx -s reopen`有什么区别? 2. 如何在不中断服务的情况下进行Nginx日志切割? 3. Windows环境下如何正确发送信号给Nginx进程? 4. 为什么移动日志文件后Nginx还能继续写入原文件? 5. Nginx主进程和工作进程之间如何通信? [^1]: 引用自用户提供的引用[1] [^2]: 引用自用户提供的引用[2] [^3]: 引用自用户提供的引用[3]</think>### `nginx -s reopen` 是否会重启 Nginx 进程? **明确结论:不会重启 Nginx 进程** 通过分析引用内容和 Nginx 官方机制,可以确认: 1. **核心作用不同** - `nginx -s reopen` 是**日志文件操作指令**(向主进程发送 `USR1` 信号)[^1][^2] - `nginx -s reload` 才是**重启工作进程**的指令(发送 `HUP` 信号) 2. **操作原理** - 仅要求 Nginx **重新打开日志文件**(关闭旧文件描述符 → 创建新文件描述符)[^1][^3] - 进程 PID 保持不变,服务持续运行(无中断) - 典型应用场景:日志切割后重建日志文件[^2][^3] ```bash mv access.log access_$(date +%Y%m%d).log # 1. 移动旧日志 nginx -s reopen # 2. 触发重建新日志文件 ``` 3. **验证方法** - **检查进程ID**:执行前后 `ps aux | grep nginx` 对比 PID 不变 - **观察服务状态**:正在处理的请求不会中断 - **日志行为**: - 原日志文件存在时 → 指令无效[^1] - 原文件被移走 → 新建日志文件并继续写入[^2] --- ### 图解执行过程 ```mermaid graph LR A[执行 nginx -s reopen] --> B[主进程接收 USR1 信号] B --> C[通知所有工作进程] C --> D[工作进程关闭当前日志文件描述符] D --> E[按配置路径重新打开日志文件] E --> F{原文件是否存在?} F -->|存在| G[继续写入原文件] F -->|不存在| H[创建新文件并写入] ``` --- ### 与重启指令的对比 | 指令 | 信号 | 进程变化 | 服务中断 | 主要作用 | |---------------------|-------|----------------|----------|------------------------| | `nginx -s reopen` | USR1 | 无 | 否 | 重新打开日志文件 | | `nginx -s reload` | HUP | 工作进程重启 | 否 | 重新加载配置 | | `nginx -s stop` | TERM | 全部进程终止 | 是 | 立即停止服务 | --- ### 相关问题 1. 为什么移动日志文件后 Nginx 仍能写入旧文件?[^1] 2. `nginx -s reload` 和 `nginx -s reopen` 有何本质区别? 3. 如何验证 `nginx -s reopen` 是否成功生效? 4. Windows 系统下发送 USR1 信号有哪些限制? 5. 日志切割时为什么需要先移动文件再执行 reopen?[^2][^3] [^1]: 基于文件描述符机制,移动文件不影响已打开的描述符 [^2]: 需先移走文件使原描述符失效,再触发新建文件 [^3]: 操作后需验证新日志文件生成和写入状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值