Nginx報Too Many Open Files總結

最近有臺nginx服務器(Linux環境)運行的錯誤日誌,提示“Too many open files”,本文整理下我個人總結的解決方法:
1、檢查當前nginx服務master 進程 和 worker 進程的文件句柄限制
(1)在 Nginx 運行時,檢查當前 master 進程的限制:

cat /proc/$(cat /var/run/nginx.pid)/limits|grep open.files

Max open files            1024                 4096                 files

(2)檢查 worker 進程:

ps --ppid $(cat /var/run/nginx.pid) -o %p|sed '1d'|xargs -I{} cat /proc/{}/limits|grep open.files

Max open files            1024                 4096                 files     
Max open files            1024                 4096                 files 
Max open files            1024                 4096                 files 
Max open files            1024                 4096                 files

我們知道系統每打開一個文件,都會佔用一個文件描述符,而系統打開文件描述符是有上限的。在centos下默認值一般爲1024,可以通過命令查看:

# ulimit -n
1024
# ulimit -a
open files                      (-n) 1024

2、首先確定下系統內核允許文件打開數量的上限(內核級別的,默認值爲95086)

# sysctl -n -e fs.file-max
95086

調整方法:
# vi /etc/sysctl.conf
fs.file-max = 6815744
# sysctl -p
其他:比如限制fs.file-max最多隻能使用內存的10%
# grep -r MemTotal /proc/meminfo | awk '{printf("%d\n",$2/10)}' 

有關係統核心配置可以查看相應的man手冊:man sysctl,man sysctl.conf。
3、修改/etc/security/limits.conf文件,設置打開的文件數量上限。(系統級別的)

# vi /etc/security/limits.conf
*      soft    nofile  65535
*      hard    nofile  65535
*      soft    nproc   65535
*      hard    nproc   65535

其中第一行soft表示所有用戶打開文件的數量限制爲65535,如果超過這個數字則提示警告信息,但是依然可以打開文件。
第二行hard表示最大的打開文件數量不能超過65535,如果超過這個數字,則無法打開文件。
這裏也可以針對具體的用戶進行相應的設定。例如針對nginx用戶進行設定:

nginx soft nofile 65535
nginx hard nofile 65535

修改完這裏之後,退出shell重新登錄下機器查看

# ulimit -n
65535
# ulimit -a
open files                      (-n) 65535

注意:
1)、nofile代表文件句柄數量;soft nofile的值不能超過hard nofile的值
2)、如果修改完成,查看ulimit -n與ulimit -a顯示的結果依然是1024,排查如下:
(1)需要查看/etc/profile配置是否有設定ulimit相關配置,/etc/profile環境變量裏的參數配置最優先,會覆蓋limits.conf 裏的配置
(2)在Centos7系統中,使用Systemd替代了之前的SysV。/etc/security/limits.conf文件的配置作用域縮小了。/etc/security/limits.conf的配置,只適用於通過PAM認證登錄用戶的資源限制,它對systemd的service的資源限制不生效。因此登錄用戶的限制,通過/etc/security/limits.conf與/etc/security/limits.d下的文件設置即可。
對於systemd service的資源設置,則需修改全局配置,全局配置文件放在/etc/systemd/system.conf和/etc/systemd/user.conf,同時也會加載兩個對應目錄中的所有.conf文件/etc/systemd/system.conf.d/.conf和/etc/systemd/user.conf.d/.conf。system.conf是系統實例使用的,user.conf是用戶實例使用的。




# vi /etc/systemd/system.conf
DefaultLimitNOFILE=100000
DefaultLimitNPROC=65535

(3)如果還是不生效修改配置sshd_config,編輯login、system-auth、sshd文件添加pam_limits.so

# vi /etc/ssh/sshd_config
UsePAM yes
# systemctl restart sshd

# vi /etc/pam.d/login
# vi /etc/pam.d/system-auth
# vi /etc/pam.d/sshd

session   required     pam_limits.so

3)、如果上述的方法均無法解決,可以直接將 ulimit -SHn 65536 配置到nginx啓動腳本中(注意按第4點在nginx.conf配置文件中增加打開文件數量上限後操作。)

# vi /etc/init.d/nginx
ulimit  -SHn  65536
或是
# vi /usr/lib/systemd/system/nginx
ulimit  -SHn  65536
重新加載系統服務
# systemctl daemon-reload
# systemctl restart nginx

最後確認nginx主進程與work進程的文件打開數

# cat /proc/$(cat /var/run/nginx.pid)/limits|grep open.files
# ps --ppid $(cat /var/run/nginx.pid) -o %p|sed '1d'|xargs -I{} cat /proc/{}/limits|grep open.files

4、修改nginx配置文件,設置打開文件數量上限。(程序級別的)
在nginx.conf配置文件中增加如下設置:

# vi nginx.conf
worker_rlimit_nofile 65535;

Nginx報Too Many Open Files總結
該參數表示每個工作進程可以打開的文件數量。作用域和worker_processes一樣。
修改了nginx文件,需要reload一下。
以上就是個人總結的關於nginx錯誤日誌中提示“Too many open files”的問題處理方法,如果你還有其他更好的方法,歡迎補充。
nginx的安裝部署請查看文章:
nginx1.19.1自動安裝部署
nginx安裝與調優部署





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章