Nginx reload重新加载配置文件的异常情况


背景

临近年底, 很多业务工作量都上来了.
今天同事告知, nginx的log 里面出现了大量的 too many openfiles 的提示信息.
并且同事明确说明, 已经修改了/etc/secuirty/limits.conf 以及 worker_connections 这两个参数.
并且已经第一时间执行了reload 的操作.
理论上不应该再出现这个提示了才对.
基于这个问题场景, 简单总结一下这次的问题以及简单应对.

结论

nginx -s reload
其实是一个 soft 的过程.
他需要等待 nginx 的worker 处理完手工的工作再重新拉起来一个进程进行工作.
所以有一定的概率会出现 有的worker 一直繁忙, 无法清理已有的链接, 导致一直无法重新加载配置文件. 这里就有两个问题. 加载配置文件 会使用用户的 security的配置进行生效.
并且使用nginx.conf 里面的新内容
如果一直无法重启进程, 那么大的最大文件打开数是不会发生变化的. 优雅都是有成本的, 不仅仅是生活, 程序也是如此.

论据

在 anything is file 的linux 系统中.
会通过文件的方式记录 运行程序的全部内容.
/proc/$pid 里面
其中 fd 应该是打开的文件句柄信息
limits 应该是配置限制信息:
可以通过如下命令进行确认:
ps -eo lstart,etime,time,cmd |grep nginx
# 查看每个nginx进程的启动时间等信息.
# 如果看到 worker进程不一致的时间, 可能就是存在一定的问题.
for i in `ps -ef |grep nginx |grep -v grep |awk '{print $2}'`; do echo $i ; cat /proc/$i/limits |grep "open files"; done
# 查看每个nginx进程的限制信息.
# 可以看到他的配置情况 如果有几个 worker 进程还处于 reload 之前的时间点启动的
那么很有可能 修改的配置还未生效. 所以建议稳妥起见在非工作时间 还行一下 restart 最好不过.

关于两个参数-worker_rlimit_nofile

worker_rlimit_nofile
worker_connections 这两个参数是不一样的维度.
第一个: worker_rlimit_nofile
worker_rlimit_nofile 如果这个参数没有设置
那么默认就去用户的limit限制信息. 如果这个参数设置了就会覆盖 用户的limit限制, 并且可以可以低
并且是针对一个worker进程来的. 可以根据下面的设置明显的看出来
这个只是影响worker的线程信息, 不影响 master的
并且可以脱离nofile系统设置 所以如果没有系统管理员权限的话, 可以作为一个使用点进行优化.

[root@auto109 fd]# ulimit -n
66666 # 不加参数
[root@auto109 fd]# for i in `ps -ef |grep nginx |grep -v grep |awk '{print $2}'`; do echo $i ; cat /proc/$i/limits |grep "open files"; done
9529
Max open files 66666 66666 files
9530
Max open files 66666 66666 files
[root@auto109 fd]# vim /usr/local/nginx/nginx.conf
[root@auto109 fd]# systemctl restart nginx # 参数为 102400
[root@auto109 fd]# for i in `ps -ef |grep nginx |grep -v grep |awk '{print $2}'`; do echo $i ; cat /proc/$i/limits |grep "open files"; done
16515
Max open files 66666 66666 files
16516
Max open files 102400 102400 files # 修改参数为 1024
[root@auto109 fd]# vim /usr/local/nginx/nginx.conf
[root@auto109 fd]# systemctl restart nginx
[root@auto109 fd]# for i in `ps -ef |grep nginx |grep -v grep |awk '{print $2}'`; do echo $i ; cat /proc/$i/limits |grep "open files"; done
17209
Max open files 66666 66666 files
17210
Max open files 1024 1024 files
[root@auto109 fd]#

关于参数-worker_connections

需要注意 要区分 nginx是作为应用服务器还是作为反向代理服务器.
http1.1 一个chrome浏览器可以打开 六个tcp链接. 理论上就需要nginx 开启至少6个文件openfile 如果是反向代理可能要乘以 2 所以应用服务器能够支撑的 在线用户信息可能为: worker的数量 * min[worker_connections , worker_rlimit_nofile}/12 所以还是需要关注这个参数的.

