この記事http://wiki.nginx.org/HttpLogModuleを読みましたが、これは可能だと思われます。以下の構成ディレクティブにあるようなことをしたいのですが、うまくいかないようです。誰でもガイダンスを提供できますか?
location ~ /foo/(.*) {
access_log /var/log/$1.access.log;
}
この記事http://wiki.nginx.org/HttpLogModuleを読みましたが、これは可能だと思われます。以下の構成ディレクティブにあるようなことをしたいのですが、うまくいかないようです。誰でもガイダンスを提供できますか?
location ~ /foo/(.*) {
access_log /var/log/$1.access.log;
}
位置キャプチャ ( $1
) がログ フェーズに存在しません。代わりに名前付きキャプチャを使用する必要があります。
location ~ /foo/(?<mylog>.*) {
access_log /var/log/$mylog.access.log;
}
心に留めておかなければならないことがいくつかありますが、おそらくすでにそれらすべてを知っているはずです ;)。
したがって、/var/log/nginx の所有者が root であることは明らかです。
drwxr-xr-x 2 root root 4096 Aug 14 01:35 nginx/
または一般化すると、/var/log の所有者も root であり、root のみが書き込み可能です。
すべてのリクエストは、 THE MASTER PROCESS (「root」ユーザーが所有および実行) ではなく、 THE WORKER PROCESS (「nginx/nobody」ユーザーが所有および実行) によって処理されます。
nginx ユーザーが存在しない場合、ワーカー プロセスはユーザーnobody*によって実行されます。
root 1272 0.0 0.1 12080 3932 ? Ss 00:27 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nobody 4226 0.0 0.0 12240 2236 ? S 01:43 0:00 nginx: worker process
そして、このシナリオでは、ロケーション ブロックの処理中に、/var/log/nginx にログを書き込む場合にパーミッション エラーが発生します:'( (このディレクトリに書き込むパーミッションを持たない nginx または nobody ユーザーとして) .
これは、ログが /var/log にある場合にも当てはまります
2013/08/14 02:00:39 [crit] 4226#0: *20 open() "/var/log/nginx/adad?qwerty.access.log" failed (13: Permission denied) while logging request, client: 127.0.0.1, server: localhost, request: "GET /adad?qwerty HTTP/1.1", host: "localhost"
上記の例では、ログを次のように書いていました
access_log /var/log/nginx/$request_uri.access.log;
明らかに失敗しました。
したがって、物事を機能させるには、この方法に従ってください。
nginx のユーザーを作成します。次のようにお勧めします --
useradd -s /sbin/nologin -M nginx
nginx 構成 /etc/nginx/nginx.conf を更新し (この構成の最初の行にこれを追加)、それをリロードします (サービス nginx リロード)
user nginx;
これで、すべてのワーカー プロセス (子プロセス) がユーザーとして実行されます - 「nginx」
/var/log/ nginx/などのログを保持するための共通ディレクトリを作成し、この場所を指すように nginx 構成を更新します。
この後、nginx をリロードします。
そして今最も重要なことは、このディレクトリをnginxユーザーが所有するようにすることです。
chown -R nginx:nginx /var/log/nginx
最後に、ロケーション ブロックで @VBART のメソッドを使用できます。
何か問題が発生した場合は、デバッグ モードで error_log を有効にしてください。問題があれば通知されます。
また、以下の@TroyChengのコメントを考慮して、
そして、nginxサービス 、つまりマスタープロセスを開始した場合、他のユーザーから「仕事」または(私の場合はnginx)と言うと、すべての子プロセスもその特権から実行され、そのシナリオでは(プロセスを開始するのは難しいため、すでにこれを行っている必要があります) このユーザーがロギング ディレクトリにログを書き込むことを許可します (例: /var/log/nginx)
実際、ここの $1 はあなたが望むものではありません。location ディレクティブの正規表現は URL の一致に対してのみ機能することに注意してください。変数は抽出されないため、$x を使用して location ディレクティブから一致値を取得することはできません。
これはうまくいくはずです:
location ~ /foo/(.*) {
access_log /var/log/foo.access.log; //you can add [log_format] at last;
}