J'essaie actuellement de séparer 3 applications d'un référentiel en 3, mais en conservant la structure d'URL, donc essentiellement des emplacements différents sous le même domaine doivent être fournis par différentes applications.
Ce avec quoi je me bats, c'est qu'une des applications doit être la solution de remplacement pour les URL inexistantes, donc si la première ne correspond pas, et la seconde non, alors la troisième devrait gérer la demande
La structure que j'ai est la suivante:
/ etc / nginx / sites-enabled / main_site, ici, à part nom_serveur et journaux que j'ai include /etc/nginx/subsites-enabled/*
, où j'ai 3 fichiers de configuration, un pour chacune des applications.
Chacun des 3 fichiers de configuration contient un bloc d'emplacement.
J'ai essayé l'anticipation négative dans regex (essentiellement en essayant de coder en dur les URL que les autres applications gèrent), mais j'ai échoué.
Donc, pour résumer:
/ et / communauté doit être fourni par /etc/nginx/subsites-enabled/example.org/home (quelques scripts Perl)
/ les nouvelles doivent être fournies par /etc/nginx/subsites-enabled/example.org/news (wordpress)
tout le reste doit être livré par /etc/nginx/subsites-enabled/example.org/app (cake app)
Le bit perl fonctionne bien. Le problème que j'ai, c'est que l'application prend le relais de l'actualité (probablement parce qu'elle correspond. *), J'ai essayé différentes options (j'y suis depuis 2 jours) mais aucune n'a résolu tous les problèmes (parfois les actifs statiques ne fonctionneraient pas, etc.).
Ma configuration est:
/etc/nginx/sites-enabled/example.org:
server {
listen 80;
server_name example.org;
error_log /var/log/nginx/example.org.log;
include /etc/nginx/subsites-enabled/example.org/*;
}
/etc/nginx/subsites-enabled/example.org/home:
location = / {
rewrite ^.*$ /index.pl last;
}
location ~* /community(.*) {
rewrite ^.*$ /index.pl last;
}
location ~ \.pl {
root /var/www/vhosts/home;
access_log /var/log/nginx/home/access.log;
error_log /var/log/nginx/home/error.log;
include /etc/nginx/fastcgi_params;
fastcgi_index index.pl;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/home$fastcgi_script_name;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
}
/ etc / ngins / subsites-enabled / news
location /news {
access_log /var/log/nginx/news/access.log;
error_log /var/log/nginx/news/error.log debug;
error_page 404 = /news/index.php;
root /var/www/vhosts/news;
index index.php;
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}
location ~ \.php {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/news$fastcgi_script_name;
}
}
/ etc / nginx / subsites-enabled / app:
location ~ .* {
access_log /var/log/nginx/app/access.log;
error_log /var/log/nginx/app/error.log;
rewrite_log on;
index index.php;
root /var/www/vhosts/app/app/webroot;
if (-f $request_filename) {
expires 30d;
break;
}
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}
location ~ \.php {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/app/app/webroot$fastcgi_script_name;
}
}
@
préfixe) qui correspond à votre application par défaut. Vous pouvez également configurer une page d'erreur qui mappe un 404 à un emplacement nommé.location ^~ /news
. b) pour votre bloc d'application, vous devriez pouvoir le fairelocation /
(ce n'est pas la même choselocation = /
, mais doit correspondre à tout ce qui ne l'est pas déjà. c) dans certains cas (en particulier les regex), l'ordre importe - vous pouvez combiner les 3 fichiers dans un seul fichier avec les blocs dans le bon ordre. Utilisez également try_files au lieu de!-e
. Voir enfin wiki.nginx.org/HttpCoreModule#location .Réponses:
Il y a quelques petites choses qui ne vont pas dans votre configuration, les deux pertinentes étant:
Par exemple, prenez l'URL example.org/news/test.htm
location /news
bloc correspondra/news/test.htm
- cela ne change pas, juste parce qu'il est dans le bloc de localisation/var/www/vhosts/news/news/test.htm
if (!-e $request_filename)
déclaration doit capturer ce fichier inexistant/index.php
last
les processus recommence (rupture du bloc de localisation)/index.php
est maintenant capturé par lelocation /app block
.Le problème mentionné ci-dessus, avec la directive racine, est aggravé lorsque vous accédez au bloc d'emplacement de votre application. Contrairement au bloc `` news '', où vous pouvez simplement supprimer `` news '' du chemin (car il sera ajouté à nouveau), vous ne pouvez pas le faire pour le chemin de l'application, qui se termine par 'webroot'.
La solution réside dans la
alias
directive. Cela ne change pas le document_root, mais cela change le chemin d'accès au fichier qui est utilisé pour servir la demande. Malheureusement,rewrite
ettry_files
ont tendance à se comporter un peu de façon inattendue avecalias
.Commençons par un exemple simple - pas de PHP - juste du HTML et votre bloc Perl - mais avec une structure de dossiers correspondant à la vôtre (testé sur Nginx 1.0.12, CentOS 6):
location = /
- ne correspondra qu'au chemin racinelocation ^~ /community
- correspondra à chaque chemin commençant par / communautélocation ~ \.pl
- correspondra à tous les fichiers contenant .pllocation ^~ /news
- correspondra à chaque chemin commençant par / newslocation ^~ /app
- correspondra à chaque chemin commençant par / applocation /
- correspondra à tous les chemins non correspondants ci-dessusVous devriez pouvoir supprimer le
^~
- mais cela peut offrir une légère amélioration des performances, car il arrête la recherche une fois qu'une correspondance est trouvée.Bien qu'il devrait être simple d'ajouter à nouveau les blocs PHP, il y a, malheureusement, une légère difficulté -
try_files
(et votre réécriture) ne finissent pas par passer le chemin souhaité vers le bloc d'emplacement imbriqué - et à utiliseralias
lorsque seule l'extension est spécifié dans le bloc d'emplacement ne fonctionne pas.Une solution consiste à utiliser des blocs d'emplacement séparés qui effectuent une capture avec la directive alias - ce n'est pas tout à fait élégant, mais pour autant que je sache, cela fonctionne (encore une fois, testé sur Nginx 1.0.12, CentOS 6 - de bien sûr, je n'ai pas configuré CakePHP, Wordpress et Perl - j'ai juste utilisé quelques fichiers PHP et HTML dans chaque dossier)
La configuration ci-dessus, prend la simple ci-dessus et apporte deux modifications:
location ~* ^/news/(.*\.php)$
- correspondra à tous les fichiers se terminant par .php, avec des chemins commençant par / news /location ~* ^/app/(.*\.php)$
- correspondra à tous les fichiers se terminant par .php, avec des chemins commençant par / app /^~
correspondance - cela est nécessaire pour que les deux blocs d'emplacement ajoutés puissent correspondre aux chemins (sinon la correspondance s'arrêterait sur les blocs / news ou / app).Il convient de noter que l'ordre de correspondance d'emplacement est très important ici:
=
)^~
secondeUn regex correspondant remplacera une chaîne droite!
Un point important à mentionner est que lorsque les captures sont utilisées avec un alias, l'URL entière est remplacée - pas seulement le dossier principal. Malheureusement, cela signifie qu'il
$fastcgi_script_name
est laissé vide - donc, j'ai utilisé$1
ci-dessus à la place.Je suis sûr que vous devrez apporter quelques modifications, mais le principe de base devrait être fonctionnel. Vous devriez être en mesure de séparer les blocs en plusieurs fichiers selon vos besoins - la commande ne devrait pas affecter la configuration.
la source