Nginx 的服務器使用越來越普遍,主要因為他的性能大大優於Apache2。但在使用過程中往往遇到一些問題,下面這個就是其中之一:
有一臺ubuntu 16.04的proxy server訪問量非常高,裡面的虛擬主機設定檔超過1000個domain以上,最近發現錯誤日誌不停報以下錯誤:
2019/12/06 08:53:49 [alert] 13576#0: open("/dev/null") failed (24: Too many open files)
2019/12/06 08:53:49 [alert] 13576#0: open("/dev/null") failed (24: Too many open files)
2019/12/06 08:53:49 [alert] 13576#0: open("/dev/null") failed (24: Too many open files)
這種錯誤容易讓人摸不著頭緒,不知道是哪裡出了問題,配置檢查過沒問題。程序代碼的錯誤也不應該是這個錯誤信息啊。
原來其原因是Linux 設置了打開文件的數目限制,解決方法如下:
簡單修改方法:
使用如下命令可以把打開文件數設置足夠大
# ulimit -n 65536
同時修改nginx.conf添加
worker_rlimit_nofile 65536;
這樣就可以解決Nginx連接過多的問題,Nginx就可以支持高並發。
注意: 用ulimit -n 65535 修改只對當前的shell有效,退出後失效。
所以還是要通過下面的修改,讓數值永久生效
一、通過修改硬件配置來實現更改
你可以使用’ulimit’命令來查看系統文件限制。
# ulimit -Hn
# ulimit -Sn
在nginx服務器可以打開的文件數量受你操作系統的限制,編輯
/etc/sysctl.conf 添加如下內容:
# open files
fs.nr_open = 65536
fs.file-max = 65536
保存退出,從新讀取系統配置
# sysctl -p
再編輯
/etc/security/limits.conf 添加內容:
* soft nofile 65536
* hard nofile 65536
星號代表全域性, soft為軟體,hard為硬體,nofile為這裡指可開啟檔案數。把以上兩行內容加到 limits.conf檔案中即可。
再編輯
/root/.profile 在最下面加上
# Load ulimit
ulimit -HSn 65536
此修改內容需要reboot系統才能生效,所以務必從新啟動下服務器。
二、再來這邊的修訂是網路上很少提及的.也就是當你提高了系統的檔案開啟上限之後,實際上nginx並不會增加open files的上限,你可以透過以下指令檢查
這也是找好久,才找到問題的所在,在CentOS 改完後,nginx 啟用上限就會變更,但是 ubuntu 16.04 不會,所以還需要做一個調整
#
vi /proc/$(cat /var/run/nginx.pid)/limits引用:
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 15681 15681 processes
Max open files 1024 4096 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 15681 15681 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
當你看到 open files 還停留在1024 時,就表示上面的調整沒用, nginx 啟用還是會報錯.要在改這個:
#
vi /etc/systemd/system/multi-user.target.wants/nginx.service
在 [Service] 的區塊內,加上 LimitNOFILE=65536 , 如下
引用:
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed
LimitNOFILE=65536
# systemctl daemon-reload
存檔後,重新載入設定並啟動 nginx 就可以發現 open files 提高為 65536 ,這樣就搞定了