J'ai un répertoire/une application située en dehors du répertoire racine Web de mon site.
Dites que le site est ici:
/var/www/site/htdocs/
Et l'application externe se trouve ici:
/var/www/apps/coolapp/
Ma question est de savoir comment puis-je configurer nginx pour mapper/acheminer toutes les demandes qui ressemblent à www.mysite.com/coolapp/*
(l'astérisque est un caractère générique) vers l'emplacement externe /var/www/apps/coolapp/
? Par exemple, www.monsite.com/coolapp/test.php doit utiliser le serveur /var/www/apps/coolapp/test.php
.
Selon la réponse de @ krokola, j'ai essayé d'ajouter la directive alias
dans le fichier production.conf
inclus dans le fichier principal nginx.conf
. Voici à quoi ressemble production.conf
actuellement
server {
listen 80;
listen 443 ssl;
ssl_certificate /blah/blah/blah;
ssl_certificate_key /blah/blah/blah;
ssl_protocols blah blah blah;
ssl_ciphers blahblahblah;
ssl_prefer_server_ciphers blahblah;
access_log /var/log/nginx/www.mysite.com-access.log;
error_log /var/log/nginx/www.mysite.com-error.log error;
server_name mysite.com www.mysite.com;
root /var/www/site/htdocs;
include conf/magento_rewrites.conf;
include conf/magento_security.conf;
include /var/www/site/nginx/*.conf;
#-------CODE IN QUESTION-------
location /coolapp/ {
alias /var/www/apps/coolapp/;
location ~ \.php {
# Copied from "# PHP Handler" below
fastcgi_param MAGE_RUN_CODE default;
fastcgi_param MAGE_RUN_TYPE store;
fastcgi_param HTTPS $fastcgi_https;
rewrite_log on;
# By default, only handle fcgi without caching
include conf/magento_fcgi.conf;
}
}
# PHP handler
location ~ \.php {
## Catch 404s that try_files miss
if (!-e $request_filename) { rewrite / /index.php last; }
## Store code is defined in administration > Configuration > Manage Stores
fastcgi_param MAGE_RUN_CODE default;
fastcgi_param MAGE_RUN_TYPE store;
fastcgi_param HTTPS $fastcgi_https;
rewrite_log on;
# By default, only handle fcgi without caching
include conf/magento_fcgi.conf;
}
# 404s are handled by front controller
location @magefc {
rewrite ^(.*) /index.php?$query_string last;
}
# Last path match hands to magento or sets global cache-control
location / {
## Maintenance page overrides front controller
index index.html index.php;
try_files $uri $uri/ @magefc;
expires 24h;
}
}
conf/magento_fcgi.conf ressemble à ceci:
fastcgi_pass phpfpm;
## Tell the upstream who is making the request
proxy_set_header Host $Host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
# Ensure the admin panels have enough time to complete large requests ie: report generation, product import/export
proxy_read_timeout 1600s;
# Ensure PHP knows when we use HTTPS
fastcgi_param HTTPS $fastcgi_https;
## Fcgi Settings
include fastcgi_params;
fastcgi_connect_timeout 120;
fastcgi_send_timeout 320s;
fastcgi_read_timeout 1600s;
fastcgi_buffer_size 128k;
fastcgi_buffers 512 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors off;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
# nginx will buffer objects to disk that are too large for the buffers above
fastcgi_temp_path /tmpfs/nginx/tmp 1 2;
#fastcgi_keep_conn on; # NGINX 1.1.14
expires off; ## Do not cache dynamic content
Vous devez définir un alias.
location /coolapp/ {
alias /var/www/apps/coolapp/;
}
En savoir plus nginx
Mise à jour après commentaire:
Malheureusement, ça ne marche pas pour moi. Je reçois une réponse 404 en essayant de demander www.monsite.com/coolapp/test.php quand /var/www/apps/coolapp/test.php existe
Pour comprendre pourquoi alias ne fonctionne pas, vous devez examiner comment nginx traite une requête: request_processing
Du manuel:
Nginx commence par rechercher l’emplacement de préfixe le plus spécifique donné par les chaînes littérales, quel que soit l’ordre indiqué. Dans la configuration ci-dessus, le seul emplacement du préfixe est “/” et, comme il correspond à toute demande, il sera utilisé en dernier recours. Ensuite, nginx vérifie les emplacements donnés par une expression régulière dans l’ordre indiqué dans le fichier de configuration. La première expression correspondante arrête la recherche et nginx utilisera cet emplacement. Si aucune expression régulière ne correspond à une demande, nginx utilise l'emplacement de préfixe le plus spécifique trouvé précédemment.
Si une expression régulière correspond à une demande, elle remplace les préfixes statiques. Dans votre configuration, lorsque vous accédez à /var/www/apps/coolapp/test.php, 2 emplacements correspondent:
Comme le deuxième emplacement est une expression régulière, il remplace le premier. Mais lorsque vous accédez à un fichier html, par exemple: /var/www/apps/coolapp/test.html, si fonctionne comme prévu, car un seul emplacement est trouvé, l’emplacement alias.
Afin de résoudre le problème d'accès à php dans le chemin d'alias et de remplacer l'emplacement php par défaut, vous pouvez ajouter un emplacement imbriqué dans l'emplacement d'alias et faire ce que vous souhaitez faire lorsque vous appelez des fichiers php à l'emplacement imbriqué. Dans votre configuration, cela serait:
location /coolapp/ {
alias /var/www/apps/coolapp/;
location ~ \.php {
Do whatever is needed
}
}
Vous pouvez trouver un exemple ici