Nginx のエラー500対応のためにファイルオープンのリソースを増やす
Nginx を使っているとHTTP ステータスエラー 500 が出力されることがあります。
これは、
Internal Server Error:サーバ内部エラー
サーバ内部にエラーが発生した場合に返される。
例として、CGIとして動作させているプログラムに文法エラーがあったり、設定に誤りがあった場合などに返される。
となっています。
一般的には、phpなどのスクリプトなどでエラーが発生した場合、このエラー500が返信されます。
しかし、nginxでは、リソース不足(ファイルのオープンエラー)でも、この500が返信されます。
この違いは、nginxのエラーログを確認すると概ね判断できます。
以下のようなエラーが出力されている場合は、ほぼ間違いなくリソース不足を起こしています。
2011/08/27 11:23:20 [alert] 15591#0: accept() failed (24: Too many open files) while accepting new connection on 0.0.0.0:80
|
phpでエラーが発生した場合、
以下のようにエラーが出力されます。
2011/08/27 11:23:20 [error] 7049#0: *2972555 FastCGI sent in stderr: "PHP Parse error: syntax error, unexpected '?' in /var/www/html/wordpress/wp-content/plugins/runPHP/runPHP.php(410) : eval()'d code on line 1" while reading response header from upstream, client: 127.0.0.1, server: example.com, request: "GET / HTTP/1.0", upstream: "fastcgi://127.0.0.1:8080", host: "example.com", referrer: "http://example.com"
|
今回は、Nginx のエラー500対応の仕方を簡単に解説してみたいと思います。
主に、ファイルオープンのリソースを増やす方法についての解説になります。
Nginx のエラー500対応の仕方
まずは、簡単にNginxでエラーが発生した場合の対処手順を簡単に解説しておきます。
- アクセスログで、エラーが発生したアドレスを確認する。
例)
66.249.69.54 - - [29/Aug/2011:06:02:31 +0900] "GET / HTTP/1.1" 500 65200 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" "-" "-"
|
- エラーログで、先のアクセスログでエラーが発生した日時から、エラー内容を確認する。
例)
2011/08/29 06:02:31 [error] 7049#0: *2972555 FastCGI sent in stderr: "PHP Parse error: syntax error, unexpected '?' in /var/www/html/wordpress/wp-content/plugins/runPHP/runPHP.php(410) : eval()'d code on line 1" while reading response header from upstream, client: 127.0.0.1, server: example.com, request: "GET / HTTP/1.0", upstream: "fastcgi://127.0.0.1:8080", host: "example.com", referrer: "http://example.com"
|
ここの例は、PHPの文法エラーですから、この情報からphpのスクリプトコードに誤りがあるのですから、見直しなり、デバッグなりやって解決します。
例)
2011/08/29 06:02:31 [alert] 15591#0: accept() failed (24: Too many open files) while accepting new connection on 0.0.0.0:80
|
このようなエラーが発生している場合、ファイルのオープンエラーですから、以降のファイルオープンエラーが発生しているときの対処例を参照してください。
アクセスログ、エラーログは、nginx設定ファイルで確認できます。
nginx設定ファイル :
nginx.conf
...
access_log /var/log/httpd/access.log;
error_log /var/log/nginx/error.log;
...
|
ファイルオープンエラーが発生しているときの対処例
リソース不足と言っても一つの対策という訳ではありません。そのリソース不足の種類を確認し、その対処法を簡単に解説してみます。
- ディスク容量に空きがあるか確認する。
$ df -h
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/hda2 18G 8.2G 8.7G 49% /
/dev/hda1 99M 12M 82M 13% /boot
tmpfs 250M 0 250M 0% /dev/shm
|
このように出力されます。ここで使用率(%)が90%を超えているようなら、
喫緊で必要のないファイル、ディレクトリを削除して空き容量を増やしましょう。
- ディレクトリのパーミッションが正しく設定されているか確認する。
一般的に使われるテンポラリディレクトリ、キャッシュディレクトリ、ログディレクトリについて確認しておきましょう。
$ ls -ld /tmp
drwxrwxrwt 3 root root 4096 8月 1 18:18 /tmp
|
このように出力されます。ここでパーミッションが1777(drwxrwxrwt) になっていない場合は、chmod で解放しておきましょう。
nginx関連のテンポラリディレクトリは、以下のように設定ファイルで確認できます。
nginx設定ファイル :
nginx.conf
...
proxy_temp_path /var/cache/nginx/temp;
...
|
pgp-fpm設定ファイル :
php-fpm.conf
...
<value name="environment">
<value name="HOSTNAME">$HOSTNAME</value>
<value name="PATH">/usr/local/bin:/usr/bin:/bin</value>
<value name="TMP">/tmp</value>
<value name="TMPDIR">/tmp</value>
<value name="TEMP">/tmp</value>
<value name="OSTYPE">$OSTYPE</value>
<value name="MACHTYPE">$MACHTYPE</value>
<value name="MALLOC_CHECK_">2</value>
</value>
...
|
ここで設定している /tmp , /var/cache/nginx/temp のパーミッション値が正しく設定されていればOKです。
- ファイルの同時オープン可能数を確認する。
上記の確認事項のいずれもOKであった場合、ファイルの同時オープン可能数をあげてあげる必要があるでしょう。
nginxのユーザで同時オープン可能なファイル数を確認します。
ここでは、そのユーザ名がnginxだったとしています。
$ su - nginx
drwxrwxrwt 3 root root 4096 9月 1 18:18 /tmp
$ ulimit -Hn
1024
$ ulimit -Sn
1024
$
|
この1024は、linuxのデフォルト値です。
この制限値を上回って使用すると、上記のalertがエラーログに出力されます。
この制限値を変更するには、以下の手順で行います。
- システムで扱えるファイルの上限をあげる
$ vim /etc/sysctl.conf
...
fs.file-max = 655360
|
ここでは、上限値を655360まで引き上げています。
- システムで扱えるファイルの上限の変更を反映する
$ sysctl -p
...
fs.file-max = 655360
|
- ユーザごとのシステムの制限値をあげる
$ vim /etc/security/limits.conf
...
* soft nofile 655360
* hard nofile 655360
|
ここの設定例は、先頭がユーザになります。
ここでは、* を指定していますので、全ユーザということになります。
例えば、nginx用のユーザのみを指定したい場合は、ここの*にユーザ名を指定すればOKです。
※ここのsoft nofileの値は、hard nofileの値以下であければなりません。
- nginxの制限値を変更する
$ vim /etc/nginx/nginx.conf
...
worker_rlimit_nofile 10240;
worker_connections 10240;
...
|
ここでは、システムの制限値を下回るような数値を設定します。
- php-fpmの制限値を変更する
$ vim /etc/php-fpm.conf
...
<value name="rlimit_files">10240</value>
...
<value name="max_requests">10240</value>
...
|
ここでは、システムの制限値を下回るような数値を設定します。
- nginx , php-fpm を再起動する
$ /etc/init.d/nginx restart
nginx を停止中: [ OK ]
nginx を起動中: [ OK ]
$ /etc/init.d/php-fpm restart
Shutting down php_fpm . done
Starting php_fpm . done
|
これでOK。
簡単ながらNginxのエラー500の対処について解説してみました。
アクセスが少ない場合は、ほとんどの場合、phpのバグ?でしょう。
アクセスが多い場合は、ファイルのオープンエラーを疑ってみると良いと思います。
いずれにせよ、いずれアクセスは増えていくでしょうから、このファイルオープンエラーの対処については知っておくと便利だと思います。
エラー500ってGoogleのSEO的には悪い影響を与えかねないので、早めに対応しましょうね。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
関連記事 :
コメントを投稿 :