Nginx報錯: "Too many open files accept" 和 "could not build the server_names_hash"

散盡浮華發表於2016-08-28

 

                                                                                                                                                                 

一、訪問Nginx時,報錯:"accept() failed (24: Too many open files)"
原因時:nginx的連線數超過了系統設定的最大值造成的.
處理辦法如下: 

[root@kvm-server nginx]# ulimit -n
1024
[root@kvm-server nginx]# ulimit -n 655360       #把開啟檔案數設定足夠大,這是臨時修改方案
[root@kvm-server nginx]# ulimit -n
655360

同時修改nginx.conf檔案,新增下面內容,然後重啟nginx
worker_rlimit_nofile 655350;

這樣就可以解決Nginx連線過多的問題,Nginx就可以支援高併發。
另外, ulimit -n 還會影響到mysql 的併發連線數。提高檔案連線數設定,也能提高mysql併發。

注意: 用ulimit -n 655360 修改只對當前的shell有效,退出後失效。所以,需要永久性修改
永久生效方法:
修改/etc/security/limits.conf,在檔案底部新增:
* soft nofile 655360
* hard nofile 655360
星號代表全域性, soft為軟體,hard為硬體,nofile為這裡指可開啟檔案數。

另外,要使limits.conf檔案配置生效,必須要確保 pam_limits.so 檔案被加入到啟動檔案中。
檢視 /etc/pam.d/login 檔案中有:
session required /lib/security/pam_limits.so

這樣,問題就迎刃而解了!

ulimit : 設定最大程式數和最大檔案開啟數, 這個一般是系統優化的必要手段.

1) 臨時修改
為了優化linux效能,可能需要修改這個最大值。臨時修改的話ulimit -n 655360就可以了,重啟後失效。
[root@localhost ~]# ulimit -n
1024
[root@localhost ~]# ulimit -n 655360
[root@localhost ~]# ulimit -n
655360

2) 永久修改
修改/etc/security/limits.conf檔案, 在檔案末尾新增
[root@localhost ~]# vim /etc/security/limits.conf

* soft nofile 655360
* hard nofile 655360
* soft nproc 655360
* hard nproc 655360

=============================
上面配置內容中:
*               代表針對所有使用者 
noproc     是代表最大程式數 
nofile      是代表最大檔案開啟數

如上修改後重啟服務或伺服器,如果發現沒更改過來, 還需要修改下面樑文檔案

在/etc/security/limits.d/90-nproc.conf檔案末尾新增
[root@localhost ~]# vim /etc/security/limits.d/90-nproc.conf
* soft nproc 655360
* hard nproc 655360

在/etc/security/limits.d/def.conf檔案末尾新增
[root@localhost ~]# vim /etc/security/limits.d/def.conf
* soft nofile 655360
* hard nofile 655360

然後重啟後生效

                                                                                                                                                               

二、重啟Nginx時, 出現報錯提示: "could not build the server_names_hash, you should increase server_names_hash_bucket_size: 64"

解釋說明: 儲存伺服器名字的hash表是由指令 server_names_hash_max_size 和 server_names_hash_bucket_size所控制的。引數hash bucket size總是等於hash表的大小,並且是一路處理器快取大小的倍數。在減少了在記憶體中的存取次數後,使在處理器中加速查詢hash表鍵值成為可能。如果 hash bucket size等於一路處理器快取的大小,那麼在查詢鍵的時候,最壞的情況下在記憶體中查詢的次數為2。第一次是確定儲存單元的地址,第二次是在儲存單元中查詢鍵值。因此,如果Nginx給出需要增大 hash max size 或 hash bucket size的提示,那麼首要的是增大前一個引數的大小.

解決辦法:在nginx配置檔案nginx.conf裡的http{}段增加一行配置"server_names_hash_bucket_size 64;" ,如果64還不夠,那麼就按32的倍數往上加,比如128或256或512。

相關文章