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 的錯誤,那說明你后端服務器處理請求的速度太慢了,或是 並發太高了。