Nginx reload重新加载配置文件的异常情况
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重新加载配置文件的异常情况的更多相关文章
- Nginx常用命令(启动/重启/停止/测试配置文件/重新加载配置文件)
Nginx 安装后只有一个程序文件,本身并不提供各种管理程序,它是使用参数和系统信号机制对 Nginx 进程本身进行控制的. Nginx 的参数包括有如下几个: 使用: /usr/local/ngin ...
- Nginx自动加载配置文件方案
nginx自动加载配置文件方案一.nginx+consul+consul-template实现过程:consul作为服务发现软件,consul-template作为nginx配置文件的模板,consu ...
- nginx启动、重启、重新加载配置文件和平滑升级
Nginx有一个主进程和几个工作进程,主进程的主要作用就是读取.评估配置文件和管理工作进程,工作进程对请求做实际处理.工作进程的数量是在配置文件中配置的,一般设置为cpu的核心数*线程数. nginx ...
- Nginx下修改php.ini后重新加载配置文件命令
修改php.ini后 如,我的 php.ini 文件是放在 /etc/php.ini php 所在目录是 /www/Linux/php-5.2.17 修改 php.ini 后要用 php-fpm 来进 ...
- NGINX的启停命令、以及动态加载配置文件的命令
-- 启动(不推荐):在nginx目录下有一个sbin目录,sbin目录下有一个nginx可执行程序../nginx -- 启动(指定配置文件,推荐)/usr/local/nginx/sbin/ngi ...
- linux 上修改了nginx.conf 怎么重新加载配置文件生效
步骤如下先利用/usr/local/nginx/sbin/nginx -t测试配置文件修改是否正常/usr/local/nginx/sbin/nginx -s reload重新加载 nginx 更改配 ...
- []转帖]linux 上修改了nginx.conf 怎么重新加载配置文件生效
linux 上修改了nginx.conf 怎么重新加载配置文件生效 https://www.cnblogs.com/zhuyeshen/ 步骤如下先利用/usr/local/nginx/sbin/ng ...
- nginx-启动|关闭|重新加载配置文件的命令
1.1 进入操作目录 D: cd D:\NginxTest\nginx-1.10.2 1.2 启动指令 nginx -c conf\nginx.conf 1.3 关闭指令 nginx -s stop ...
- linux中为何每次修改完配置文件后都需要重新加载配置文件
1.大家刚接触linux时,可能会有这样的疑问:为什么每次修改完配置文件之后,总是要重新加载配置文件才能生效?或者需要重启后才能生效? 之前听过一个解释是这样子的: "修改了文件内容 ...
- spring加载配置文件
spring加载配置文件 1.把applicationContext.xml直接放在WEB-INF/classes下,spring会采用默认的加载方式2.采用在web.xml中配置ContextLoa ...
随机推荐
- 由浅入深理解C#中的事件
目录 本文较长,给大家提供了目录,可以直接看自己感兴趣的部分. 前言 有关事件的概念 示例 简单示例 标准 .NET 事件模式 使用泛型版本的标准 .NET 事件模式 补充 总结 参考 ...
- APM市场冰火两重天,或许只是行业无处安放的焦虑
近两年来,无论从国内还是到国外,市场出现一种APM批判的论调,甚至有"传统APM已经落后"的个别声音出现. 可放眼望去,国外主流APM厂商如:DATADOG. Dynatrace. ...
- Mybatis 源码6 结果集映射流程 ,mybatis插件实现原理和基于mybatis插件实现参数化类型TypeHandler
一丶前情回顾 书接上回,下面是SimpleExecutor执行查询的主要逻辑 prepareStatement 实现获取数据库连接, 其中连接是从Transaction.getConnection方法 ...
- 读书笔记丨远程服务调用和RESTful,如何分析和抉择?
摘要:相信未来REST规范将会变得更加流行和普及. 本文分享自华为云社区<云原生时代,远程服务调用和RESTful,如何分析和抉择?>,作者:breakDawn . 随着云原生的概念越来越 ...
- GaussDB(for openGauss)让数据“存得下、算得快、算得准”
摘要:本文从总体架构.数据分布方式.计算下推.数据强一致等方面进行介绍GaussDB(for openGauss). 1.前言 随着云计算规模越来越大,企业业务数据量呈指数级增长,传统数据库在海量数据 ...
- 什么是MircoPython?
摘要:互联网玩家为了让Python这样的容易学,简单易学.社区API丰富的语言可以在嵌入式领域用上,逐渐开始了一轮Python上嵌入式的迁移,这样就有了今天的主角--MircoPython. 本文分享 ...
- 最高提升10倍性能!揭秘火山引擎ByteHouse查询优化器实现方案
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 作为企业级数据库的核心组件之一,查询优化器的地位不可忽视.对于众多依赖数据分析的现代企业来说,一个强大且完善 ...
- .Net Core 多语言
StartUp.cs public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseEndpoint ...
- Python异步编程之yield from
yield from 简介 yield from 是Python3.3 后新加的语言结构,可用于简化yield表达式的使用. yield from 简单示例: >>> def gen ...
- 【源码系列#06】Vue3 Diff算法
专栏分享:vue2源码专栏,vue3源码专栏,vue router源码专栏,玩具项目专栏,硬核推荐 欢迎各位ITer关注点赞收藏 Vue2 Diff算法可以参考此篇文章[Vue2.x源码系列08]Di ...