web-dev-qa-db-fra.com

Journal d'accès NGINX par emplacement

Bonjour, j'ai donc deux plateformes où l'une fonctionne comme un sous-répertoire. Je voudrais pouvoir avoir un journal des accès et des erreurs pour chaque application; mais cela ne fonctionne pas comme je l'avais prévu :(

Voici ce que j'ai:

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;
    }
}

niquement les visites de la page d'accueil de app2 sont enregistrées dans les journaux de l'application2 tandis que plus loin dans le site comme/app2/help apparaîtra dans les journaux de l'application1.

Exemples:

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

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

/ app2/help == app1.access.log && app1.error.log * (voulez être dans les journaux app2) PAS OK

8
Ray

Cela se produit car l'emplacement qui finit par traiter vos demandes est location ~ \.php$, qui hérite de sa configuration de journal du contexte du serveur. En supposant que le plan du site seo yoast appartient à app1, vous voudrez une configuration quelque chose comme ceci:

# 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;
        }
    }
}

Déplacer les paramètres fastcgi dans le serveur et utiliser un amont pour le serveur php signifie que ce n'est pas beaucoup à dupliquer.

5
kolbyjack

Vous pouvez essayer la journalisation conditionnelle avec "si". Configurez une carte pour chaque emplacement et ajoutez "si" dans l'instruction de journal.

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;

Veuillez noter - la déclaration ci-dessus est écrite à des fins de référence non testées, des modifications de syntaxe peuvent être nécessaires.

1
mdeora

Selon documentation NGINX concernant l'emplacement :

[...] Pour trouver un emplacement correspondant à une demande donnée, nginx vérifie d'abord les emplacements définis à l'aide des chaînes de préfixe (emplacements de préfixe). Parmi eux, l'emplacement avec le préfixe correspondant le plus long est sélectionné et mémorisé. Les expressions régulières sont ensuite vérifiées, dans l'ordre de leur apparition dans le fichier de configuration. La recherche d'expressions régulières se termine à la première correspondance et la configuration correspondante est utilisée. Si aucune correspondance avec une expression régulière n'est trouvée, la configuration de l'emplacement du préfixe mémorisé précédemment est utilisée.

Donc, si l'un des blocs location avec regex en dessous ou au-dessus du location /app2 capture l'URL, elle sera envoyée au journal du serveur par défaut (ou à aucun fichier journal, selon certaines de vos options).

la priorité pour le tri fonctionne comme ceci :

  • (none): Si aucun modificateur n'est présent, l'emplacement est interprété comme une correspondance de préfixe. Cela signifie que l'emplacement donné sera mis en correspondance avec le début de l'URI de demande pour déterminer une correspondance.
  • =: Si un signe égal est utilisé, ce bloc sera considéré comme une correspondance si l'URI de la demande correspond exactement à l'emplacement donné.
  • ~: Si un modificateur tilde est présent, cet emplacement sera interprété comme une correspondance d'expression régulière sensible à la casse.
  • ~*: Si un modificateur tilde et astérisque est utilisé, le bloc d'emplacement sera interprété comme une correspondance d'expression régulière insensible à la casse.
  • ^~: Si un modificateur carat et tilde est présent, et si ce bloc est sélectionné comme meilleure correspondance d'expression non régulière, la correspondance d'expression régulière n'aura pas lieu.

Je supprime une partie de la configuration pour plus de clarté.

Vous pourriez peut-être essayer de donner la priorité à app2, regex avec ^~ et voyez ce qui se passe:

 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;
     }
 }

Cela devrait vous assurer d'exécuter la meilleure expression non régulière correspondante, et de laisser les blocs d'expression régulière en deuxième position et ne devrait pas avoir besoin d'être dupliqué pour intercepter les autres emplacements, car ils sont hérités.

0
Leo

La configuration semble correcte. nginx effectue une correspondance la plus longue sur l'emplacement si vous n'utilisez pas = ou ~, donc tout ce qui commence par /app2/ comprenant /app2/helper correspondra au deuxième emplacement et aura priorité sur location /

Je ne peux pas reproduire votre problème en utilisant la même configuration que celle que vous avez publiée. Je suppose que vous n'avez pas redémarré nginx. Un rechargement peut ne pas suffire.

0
Luca Gibelli