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
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.
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.
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.
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.