proyectos nginx en subcarpetas

10

Me estoy frustrando con mi configuración nginx, por lo que solicito ayuda para escribir mi archivo de configuración para servir múltiples proyectos desde subdirectorios en la misma raíz. Este no es un alojamiento virtual, ya que todos usan el mismo valor de host. Quizás un ejemplo aclare mi intento:

  • solicitud 192.168.1.1/debe servir index.phpde/var/www/public/
  • solicitud 192.168.1.1/wiki/debe servir index.phpde/var/www/wiki/public/
  • solicitud 192.168.1.1/blog/debe servir index.phpde/var/www/blog/public/

Estos proyectos están usando PHP y usan fastcgi.

Mi configuración actual es muy mínima.

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;
    }
}

He intentado varias cosas con aliasy rewriteno pude configurar las cosas correctamente para fastcgi. Parece que debe haber una manera más elocuente que escribir bloques de ubicación y la duplicación root, index, SCRIPT_FILENAME, etc.

Se agradece cualquier sugerencia que me lleve en la dirección correcta.

Timothy
fuente
Por curiosidad, ¿en qué URL esperarías poder acceder a un archivo /var/www/public/wiki/foo.html en?
natacado
Ese es un buen punto, natacado. el directorio público principal será solo unos pocos archivos misceláneos y nunca debería usarse realmente de todos modos. Es una configuración interna, así que tendré control de eso. Esperemos que no tengamos que averiguarlo :)
Timothy

Respuestas:

16

Dado que sus proyectos no están realmente en la misma raíz, debe usar varias ubicaciones para esto.

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;
}

Además, coloque fastcgi_index en su archivo fastcgi_params e inclúyalo a nivel del servidor, de esa manera mantendrá sus ubicaciones de php lo más pequeñas posible.

Martin Fjordvald
fuente
1
Este era exactamente el tipo de configuración que esperaba evitar ... la duplicación. Por desgracia, si esto es "correcto", eso es lo que haré. ¡Gracias por tu ayuda, Martin!
Timothy
7

Resuelve por ubicación + 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
fuente
0

Esto es lo que probé, más detalles en 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;
    }
codificador de aplicaciones
fuente