nginxのエラーログを見てエラーを解消する

nginxのエラーを解消する

nginxのエラーログを見てエラーを解消する

nginx -tコマンドを実行するとnginx.confの文法チェック(syntax check)をしてくれます。エラーを解消するにはまずはここに記述されているエラー内容をよく確認する必要があります。

また、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: [alert] 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 -t
nginx: [emerg] unexpected "}" in /etc/nginx/conf.d/default.conf:5
nginx: configuration file /etc/nginx/nginx.conf test failed

エラーが出ているconfを見てみましょう。

エラーの内容通りに}がどこかに余分に入っている場合もありますが、記述した設定行末尾にセミコロン;が入っていない場合もこのエラーがでます。

default.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 -t
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を見ると分かります。

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ディレクティブを記述すると下のような状態になっているということです。

/etc/nginx/conf.d/default.conf
http{
http{
server {
listen 80;
server_name example.com;
root /var/www/html/;
}
}
}

エラーを解消するには/etc/nginx/conf.d/の設定ファイル中にあるhttp{}を削除しましょう。再度nginx -tを実行した際にはエラーが表示されなくなるはずです。

コメントを残す

メールアドレスが公開されることはありません。