Nginx Too many open files


2019/07/25 08:31:31 [crit] 15929#15929: accept4() failed (24: Too many open files)
2019/07/25 08:31:31 [crit] 15930#15930: accept4() failed (24: Too many open files)
2019/07/25 08:31:31 [crit] 15930#15930: accept4() failed (24: Too many open files)
2019/07/25 08:31:31 [crit] 15930#15930: accept4() failed (24: Too many open files)
2019/07/25 08:31:31 [crit] 15930#15930: accept4() failed (24: Too many open files)
2019/07/25 08:31:31 [crit] 15930#15930: accept4() failed (24: Too many open files)
2019/07/25 08:31:31 [crit] 15930#15930: accept4() failed (24: Too many open files)
2019/07/25 08:31:31 [crit] 15930#15930: accept4() failed (24: Too many open files)
2019/07/25 08:31:31 [crit] 15930#15930: accept4() failed (24: Too many open files)
2019/07/25 08:31:31 [crit] 15930#15930: accept4() failed (24: Too many open files)
2019/07/25 08:31:31 [crit] 15930#15930: accept4() failed (24: Too many open files)
2019/07/25 08:31:31 [crit] 15930#15930: accept4() failed (24: Too many open files)
2019/07/25 08:31:31 [crit] 15930#15930: accept4() failed (24: Too many open files)

 

出現這個錯誤可能是由於系統的ulimit限制和nginx自身的配置有關系,先來了解下概念。
什么是ulimit?
ulimit命令用來限制系統用戶對shell資源的訪問。如果不懂什么意思,下面一段內容可以幫助你理解:
假設有這樣一種情況,當一台 Linux 主機上同時登陸了 10 個人,在系統資源無限制的情況下,這 10 個用戶同時打開了 500 個文檔,而假設每個文檔的大小有 10M,這時系統的內存資源就會受到巨大的挑戰。
ulimit 用於限制 shell 啟動進程所占用的資源,支持以下各種類型的限制:所創建的內核文件的大小、進程數據塊的大小、Shell 進程創建文件的大小、內存鎖住的大小、
常駐內存集的大小、打開文件描述符的數量、分配堆棧的最大大小、CPU 時間、單個用戶的最大線程數、Shell 進程所能使用的最大虛擬內存。同時,它支持硬資源和軟資源的限制。 簡單來說,ulimit描述符可以對用戶打開的文件數量進行限制(不止限制打開文件數量),讓單個用戶不至於打開較多的文件,導致系統奔潰或者資源不足的情況。

 

 

注意:修改 nginx 的 max open files 有個前提,就是你已經修改好了系統的 max open files.
修改系統中的 /etc/security/limits.conf文件中
 sudo vim /etc/security/limits.conf #在最后添加如下兩行
* soft nofile 65535
* hard nofile 65535
這是網上搜了很多教程,但是到此還是無法解決問題

上面修改了系統的 max open files,並不代表nginx的
先查看 nginx 的 ulimits: 
grep 'open files' /proc/$( cat /var/run/nginx.pid )/limits

  

 

發現nginx 的 max open files 並沒有變化

修改 nginx.service
sudo vim /lib/systemd/system/nginx.service # (僅適用於 ubuntu)
添加如下:
[Service]
LimitNOFILE=65535
重啟服務:
sudo systemctl daemon-reload
修改 nginx.conf,
添加:以下兩點
worker_rlimit_nofile 65535; # (has to be smaller or equal to LimitNOFILE set above)
events {
    worker_connections  65535;
}
重啟 nginx:
sudo systemctl restart nginx

然后再去查看nginx的 max open files,看看是不是我們設置的65535
grep 'open files' /proc/$( cat /var/run/nginx.pid )/limits
到此就修改nginx的max open files結束。

但是如果你已經把nginx 的max open files值改的很大了,但是還是會出現Too many open files 的錯誤,那說明你后端服務器處理請求的速度太慢了,或是 並發太高了。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM