web-dev-qa-db-ja.com

場所別のNGINXアクセスログ

こんにちは。2つのプラットフォームがあり、1つはサブディレクトリとして動作します。各アプリケーションのアクセスおよびエラーログを取得できるようにしたいと思います。しかし、それは私が意図したように機能していません:(

ここに私が持っているものがあります:

server {
    listen 80 default;
    listen [::]:80;

    root /var/www/html/app1;
    index index.php;

    server_name localhost;

    access_log /var/log/nginx/app1.access.log;
    error_log /var/log/nginx/app1.error.log;    

    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt { log_not_found off; access_log off; allow all; }
    location ~ /\.(?!well-known).* {
            deny all;
            access_log off;
            log_not_found off;
    }
    location ~*  \.(woff|jpg|jpeg|png|gif|ico|css|js)$ {
        access_log off;
        log_not_found off;
        expires 365d;
    }

    location / {
        try_files $uri $uri/ /index.php?$is_args$args;
    }   


    location /app2 {

        try_files $uri $uri/ /app2/index.php$is_args$args;

        access_log /var/log/nginx/app2.access.log;
        error_log  /var/log/nginx/app2.error.log;
    }

    # SECURITY : Deny all attempts to access PHP Files in the uploads directory
    location ~* /(?:uploads|files)/.*\.php$ {
            deny all;
    }

    # PHP : pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;    
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    # Yoast SEO Sitemaps
    location ~ ([^/]*)sitemap-rewrite-disabled(.*).x(m|s)l$ {
            ## this redirects sitemap.xml to /sitemap_index.xml
        rewrite ^/sitemap.xml$ /sitemap_index.xml permanent;
            ## this makes the XML sitemaps work
            rewrite ^/([a-z]+)?-?sitemap.xsl$ /index.php?xsl=$1 last;
        rewrite ^/sitemap_index.xml$ /index.php?sitemap=1 last;
        rewrite ^/([^/]+?)-sitemap([0-9]+)?.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;
            ## The following lines are optional for the premium extensions
        ## News SEO
            rewrite ^/news-sitemap.xml$ /index.php?sitemap=wpseo_news last;
        ## Local SEO
        rewrite ^/locations.kml$ /index.php?sitemap=wpseo_local_kml last;
        rewrite ^/geo-sitemap.xml$ /index.php?sitemap=wpseo_local last;
        ## Video SEO
        rewrite ^/video-sitemap.xsl$ /index.php?xsl=video last;
    }
}

のみ app2ホームページへのアクセスはapp2ログに記録されますが、/ app2/helpのようなサイトにさらにアクセスすると、app1ログに表示されます。

例:

/ help == app1.access.log && app1.error.log OK

/ app2 == app2.access.log && app2.error.log OK

/ app2/help == app1.access.log && app1.error.log *(app2ログに入れたい)NOT OK

8
Ray

これは、最終的にリクエストを処理する場所がlocation ~ \.php$であり、サーバーコンテキストからログ構成を継承するためです。 yoast seoサイトマップがapp1に属しているとすると、次のような設定が必要になります。

# Use an upstream to future changes easier
upstream _php {
    server unix:/var/run/php/php7.0-fpm.sock;
}

server {
    listen 80 default;
    listen [::]:80;

    root /var/www/html/app1;
    index index.php;

    server_name localhost;

    access_log /var/log/nginx/app1.access.log;
    error_log /var/log/nginx/app1.error.log;    

    # Put php directives in the server context so they can be inherited by all locations
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt { log_not_found off; access_log off; allow all; }

    # Locations that aren't logged can be left outside and shared
    location ~ /\.(?!well-known) {
        deny all;
        access_log off;
        log_not_found off;
    }

    location ~* \.(woff|jpg|jpeg|png|gif|ico|css|js)$ {
        access_log off;
        log_not_found off;
        expires 365d;
    }

    # Everything that logs to app1 should go in here
    location / {
        try_files $uri $uri/ /index.php?$is_args$args;

        # SECURITY : Deny all attempts to access PHP Files in the uploads directory
        location ~* /(?:uploads|files)/.*\.php$ {
            deny all;
        }

        # PHP : pass the PHP scripts to FastCGI server defined in upstream _php
        location ~ \.php$ {
            fastcgi_pass _php;
        }

        # Yoast SEO Sitemaps
        location ~ ([^/]*)sitemap-rewrite-disabled(.*).x(m|s)l$ {
                ## this redirects sitemap.xml to /sitemap_index.xml
            rewrite ^/sitemap.xml$ /sitemap_index.xml permanent;
                ## this makes the XML sitemaps work
                rewrite ^/([a-z]+)?-?sitemap.xsl$ /index.php?xsl=$1 last;
            rewrite ^/sitemap_index.xml$ /index.php?sitemap=1 last;
            rewrite ^/([^/]+?)-sitemap([0-9]+)?.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;
                ## The following lines are optional for the premium extensions
            ## News SEO
                rewrite ^/news-sitemap.xml$ /index.php?sitemap=wpseo_news last;
            ## Local SEO
            rewrite ^/locations.kml$ /index.php?sitemap=wpseo_local_kml last;
            rewrite ^/geo-sitemap.xml$ /index.php?sitemap=wpseo_local last;
            ## Video SEO
            rewrite ^/video-sitemap.xsl$ /index.php?xsl=video last;
        }
    }   

    # Everything that logs to app2 should go in here
    location /app2 {
        try_files $uri $uri/ /app2/index.php$is_args$args;

        access_log /var/log/nginx/app2.access.log;
        error_log  /var/log/nginx/app2.error.log;

        # SECURITY : Deny all attempts to access PHP Files in the uploads directory
        location ~* /(?:uploads|files)/.*\.php$ {
            deny all;
        }

        # PHP : pass the PHP scripts to FastCGI server defined in upstream _php
        location ~ \.php$ {
            fastcgi_pass _php;
        }
    }
}

Fastcgiパラメータをサーバーに移動し、phpサーバーのアップストリームを使用することは、複製するのがそれほど多くないことを意味します。

5
kolbyjack

「if」を使用して条件付きロギングを試すことができます。場所ごとにマップを設定し、ログステートメントに「if」を追加します。

map $uri $app1 {
    ~^[app1] 1;
    default 0;
}
map $uri $app2 {
    ~^[app2]  1;
    default 0;
}

access_log /path/to/access-app1.log combined if=$app1;
access_log /path/to/access-app2.log combined if=$app2;

注意してください-上記のステートメントはテストされていない参照目的で書かれており、構文の変更が必要になる場合があります。

1
mdeora

場所に関するNGINXドキュメント によると:

[...]特定のリクエストに一致する場所を見つけるために、nginxは最初にプレフィックス文字列を使用して定義された場所(プレフィックスの場所)をチェックします。その中で、一致するプレフィックスが最も長い場所が選択され、記憶されます。次に、構成ファイルでの出現順に正規表現がチェックされます。正規表現の検索は最初の一致で終了し、対応する構成が使用されます。正規表現との一致が見つからない場合は、以前に記憶されたプレフィックスの場所の構成が使用されます。

したがって、location /app2の上下に正規表現を持つlocationブロックのいずれかがURLをキャッチすると、デフォルトのサーバーログに送信されます(オプションによっては、ログファイルには送信されません)。 )。

