Ubuntu VPS上でのNginxのログとログローテーションの設定方法
イントロダクション
ウェブサーバーのトラブルを回避するために、ログの設定を行うことができます。サーバーのログ情報を記録することで、トラブルシューティングや状況の評価に役立つデータにアクセスできます。
このチュートリアルでは、Nginxのログ機能を調査し、これらのツールを最適な設定で使用する方法を見つけることができます。Ubuntu 22.04の仮想プライベートサーバーを例に使用しますが、他のモダンなディストリビューションでも同様の機能が利用できます。
前提条件
このチュートリアルに従うためには、以下のものが必要です:
- One Ubuntu 22.04 server with a non-root sudo-enabled user with a firewall. Follow our Initial Server Setup to get started.
- Nginx installed on the server. Follow our How to Install Nginx on Ubuntu 22.04 tutorial to get it installed.
あなたのUbuntu 22.04サーバーでNginxを実行しているので、準備が整いました。
エラーログディレクティブの理解
Nginxはシステムログを制御するためにいくつかの異なるディレクティブを使用しています。コアモジュールに含まれるものはerror_logと呼ばれています。
エラーログの構文
error_logディレクティブは、一般的なエラーメッセージのログを処理するために使用されます。もしあなたがApacheに詳しいのであれば、これはApacheのErrorLogディレクティブに非常に似ています。
error_log ディレクティブは次の構文を適用します。
error_log log_file log_level
ログファイルは、ログが記録されるファイルを指定します。ログレベルは、記録したい最低レベルのログを指定します。
ロギングレベル
エラーログのディレクティブは必要に応じてより多くまたは少ない情報を記録するように設定することができます。ログのレベルは以下のいずれかに設定できます。
- emerg: Emergency situations where the system is in an unusable state.
- alert: Severe situations where action is needed promptly.
- crit: Important problems that need to be addressed.
- error: An error has occurred and something was unsuccessful.
- warn: Something out of the ordinary happened, but is not a cause for concern.
- notice: Something normal, but worth noting what has happened.
- info: An informational message that might be nice to know.
- debug: Debugging information that can be useful to pinpoint where a problem is occurring.
リストの上位にあるレベルは、優先度が高いと考えられています。もしレベルを指定する場合、ログは指定したレベルとそれよりも高いレベルをキャプチャします。
たとえば、エラーを指定すると、ログはエラー、重要、警告、緊急のラベル付けされたメッセージを記録します。
このディレクティブの使用例は、メインの設定ファイルの中にあります。お好みのテキストエディタを使用して、次の設定ファイルにアクセスしてください。この例ではnanoを使用しています。
- sudo nano /etc/nginx/nginx.conf
ファイルをスクロールして、# ロギング設定セクションまで進み、以下の指示を確認してください。
. . .
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
. . .
エラーログに何も記録したくない場合は、出力を/dev/nullに送信する必要があります。
. . .
error_log /dev/null crit;
. . .
他のログ記述子であるaccess_logについては、次のセクションで説明します。
HttpLogModuleのログディレクティブの理解
error_logディレクティブはコアモジュールの一部ですが、access_logディレクティブはHttpLogModuleの一部です。これにより、ログをカスタマイズすることができます。
このモジュールには、カスタムログの設定を補助するいくつかの他の指示も含まれています。
log_formatディレクティブ
log_formatディレクティブは、プレーンテキストと変数を使ってログエントリの書式を述べるために使われます。
Nginxには事前定義されたcombinedという1つのフォーマットがあります。これは多くのサーバーでよく使用される一般的なフォーマットです。
以下は、log_formatディレクティブで明示的に指定する必要があり、内部で定義されていない場合の結合形式の例です。
「/etc/nginx/nginx.conf」
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
この定義は、セミコロン(;)が見つかるまで複数行にわたっています。
$(ドルマーク)で始まる行は変数を示し、-や[、]などの文字はそのまま解釈されます。
指示の一般的な構文は次のようです。
/etc/nginx/nginx.confを日本語で言い換えると :
「/etc/nginx/nginx.conf」
log_format format_name string_describing_formatting;
コアモジュールでサポートされている変数を使用して、ログの文字列を作成することができます。
アクセスログディレクティブの理解
アクセスログディレクティブは、エラーログディレクティブと似た構文を使いますが、より柔軟性があります。これはカスタムロギングを設定するために使用されます。
アクセスログディレクティブは次の構文を使用します。
access_log /path/to/log/location [ format_of_log buffer_size ];
access_logのデフォルト値は、log_formatセクションで言及されたcombined形式です。log_format定義によって定義された任意の形式を使用することができます。
バッファサイズは、Nginxがログに書き込む前に保持するデータの最大サイズです。gzipを定義に追加することで、ログファイルの圧縮も指定できます。
「/etc/nginx/nginx.conf」
access_log /path/to/log/location format_of_log gzip;
エラーログの指令とは異なり、ログを不要とする場合は設定ファイルを更新してオフにすることができます。
. . .
##
# Logging Settings
##
access_log off;
error_log /var/log/nginx/error.log;
. . .
この場合、/dev/null に書き込む必要はありません。
ログのローテーションを管理する
ログファイルが増えると、ディスク容量を使い尽くさないようにログメカニズムの管理が必要になります。ログローテーションとは、一定期間の間、ログファイルを切り替えることおよび古いファイルをアーカイブするプロセスです。
Nginxはログファイルを管理するためのツールを提供していませんが、ログローテーションを補助する仕組みは含まれています。
マニュアルでログを回転させる
ログを手動で回転させるには、回転用のスクリプトを作成することができます。たとえば、現在のログをアーカイブ用の新しいファイルに移動します。一般的な方法は、最新のログファイルには .0 という接尾辞を付け、それ以前のファイルには .1 などの番号を付けることです。
- mv /path/to/access.log /path/to/access.log.0
実際にログを回転させるコマンドは、kill -USR1 /var/run/nginx.pid です。これによって、Nginxプロセス自体が終了するわけではなく、代わりにシグナルを送りログファイルをリロードします。これにより、新しいリクエストは更新されたログファイルに記録されることになります。
- kill -USR1 `cat /var/run/nginx.pid`
/var/run/nginx.pid ファイルは、NginxがマスタープロセスのPIDを保存する場所です。/etc/nginx/nginx.conf 設定ファイルの先頭にある pid: で始まる行で指定されています。
- sudo nano /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
...
回転後、プロセスの転送が完了するまでに sleep 1 を実行してください。その後、古いファイルを圧縮したり、回転後の処理を行ったりすることができます。
- sleep 1
- [ post-rotation processing of old log file ]
ログローテーションをlogrotateで行う。
logrotateアプリケーションは、ログをローテーションするためのプログラムです。それはデフォルトでUbuntuにインストールされており、Ubuntu上のNginxにはカスタムのlogrotateスクリプトが付属しています。
好きなテキストエディタを使用して、回転スクリプトにアクセスしてください。この例では、nanoを使用しています。
- sudo nano /etc/logrotate.d/nginx
ファイルの最初の行は、その後の行が適用される場所を指定します。Nginxの設定ファイルでログの場所を変更する場合、これを忘れないようにしてください。
ファイルの残りの部分では、ログが毎日ローテーションされ、52個の過去のコピーが保持されることが指定されています。
前述の手動回転機構に類似したコマンドが、postrotateセクションに含まれていることに注意してください。
. . .
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
. . .
このセクションでは、ログのローテーションが完了したらNginxにログファイルを再読み込みさせるように指示しています。
結論
サーバーに問題が発生した際、適切なログの設定と管理は時間とエネルギーを節約することができます。問題の診断に役立つ情報にアクセスできれば、些細な修正と永続的な頭痛の違いを生むことができます。
サイトを機能的に保つために、サーバーログをチェックすることは重要です。また、機密情報を公開していないことも確認します。このガイドはログの経験についての紹介です。一般的なヒントについては、「よくあるNginxエラーのトラブルシューティング方法」のチュートリアルでさらに学ぶことができます。