projets nginx dans les sous-dossiers

10

Je suis frustré par ma configuration nginx et je demande donc de l'aide pour écrire mon fichier de configuration pour servir plusieurs projets à partir de sous-répertoires dans la même racine. Il ne s'agit pas d'un hébergement virtuel car ils utilisent tous la même valeur d'hôte. Peut-être qu'un exemple clarifiera ma tentative:

  • la demande 192.168.1.1/doit émaner index.phpde/var/www/public/
  • la demande 192.168.1.1/wiki/doit émaner index.phpde/var/www/wiki/public/
  • la demande 192.168.1.1/blog/doit émaner index.phpde/var/www/blog/public/

Ces projets utilisent PHP et utilisent fastcgi.

Ma configuration actuelle est très minimale.

server {
    listen 80 default;
    server_name localhost;

    access_log /var/log/nginx/localhost.access.log;

    root /var/www;
    index index.php index.html;

    location ~ \.php$ {
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /var/www$fastcgi_script_name;
        include fastcgi_params;
    }
}

J'ai essayé différentes choses avec aliaset rewritemais n'a pas été en mesure de faire avancer les choses correctement pour FastCGI. Il semble qu'il devrait y avoir une façon plus éloquente que l' écriture de blocs d'emplacement et la duplication root, index, SCRIPT_FILENAME, etc.

Tous les conseils pour me diriger dans la bonne direction sont appréciés.

Timothée
la source
Par curiosité, à quelle URL vous attendez-vous pour pouvoir accéder à un fichier /var/www/public/wiki/foo.html?
natacado
C'est un bon point, natacado. le répertoire public principal ne sera que quelques fichiers divers et ne devrait jamais être utilisé de toute façon. C'est une configuration interne, donc j'aurai le contrôle de cela. Espérons que nous n'aurons pas à le savoir :)
Timothy

Réponses:

16

Étant donné que vos projets ne sont pas réellement dans la même racine, vous devez utiliser plusieurs emplacements pour cela.

location /wiki {
    root /var/www/wiki/public;
}

location ~ /wiki/.+\.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_param  SCRIPT_FILENAME /var/www/wiki/public$fastcgi_script_name;
}

location /blog {
    root /var/www/blog/public;
}

location ~ /blog/.+\.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_param  SCRIPT_FILENAME /var/www/blog/public$fastcgi_script_name;
}

Aussi, mettez fastcgi_index dans votre fichier fastcgi_params et incluez-le au niveau du serveur, de cette façon vous gardez vos emplacements php aussi petits que possible.

Martin Fjordvald
la source
1
C'était exactement le type de configuration que j'espérais éviter ... la duplication. Hélas, si c'est "convenable", c'est ce que je ferai. Merci pour votre aide, Martin!
Timothy
7

Résout par emplacement + alias:


location / {
   root /var/www/public;
   index index.php;
}
location /blog/ {
   alias /var/www/blog/public/;
   index index.php;
}
location /wiki/ {
   alias /var/www/wiki/public/;
   index index.php;
}

location ~ \.php$ {
   #your fastcgi configuration here 
}

Vadim
la source
0

Voici ce que j'ai essayé, plus de détails sur http://programmersjunk.blogspot.com/2013/11/nginx-multiple-sites-in-subdirectories.html

    location /Site1/ {
            root /usr/share/nginx/www/Site1;
           try_files $uri $uri/ /index.php?$query_string;
    }

    # the images need a seperate entry as we dont want to concatenate that with index.php      
    location ~ /Site1/.+\.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
            root /usr/share/nginx/www/Site1;
    }
    # pass the PHP scripts to FastCGI server
    location ~ /Site1/.+\.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            allow 127.0.0.1;
    #       # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    #       # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_index index.php;
    }

location /Site3/ {
            root    /usr/share/nginx/www/Site3;
    }

    # pass the PHP scripts to FastCGI server
    location ~ /Site3/.+\.php$ {
            allow 127.0.0.1;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            include fastcgi_params;
            #we are directly using the $request_filename as its a single php script
            fastcgi_param SCRIPT_FILENAME $request_filename;
    }
appcoder
la source