Nginx 出現 500 Error 修復 (too many open file, connection)

Nginx 出現 500 Error, 錯誤訊息只能從 Log 查到, 有遇到下述兩種狀況:

  1. socket() failed (24: Too many open files) while connecting to upstream
  2. 512 worker_connections are not enough while connecting to upstream

在此紀錄解決方法.

Nginx "Too many open files" 修復

錯誤訊息

2011/05/01 23:00:49 [alert] 7387#0: *6259768 socket() failed (24: Too many open files) while connecting to upstream, client: 123.123.123.123, server: www.example.com, request: "GET [[/]] HTTP/1.1", upstream: "fastcgi://127.0.0.1:1234", host: "www.example.com"

解法
  1. $ sudo su - www-data
  2. $ ulimit -n # 看目前系統設定的限制 (ulimit -a # 可查看全部參數)

    1024

  3. vim /etc/security/limits.conf # 由此檔案設定 nofile (nofile - max number of open files) 的大小

    # 增加/修改 下述兩行
    * soft nofile 655360
    * hard nofile 655360

  4. ulimit -n # 登出後, 在登入, 執行就會出現此值

    655360

4. 若 ulimit -n 沒出現 655360 的話, 可使用 ulimit -n 655360 # 強制設定

5. 再用 ulimit -n 或 ulimit -Sn (驗證軟式設定)、ulimit -Hn (驗證硬式設定) 檢查看看(或 ulimit -a).

從系統面另外計算 + 設定

  1. lsof | wc -l # 計算開啟檔案數量
  2. sudo vim /etc/sysctl.conf
    fs.file-max = 3268890
  3. sudo sysctl -p

Nginx "512 worker_connections are not enough" 修復

錯誤訊息

2011/05/01 23:21:21 [alert] 19973#0: *6325881 512 worker_connections are not enough while connecting to upstream, client: 123.123.123.123, server: www.example.com, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:1234", host: "www.example.com"

解法
  1. /etc/nginx/nginx.conf

    worker_connections  10240;

  2. 參考 Nginx CoreModule

    worker_processes 2;
    worker_rlimit_nofile 10240;
    events {
    # worker_connections 10240;
    }

Nginx 的 connection 增加後, 整體速度會變慢很多, 主要原因是 php-cgi 不夠用, 所以要作以下調整.

php-cgi was started with phpfcgid_children="10" and phpfcgid_requests="500"
ab was run on another server, connect via a switch using GBit ethernet

參考此篇設定: PHP performance III -- Running nginx

  1. vim /etc/nginx/nginx.conf

    worker_connections 10240;
    worker_rlimit_nofile

  2. vim /etc/init.d/php-fcgi

    PHP_FCGI_CHILDREN=15
    PHP_FCGI_MAX_REQUESTS=1000
    改成
    PHP_FCGI_CHILDREN=512 # 或 150 慢慢加, 注意 MySQL connection 是否夠用
    PHP_FCGI_MAX_REQUESTS=10240

  3. 上述文章的 phpfcgid_stop(), 寫得還不錯, 有需要可以用看看.

    phpfcgid_stop() {
    echo "Stopping $name."
    pids=`pgrep php-cgi`
    pkill php-cgi
    wait_for_pids $pids
    }

相關網頁

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈Nginx 出現 500 Error 修復 (too many open file, connection)〉中有 6 則留言

  1. 这都改的什么呀
    第一个问题,解法1 才是正确的。to many open files 是因为打开的文件描述符数量达到了上限。

    第二个问题里
    PHP_FCGI_MAX_REQUESTS 是单个 fcgi 进程可以执行的最多请求数,在执行了这些请求后会被杀死重新开新进程,以避免内存泄漏等问题。

    1. 嗯嗯, 確實是您說得沒錯, 問題解決了之後, 沒有來更新此篇文章. Orz..
      剛剛已經更新了~ 謝謝您~ 🙂

  2. 再补充一下啊,open files 最好不要超过 65536,按 unix 标准,65536 是极限值。
    另外,实际配置上,这个值太大也有副作用,进程结束时的清理时间也会变长。

    1. 嗯嗯, 不過 65536 對我目前來說, 確實是不夠用.
      現在是設定 10240, 幸好離最大值還有點距離, 萬分感謝.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料