Nginx reload重新加载配置文件的异常情况的更多相关文章

  1. Nginx常用命令(启动/重启/停止/测试配置文件/重新加载配置文件)

    Nginx 安装后只有一个程序文件,本身并不提供各种管理程序,它是使用参数和系统信号机制对 Nginx 进程本身进行控制的. Nginx 的参数包括有如下几个: 使用: /usr/local/ngin ...

  2. Nginx自动加载配置文件方案

    nginx自动加载配置文件方案一.nginx+consul+consul-template实现过程:consul作为服务发现软件,consul-template作为nginx配置文件的模板,consu ...

  3. nginx启动、重启、重新加载配置文件和平滑升级

    Nginx有一个主进程和几个工作进程,主进程的主要作用就是读取.评估配置文件和管理工作进程,工作进程对请求做实际处理.工作进程的数量是在配置文件中配置的,一般设置为cpu的核心数*线程数. nginx ...

  4. Nginx下修改php.ini后重新加载配置文件命令

    修改php.ini后 如,我的 php.ini 文件是放在 /etc/php.ini php 所在目录是 /www/Linux/php-5.2.17 修改 php.ini 后要用 php-fpm 来进 ...

  5. NGINX的启停命令、以及动态加载配置文件的命令

    -- 启动(不推荐):在nginx目录下有一个sbin目录,sbin目录下有一个nginx可执行程序../nginx -- 启动(指定配置文件,推荐)/usr/local/nginx/sbin/ngi ...

  6. linux 上修改了nginx.conf 怎么重新加载配置文件生效

    步骤如下先利用/usr/local/nginx/sbin/nginx -t测试配置文件修改是否正常/usr/local/nginx/sbin/nginx -s reload重新加载 nginx 更改配 ...

  7. []转帖]linux 上修改了nginx.conf 怎么重新加载配置文件生效

    linux 上修改了nginx.conf 怎么重新加载配置文件生效 https://www.cnblogs.com/zhuyeshen/ 步骤如下先利用/usr/local/nginx/sbin/ng ...

  8. nginx-启动|关闭|重新加载配置文件的命令

    1.1 进入操作目录 D: cd D:\NginxTest\nginx-1.10.2 1.2 启动指令 nginx -c conf\nginx.conf 1.3 关闭指令 nginx -s stop ...

  9. linux中为何每次修改完配置文件后都需要重新加载配置文件

    1.大家刚接触linux时,可能会有这样的疑问:为什么每次修改完配置文件之后,总是要重新加载配置文件才能生效?或者需要重启后才能生效?   之前听过一个解释是这样子的:   "修改了文件内容 ...

  10. spring加载配置文件

    spring加载配置文件 1.把applicationContext.xml直接放在WEB-INF/classes下,spring会采用默认的加载方式2.采用在web.xml中配置ContextLoa ...

随机推荐

  1. 【ASP.NET Core】使用SignalR推送服务器日志

    一个多月前接手了一个产线机器人项目,上位机以读写寄存器的方式控制机器人,服务器就是用 ASP.NET Core 写的 Web API.由于前一位开发者写的代码质量问题,导致上位机需要16秒才能启动.经 ...

  2. vulntarget-c-wp

    vulntarget-c 信息收集 扫开的端口有web服务 访问了web页面,发现用的是laravel框架 搜索一下历史漏洞,在gayhub上找到这个可以用,能够执行简单命令 python3 expl ...

  3. STM32CubeMX教程9 USART/UART 异步通信

    1.准备材料 开发板(正点原子stm32f407探索者开发板V2.4) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK ...

  4. springboot的启动器

    前言 ~ 面试的时候,被问到springboot 官方提供的启动器常见的有哪些?(头大) 正文 ~ 启动器作用: 启动器是为了 适应 一个特定的场景的,里面定义了 这个场景下 需要用到的依赖. 启动器 ...

  5. POJ 1156 单调队列优化

    原题链接 题意 给我们一个n * m矩阵,要求我们求出一个面积最大的子矩阵,满足其内部的极差小于等于c, 同时宽度小于等于100 输入 m, n, c,求这个最大面积.n,m <= 700,c ...

  6. Boost Your Strategy With The Content Marketing Tools

    Boost Your Strategy With The Content Marketing Tools In today's digital landscape, content marketing ...

  7. Java 获取Excel中的表单控件

    Excel中可通过[开发工具]菜单栏下插入表单控件,如文本框.单选按钮.复选框.组合框等等,插入后的控件可执行设置控件格式,如大小.是否锁定.位置.可选文字.数据源区域.单元格链接等.当Excel中已 ...

  8. 第四部分_Shell脚本数组和其他变量

    数组定义 ㈠ 数组分类 普通数组:只能使用整数作为数组索引(元素的下标) 关联数组:可以使用字符串作为数组索引(元素的下标) ㈡ 普通数组定义 可以切片 一次赋予一个值 #数组名[索引下标]=值 ar ...

  9. 小熊派开发实践丨小熊派+合宙Cat.1接入云服务器

    摘要:使用小熊派开发板,以合宙的AIR724为通信模组(Cat.1),以AT指令方式,通过mqtt协议接入云服务器. 本贴使用小熊派开发板+合宙的Air724(Cat.1模组),接入自己搭建的EMQ服 ...

  10. 网络ping不通,试试这8招

    摘要:网络ping不通,该怎么办?本文教你8个大招,轻松找到问题根源. 本文分享自华为云社区<网络ping不通,该怎么办?>,作者:wljslmz. 如下图,PC(192.168.10.1 ...