ソートの優先順位はこのように機能します

  • (none):修飾子が存在しない場合、場所はプレフィックスの一致として解釈されます。これは、指定された場所がリクエストURIの先頭と照合され、一致を判断することを意味します。
  • =:等号が使用されている場合、リクエストURIが指定された場所と完全に一致すると、このブロックは一致と見なされます。
  • ~:チルダ修飾子が存在する場合、この場所は大文字と小文字が区別される正規表現の一致として解釈されます。
  • ~*:チルダとアスタリスクの修飾子を使用すると、ロケーションブロックは大文字と小文字を区別しない正規表現の一致として解釈されます。
  • ^~:カラットとチルドの修飾子が存在し、このブロックが非正規表現の最適な一致として選択されている場合、正規表現マッチングは行われません。

わかりやすくするために、一部の構成を削除しています。

たぶん、app2に優先順位を付けて、^~で正規表現を試して、何が起こるかを確認してみてください。

 server {
     listen 80 default;
     listen [::]:80;

     root /var/www/html/app1;
     index index.php;

     server_name localhost;

     access_log /var/log/nginx/app1.access.log;
     error_log /var/log/nginx/app1.error.log;

     location / {
         try_files $uri $uri/ /index.php?$is_args$args;
     }

     location ^~ /app2 {

         try_files $uri $uri/ /app2/index.php$is_args$args;

         access_log /var/log/nginx/app2.access.log;
         error_log  /var/log/nginx/app2.error.log;
     }
 }

これにより、最も一致する非正規表現が確実に実行され、正規表現ブロックが2番目のままになり、継承されるため、他の場所をキャッチするために複製する必要がなくなります。

0
Leo

設定は正しいようです。 nginxは、=または~を使用しない場合、その場所で最長の一致を行うため、/app2/で始まる/app2/helperを含むすべてのものが2番目の場所と一致し、優先されますlocation /以上

投稿した設定とまったく同じ設定を使用して問題を再現することはできません。私の推測では、nginxを再起動していません。リロードでは不十分な場合があります。

0
Luca Gibelli