[廚餘回收] 調整 Nginx 的最大連線數遇到 setrlimit(RLIMIT_NOFILE, 65535) failed (1: Operation not permitted) 錯誤訊息

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_nofileworker_connections 問題就可以得到解決了。

參考資料

C# 指南 ASP.NET 教學 ASP.NET MVC 指引
Azure SQL Database 教學 SQL Server 教學 Xamarin.Forms 教學