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 ...
随机推荐
- DDD落地实践-架构师眼中的餐厅 | 京东云技术团队
本文以餐厅场景为叙事主线,以领域驱动为核心思想,结合架构设计与功能设计方法论.是从领域分析到落地的全过程案例,内容偏重于落地,因此不乏一些探讨,欢迎指正. 文章较长.全程干货.耐心读完.必有收获. 本 ...
- Python——第二章:字典的循环、嵌套、"解构"(解包)
字典进阶操作 -- 循环和嵌套 字典的循环 我们先看直接打印字典的样子,会分别对每对key:value进行打印,并使用,分隔他们 dic = { "赵四": "特别能歪嘴 ...
- MyBatis 的缓存处理
作为常见的 ORM 框架,在使用 MyBatis 的过程中可以针对相关的查询进行缓存处理以提高查询的性能.本文将简要介绍一下 MyBatis 中默认的一级缓存和二级缓存,以及自定义缓存的处理 MyBa ...
- vue音频(监听播放完成)
<template> <div> <audio ref="audio" :src="audioSrc"></audio ...
- 3、Container容器组件
Container容器组件 代码 import 'package:flutter/material.dart'; void main() { runApp(MaterialApp( hom ...
- dart的语法
dart的语法 main方法 main(){ print("有返回值"); } void main() { print("没有返回值"); } 字符串的定义的方 ...
- 从零开始学习python | 实例讲解如何制作Python模式程序
摘要:在本文中,我们将学习python中的各种模式程序. Python编程语言很容易学习.易于语法实现的各种库使其脱颖而出,这是它成为本世纪最流行的编程语言的众多原因之一.虽然学习很容易,但访问员通常 ...
- C# CRC8
C# CRC8 C# /// /// This enum is used to indicate what kind of checksum you will be calculating. /// ...
- 测试如何定位判断是前端的bug还是后端bug
测试如何定位判断是前端的bug还是后端bug 软件测试工程师的职责是发现BUG,此外,如何体现个人价值,只是提出问题而不去解决,问题就永远得不到闭环.所以,一个资深的测试人员的基本功应该是这样的:深挖 ...
- 【已解决】无法打开.xlsx文件,xlrd.biffh.XLRDError: Excel xlsx file; not supported
原因是最近xlrd更新到了2.0.1版本,只支持.xls文件.所以x1 = xlrd.open_workbook("data.xlsx")会报错. 可以安装旧版xlrd,在cmd中 ...