Nginxのデフォルト設定では、すべてのWebサイトのアクセスログが単一のファイル(通常は /var/log/nginx/access.log)に集約されます。しかし、複数のドメインを運用している場合、特定のサイトのトラフィック分析やトラブルシューティングを行うために、ログをドメインごとに分離して出力することが推奨されます。
1. ログフォーマットの定義 (log_format)
まず、出力するログの形式を定義します。これは ngx_http_log_module モジュールを使用し、通常は nginx.conf の http ブロック内で設定します。
# /etc/nginx/nginx.conf
http {
# 独自の詳細なログフォーマット「advanced_format」を定義
log_format advanced_format '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time uct="$upstream_connect_time"';
# デフォルトのログ設定
access_log /var/log/nginx/access.log advanced_format;
}
主な変数とその役割は以下の通りです:
- $remote_addr: クライアントのIPアドレス
- $time_local: アクセス時のローカル時間
- $status: HTTPステータスコード
- $request_time: リクエスト処理の合計時間
- $http_x_forwarded_for: プロキシを経由している場合のクライアントの真のIP
2. サイト別のアクセスログ設定
各サイトの server ブロック内で access_log ディレクティブを指定することで、ログファイルを個別に保存できます。
# /etc/nginx/conf.d/example.com.conf
server {
listen 80;
server_name example.com;
# このドメイン専用のログ出力を設定
# access_log [パス] [フォーマット名];
access_log /var/log/nginx/example.com_access.log advanced_format;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
3. ログ保存先ディレクトリの権限確認
ログをデフォルトの /var/log/nginx/ 以外の場所に保存する場合、Nginxを実行しているユーザー(一般的には nginx または www-data)がそのディレクトリに対して書き込み権限を持っている必要があります。
# ログ用ディレクトリの作成
mkdir -p /data/logs/nginx
# 所有者をnginxユーザーに変更
chown -R nginx:nginx /data/logs/nginx
権限が正しく設定されていない場合、Nginxはログファイルを生成できず、エラーを発生させます。
4. 設定の検証と反映
設定ファイルを変更した後は、構文チェックを行い、Nginxを再起動またはリロードして設定を反映させます。
# 設定ファイルの構文チェック
nginx -t
# 構文に問題がなければ設定をリロード
systemctl reload nginx
5. 動作確認
対象のWebサイトにブラウザや curl コマンドでアクセスし、指定したパスにログファイルが作成され、データが書き込まれているかを確認します。
# リアルタイムでログの更新を確認
tail -f /var/log/nginx/example.com_access.log
このようにサイトごとにログを分離することで、ドメインごとの統計分析やセキュリティ監査が容易になります。また、ログローテーション(logrotate)の設定もドメインごとに細かく制御できるようになります。