Вопрос: Журнал доступа NGINX по местоположению


Здравствуйте, у меня есть две платформы, где вы работаете как подкаталог. Я хотел бы иметь доступ к журналу доступа и ошибок для каждого приложения; однако он не работает так, как я предполагал :(

Вот что я имею:

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) НЕ ОК


5
2018-05-08 13:39


Источник




Ответы:


Это происходит потому, что местоположение, которое в конечном итоге завершает обработку ваших запросов, 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-сервера означает, что его не так много дублировать.


4
2018-05-18 18:43



Да, именно так. Я подумал об этом вчера, но ваше решение более чистое, чем мое, так что это двойное признание. спасибо - Ray


Конфигурация выглядит правильно. nginx делает самое длинное совпадение на месте, если вы не используете = или ~, так что все, что начинается с /app2/ в том числе /app2/helper будет соответствовать второму местоположению и иметь приоритет над location /

Я не могу воспроизвести вашу проблему, используя ту же самую конфигурацию, которую вы опубликовали. Я предполагаю, что вы не перезапустили nginx. Недостаточно перезагрузки.


0
2018-05-08 17:54



Я перезапустил nginx и даже остановился и начал его безрезультатно :( Вот версия, которую я использую: nginx version: nginx/1.10.3 (Ubuntu) - Ray
такой же ver. Вот. Вы уверены, что предоставили точный конфиг, который вы используете на производстве? Вы обращаетесь к сайту как к локальный / app2 / помощник ? - Luca Gibelli
Я обновил свой вопрос со всей конфигурацией. Нет, это не ТОЧНО то же самое server_name не является локальным хостом и app1 а также app2 являются конечными точками для обфускации. Все остальное - то же самое @ luca-gibelli - Ray
часть php тоже отсутствовала, и это было причиной проблемы - Luca Gibelli


Вы можете попробовать условное ведение журнала с помощью «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;

Обратите внимание: выше инструкция написана для неисследованной ссылочной цели, могут потребоваться некоторые изменения синтаксиса.


0
2018-05-17 10:11





В соответствии с Документация NGINX относительно местоположения:

[...] Чтобы найти местоположение, соответствующее заданному запросу, первые проверки nginx   местоположения, определенные с помощью префиксных строк (места префикса). среди   их выбирается местоположение с самым длинным совпадающим префиксом и   вспомнил. Затем проверяются регулярные выражения в порядке   их появление в файле конфигурации. Поиск регулярных   выражения заканчиваются в первом совпадении, а соответствующие   используется конфигурация. Если совпадение с регулярным выражением не найдено   то конфигурация расположения префикса, запомненная ранее,   используемый.

Итак, если какой-либо из location блоки с регулярным выражением ниже или выше location /app2 улавливает URL-адрес, он будет отправлен в журнал сервера по умолчанию (или нет файл журнала, в соответствии с некоторыми вашими вариантами).

приоритет для сортировки работает следующим образом:

  • (none): Если модификаторы отсутствуют, местоположение интерпретируется как префикс. Это означает, что указанное местоположение будет сопоставлено с началом URI запроса для определения соответствия.
  • =: Если используется знак равенства, этот блок будет считаться совпадением, если URI запроса точно соответствует указанному местоположению.
  • ~: Если присутствует модификатор тильды, это местоположение будет интерпретироваться как совпадающее с регистром регулярное выражение.
  • ~*: Если используется модификатор тильды и звездочки, блок местоположения будет интерпретироваться как совпадение регулярного выражения без учета регистра.
  • ^~: Если присутствует модификатор карата и тильды, и если этот блок выбран как наилучшее совпадение не регулярных выражений, то совпадение регулярных выражений не будет выполнено.

Для ясности я удаляю некоторую конфигурацию.

Возможно, вы могли бы попробовать предоставить приоритет приложения2, регулярное выражение с ^~ и посмотреть, что произойдет:

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

Это должно обеспечить выполнение наилучшего соответствия не регулярному выражению и оставить блоки регулярных выражений вторыми, и их не нужно дублировать, чтобы поймать другие местоположения, поскольку они унаследованы.


0
2018-05-21 05:08