nginxのエラーログを見てエラーを解消する
webページを開いたときにnginx error という表記がでて見られない時があります。
これはスマホ上からは解決できない問題でサイト運営者側で対応が必要です。
nginx -tコマンドで確認する
設定ファイルのミスでエラーが出ていることが多いので設定ファイルをチェックします。これをsyntaxチェック(文法チェック)といいます。
nginxではnginx -tというコマンドを実行すると読み込まれている設定ファイルをチェックしてくれます。問題があればnginx -t実行のあとにerror内容が出てきます。
エラーを解消にはこのerror内容を読むのが先決です。
ここでも難しい場合はnignxのエラーログにも情報が出力されているのでこちらもチェックしましょう。
これらの内容を読めば、なぜエラーが発生しているのかがわかると思います。解決方法はひとまずエラーの内容を一部コピペしてgoogle検索すれば大体解決できます。
nginxのエラーログの場所
nginxのエラーログは設定にもよりますがデフォルトでは/var/log/nginx/error.log.という形で出力されています。
permission deny, super-user privilegeのエラー
nginx -t
で文法チェックしたら下記のエラーが出てました。解決法→nginx -t
はroot権限で実行する ($ sudo nginx -t かrootユーザで # nginx -tを実行)
nginx -t
nginx: could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
2011/01/01 00:00:00 [warn] 416#416: the "user" directive makes sense only if the master process runs with super-user privilege
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
2011/01/01 00:00:00 [emerg] 416#416: open() "/var/run/nginx.pid" failed (13: Permission denied)
nginx: configuration file /etc/nginx/nginx.conf test failed
エラー内容をまとめると
- error.logを開く権限がない
- 「user」ディレクティブはrootで実行しないと意味ない
- nginx.pidを開く権限がない
- 設定ファイルのtest失敗
でもよく見ると/etc/nginx/nginx.conf syntax is ok
というように文法エラーは無く設定ファイルの記述ミスではないようです。
エラー内容は総じて権限の問題です。
2番目のエラーにあるようにnginxのmaster processをsuper-user(root)で実行していないのが問題のようです。それではrootユーザで実行すればよいです。
下記のコマンドを打ってroot以外が表示された場合は現在一般ユーザです。
$ whoami
root
下記のコマンドを打ってroot以外が表示された状態でnginx -tを打っている場合はsudoでnginx -tを実行するかrootユーザに変更後にnginx -tを実行してみてください。これでエラーが表示されなくなるはずです。
$ sudo nginx -t
or
$ sudo su
# whoami
root
# nginx -t
割と遭遇しやすいエラーのひとつだと思います。エラー内容をパッと見るとファイルの権限周りをチェックしてしまいがちですが、単純に実行ユーザが悪いということですね。
unexpected “}”のエラー
nginx -t を実行したら下記のエラーがでました。→ {}の記述ミス or ;忘れ?
nginx: [emerg] unexpected "}" in /etc/nginx/conf.d/default.conf:5
nginx: configuration file /etc/nginx/nginx.conf test failed
エラーが出ているconfを見てみましょう。
エラーの内容通りに}がどこかに余分に入っている場合もありますが、記述した設定行末尾にセミコロン;が入っていない場合もこのエラーがでます。
server {
listen 80;
server_name example.com;
root /var/www/html/ ←;がない (正)root /var/www/html;
}
これも起こりやすいエラーだと思います。うっかりしているとセミコロン;の記述を忘れることがあるので気をつけましょう。
“http” directive is not allowed here のエラー
“http” directive is not allowed hereというエラー出力されました。→http{}ディレクティブはconf.dの下では不要
nginx: [emerg] "http" directive is not allowed here in /etc/nginx/conf.d/default.conf:1
nginx: configuration file /etc/nginx/nginx.conf test failed
ドキュメントを読みながら設定ファイルを作成していると、設定ファイル中にはhttpディレクティブ、serverディレクティブが必要ということで下記のような記述をするかもしれません。
# /etc/nginx/conf.d/default.conf
http{
server {
listen 80;
server_name example.com;
root /var/www/html/;
}
}
ただしこの設定を書いた設定ファイルをconf.dの下に設置するとエラーがでます。
理由はconf.dの下の設定ファイルの記述はnginx.confのhttp {} ディレクティブの中にconf.dの設定内容をincludeするように書かれているからです。
これはnginx.confを見ると分かります。
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
つまり、conf.d配下の設定ファイルにhttpディレクティブを記述すると下のような状態になっているということです。
http{
http{
server {
listen 80;
server_name example.com;
root /var/www/html/;
}
}
}
エラーを解消するには/etc/nginx/conf.d/の設定ファイル中にあるhttp{}を削除しましょう。再度nginx -tを実行した際にはエラーが表示されなくなるはずです。