Nginx 預設每個 Worker Process 的最大連線數是 1024,這個對我們網站是不夠用的,那不夠用就會收到 socket() failed (24: Too many open files)
的錯誤訊息,於是就動手調整 Nginx 的參數,就在調整其中一個參數 worker_rlimit_nofile
的過程中,出現了下面的錯誤訊息:
setrlimit(RLIMIT_NOFILE, 65535) failed (1: Operation not permitted)
Google 了一下,問題的真實原因馬上就現形了,原來是 SELinux 做的怪,這是 CentOS 特有的一個安全機制,由於 Nginx 是一種 httpd 的服務,做為一個 HTTP 的服務它也成為了 SELinux 所針對的目標,因此我們只要在 SELinux 中,允許 httpd 來執行 setrlimit()
方法就可以了,指令如下:
sudo setsebool -P httpd_setrlimit 1
執行後,可以透過 ps -ef | grep nginx
指令可以查到 Nginx Worker Process 的 PID,之後再透過 cat /proc/$PID/limits
的指令就可以看到 Max open files
已經調整。
另外,我要特別提一下的就是,要解決「socket() failed (24: Too many open files)」的問題,網路上的教學很多都是教我們去調整 Linux 的系統參數,而且大都是套用在全系統上,其實 Nginx 自己本身就有參數可以調,不需要去動到 Linux 的系統參數,我們只需要調整兩個參數 worker_rlimit_nofile
及 worker_connections
問題就可以得到解決了。