Здравствуйте, у меня есть две платформы, одна из которых работает как подкаталог. Я хотел бы иметь доступ и журнал ошибок для каждого приложения; однако он не работает так, как я предполагал :(
Вот что у меня есть:
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 ОК
/ app2 == app2.access.log && app2.error.log ОК
/ app2 / help == app1.access.log && app1.error.log * (хочу быть в журналах app2) НЕ ОК
Это происходит потому, что место, которое в конечном итоге обрабатывает ваши запросы, 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-сервера означает, что дублировать не так уж и много.
Вы можете попробовать условное ведение журнала с «если». Настройте карту для каждого местоположения и добавьте «если» в оператор журнала.
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;
Обратите внимание - приведенное выше утверждение написано для справочных целей, а не протестировано, могут потребоваться некоторые изменения синтаксиса.
Конфигурация выглядит правильно. nginx делает самое длинное совпадение в местоположении, если вы не используете =
или ~
, поэтому все, что начинается с /app2/
включая /app2/helper
будет соответствовать второму местоположению и иметь приоритет над location /
Я не могу воспроизвести вашу проблему, используя ту же конфигурацию, которую вы опубликовали. Я предполагаю, что вы не перезапускали nginx. Перезарядки может быть недостаточно.
В соответствии с Документация NGINX относительно местоположения:
[...] Чтобы найти местоположение, соответствующее заданному запросу, nginx сначала проверяет местоположения, определенные с помощью строк префикса (местоположения префикса). Среди них выбирается и запоминается место с самым длинным совпадающим префиксом. Затем проверяются регулярные выражения в порядке их появления в файле конфигурации. Поиск регулярных выражений завершается при первом совпадении, и используется соответствующая конфигурация. Если совпадения с регулярным выражением не найдено, используется ранее запомненная конфигурация расположения префикса.
Итак, если любой из location
блоки с регулярным выражением ниже или выше location
/app2
захватывает URL-адрес, он будет отправлен в журнал сервера по умолчанию (или не в файл журнала, в зависимости от некоторых из ваших опций).
В приоритет для сортировки работает так:
(none)
: Если модификаторы отсутствуют, местоположение интерпретируется как совпадение префикса. Это означает, что указанное местоположение будет сопоставлено с началом URI запроса для определения совпадения.=
: Если используется знак равенства, этот блок будет считаться совпадающим, если URI запроса точно соответствует указанному местоположению.~
: Если присутствует модификатор тильды, это местоположение будет интерпретировано как совпадение регулярного выражения с учетом регистра.~*
: Если используется модификатор тильды и звездочки, блок местоположения будет интерпретироваться как совпадение регулярного выражения без учета регистра.^~
: Если присутствует модификатор carat и тильда, и если этот блок выбран как лучшее совпадение нерегулярного выражения, сопоставление регулярного выражения не произойдет.Я удаляю часть конфигурации для ясности.
Может быть, вы могли бы попробовать дать приоритет 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;
}
}
Это должно обеспечить выполнение наиболее подходящего нерегулярного выражения и оставить блоки регулярных выражений вторыми, и их не нужно дублировать, чтобы поймать другие местоположения, поскольку они наследуются.