Nginx報錯“Too many open files”的問題解決
1. 調整系統(tǒng)級文件描述符限制
a. 臨時生效(重啟后失效):
ulimit -n 65535 # 設置當前會話的打開文件數限制
b. 永久生效:
編輯 /etc/security/limits.conf,末尾添加:
* soft nofile 65535 * hard nofile 65535 nginx soft nofile 65535 # 如果Nginx以nginx用戶運行 nginx hard nofile 65535
保存后退出,重啟系統(tǒng)或重新登錄會話生效。
2. 調整Nginx配置
編輯Nginx主配置文件(通常為/etc/nginx/nginx.conf):
# 在全局塊添加
worker_rlimit_nofile 65535; # 設置每個worker進程最大可打開文件數
events {
worker_connections 4096; # 每個worker允許的并發(fā)連接數
multi_accept on; # 允許一次性接受多個連接
}
http {
...
}
- 關鍵公式:
worker_rlimit_nofile ≥ worker_connections × worker_processes worker_processes默認為CPU核心數,可通過auto自動設置。
3. 檢查系統(tǒng)全局文件描述符上限
cat /proc/sys/fs/file-max # 查看系統(tǒng)全局限制 # 若需臨時修改: sysctl -w fs.file-max=200000 # 永久生效: echo "fs.file-max=200000" >> /etc/sysctl.conf sysctl -p
4. 檢查Nginx當前打開文件數
# 獲取Nginx主進程PID ps -ef | grep nginx | grep master # 查看該進程打開的文件數 lsof -p <PID> | wc -l
若接近限制,需進一步優(yōu)化或排查泄漏。
5. 排查文件描述符泄漏
檢查后端應用:確認是否存在未關閉的數據庫連接、文件句柄或HTTP連接。
啟用Nginx長連接(減少頻繁開閉):
http {
keepalive_timeout 60;
keepalive_requests 100;
}
日志分析:檢查是否有異常請求導致資源未釋放,如頻繁訪問50x.html可能需優(yōu)化錯誤處理。
6. 重啟Nginx生效配置
nginx -t # 驗證配置語法 systemctl restart nginx # 根據系統(tǒng)選擇重啟命令
7. 監(jiān)控與驗證
實時監(jiān)控文件描述符:
watch -n 1 "ls /proc/$(pgrep nginx)/fd | wc -l"
日志跟蹤:觀察錯誤是否減少或消失。
補充說明
- 時間戳異常:日志中時間為2025年,需檢查系統(tǒng)時間或日志配置,避免誤導問題定位。
- 容器化環(huán)境:若Nginx運行在容器中,需在宿主機和容器內同時調整限制。
通過上述步驟,可有效解決因文件描述符不足導致的Nginx報錯問題。
到此這篇關于Nginx報錯“Too many open files”的問題解決的文章就介紹到這了,更多相關Nginx Too many open files內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
nginx php-fpm中啟用慢日志配置(用于檢測執(zhí)行較慢的PHP腳本)
這篇文章主要介紹了nginx php-fpm中啟用慢日志配置,php-fpm慢日志slowlog設置可以讓我們很好的看見哪些php進程速度太慢而導致的網站問題,可以讓我們方便的找到問題的所在,需要的朋友可以參考下2014-05-05

