NGINX Log de acessos por localização

5

Olá, então eu tenho duas plataformas onde uma opera como um subdiretório. Eu gostaria de poder ter um log de acesso e erro para cada aplicativo; no entanto, não está funcionando como eu pretendia: (

Aqui está o que eu tenho:

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

Apenas as visitas à página inicial do app2 são registradas nos registros do app2, enquanto no site, como / app2 / help, aparecerão nos registros do app1.

Exemplos:

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

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

/app2/help == app1.access.log && app1.error.log *(want to be in app2 logs) NOT OK

    
por Ray 08.05.2018 / 15:39

4 respostas

4

Isso está acontecendo porque o local que, em última análise, acaba manipulando suas solicitações é location ~ \.php$ , que herda sua configuração de log do contexto do servidor. Assumindo que o yoast seo sitemap pertence ao app1, você vai querer uma configuração como esta:

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

Mover os parâmetros fastcgi para o servidor e usar um upstream para o servidor php significa que não é muito para duplicar.

    
por 18.05.2018 / 20:43
0

A configuração parece correta. O nginx faz uma correspondência mais longa no local se você não usa = ou ~ , então qualquer coisa que comece com /app2/ incluindo /app2/helper corresponderá ao segundo local e terá prioridade sobre location /

Não consigo reproduzir seu problema usando a mesma configuração que você publicou. Meu palpite é que você não reiniciou o nginx. Um recarregamento pode não ser suficiente.

    
por 08.05.2018 / 19:54
0

Você pode tentar o log condicional com "if". Configure um mapa para cada local e adicione "if" na declaração de log.

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;

Por favor note - acima declaração é escrita para fins de referência não testados, pode haver algumas alterações de sintaxe necessárias.

    
por 17.05.2018 / 12:11
0

De acordo com a documentação do NGINX referente à localização :

[...] To find location matching a given request, nginx first checks locations defined using the prefix strings (prefix locations). Among them, the location with the longest matching prefix is selected and remembered. Then regular expressions are checked, in the order of their appearance in the configuration file. The search of regular expressions terminates on the first match, and the corresponding configuration is used. If no match with a regular expression is found then the configuration of the prefix location remembered earlier is used.

Portanto, se qualquer um dos blocos location com regex abaixo ou acima do location /app2 capturar o URL, ele será enviado para o log do servidor padrão (ou para nenhum arquivo de log, de acordo com algumas de suas opções).

A prioridade para trabalhos de classificação assim :

  • (none) : se não houver modificadores, o local será interpretado como um Correspondência de prefixo. Isso significa que o local indicado será comparado com o início do URI da solicitação para determinar uma correspondência.
  • = : se um sinal de igual for usado, esse bloco será considerado uma correspondência se o URI da solicitação corresponder exatamente ao local determinado.
  • ~ : se um modificador de til estiver presente, esse local será interpretado como uma correspondência de expressão regular que faz distinção entre maiúsculas e minúsculas.
  • ~* : se um modificador de til e asterisco for usado, o bloco de localização será interpretado como correspondência de expressão regular sem distinção entre maiúsculas e minúsculas.
  • ^~ : se um modificador de quilate e til estiver presente, e se esse bloco estiver selecionado como a melhor correspondência de expressão não regular, a correspondência de expressão regular não ocorrerá.

Estou removendo algumas configurações para maior clareza.

Talvez você possa tentar dar prioridade ao app2, regex com ^~ e ver o que acontece:

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

Isso deve garantir a execução da melhor expressão não-regular correspondente e deixar os blocos de expressão regular como segundo e não precisarão ser duplicados para capturar os outros locais, pois eles são herdados.

    
por 21.05.2018 / 07:08