0

この記事http://wiki.nginx.org/HttpLogModuleを読みましたが、これは可能だと思われます。以下の構成ディレクティブにあるようなことをしたいのですが、うまくいかないようです。誰でもガイダンスを提供できますか?

location ~ /foo/(.*) {
    access_log /var/log/$1.access.log;

 }
4

3 に答える 3

2

位置キャプチャ ( $1) がログ フェーズに存在しません。代わりに名前付きキャプチャを使用する必要があります。

location ~ /foo/(?<mylog>.*) {
    access_log /var/log/$mylog.access.log;
}
于 2013-08-13T08:35:13.930 に答える
1

心に留めておかなければならないことがいくつかありますが、おそらくすでにそれらすべてを知っているはずです ;)。

  1. Nginx には、常にrootとして実行される1 つの親プロセス (MASTER PROCESS)があります。
  2. デフォルトのログは、nginx が起動/再起動/リロードされたとき、およびroot ユーザーによって作成されます (存在しない場合) 。
  3. したがって、/var/log/nginx の所有者が root であることは明らかです。

    drwxr-xr-x  2 root root   4096 Aug 14 01:35 nginx/
    

    または一般化すると、/var/log の所有者も root であり、root のみが書き込み可能です。

  4. すべてのリクエストは、 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
    
  5. そして、このシナリオでは、ロケーション ブロックの処理中に、/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;
    

    明らかに失敗しました。

したがって、物事を機能させるには、この方法に従ってください。

  1. nginx のユーザーを作成します。次のようにお勧めします --

    useradd -s /sbin/nologin -M nginx
    
  2. nginx 構成 /etc/nginx/nginx.conf を更新し (この構成の最初の行にこれを追加)、それをリロードします (サービス nginx リロード)

    user    nginx;
    

    これで、すべてのワーカー プロセス (子プロセス) がユーザーとして実行されます - 「nginx」

  3. /var/log/ nginx/などのログを保持するための共通ディレクトリを作成し、この場所を指すように nginx 構成を更新します。

    この後、nginx をリロードします。

  4. そして今最も重要なことは、このディレクトリをnginxユーザーが所有するようにすることです。

    chown -R nginx:nginx /var/log/nginx 
    
  5. 最後に、ロケーション ブロックで @VBART のメソッドを使用できます。

何か問題が発生した場合は、デバッグ モードで error_log を有効にしてください。問題があれば通知されます。

また、以下の@TroyChengのコメントを考慮して、

そして、nginxサービス 、つまりマスタープロセスを開始した場合、他のユーザーから「仕事」または(私の場合はnginx)と言うと、すべての子プロセスもその特権から実行され、そのシナリオでは(プロセスを開始するのは難しいため、すでにこれを行っている必要があります) このユーザーがロギング ディレクトリにログを書き込むことを許可します (例: /var/log/nginx)

于 2013-08-13T21:03:18.223 に答える
0

実際、ここの $1 はあなたが望むものではありません。location ディレクティブの正規表現は URL の一致に対してのみ機能することに注意してください。変数は抽出されないため、$x を使用して location ディレクティブから一致値を取得することはできません。

これはうまくいくはずです:

location ~ /foo/(.*) {
    access_log /var/log/foo.access.log; //you can add [log_format] at last;
}
于 2013-08-13T03:03:28.620 に答える