web-dev-qa-db-fra.com

Comment mapper des demandes vers un répertoire externe

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
2
Nick Rolando

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:

  • emplacement/coolapp /
  • emplacement ~ .php

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

4
krokola