字體:  

解決ubuntu nginx 啟動時,發生 (24:too many open files) 的錯誤

99770 發表於: 2019-12-07 21:00 來源: ADJ網路控股集團


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

QUOTE:

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 , 如下

QUOTE:

[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 ,這樣就搞定了