2012-05-01 15 views
6

Tener dificultades para tratar de encontrar bloques de ubicación en la configuración de nginx. Esto es lo que tengo:No se pueden encontrar bloques de ubicación en nginx

server { 
    listen   80; 
    server_name  _; 

    access_log  /var/log/nginx/example.com.access_log; 
    error_log  /var/log/nginx/example.com.error_log warn; 

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

    location /wp/ { 
     root    /var/www/wordpress; 
     index    index.php index.htm index.html; 
     fastcgi_index  index.php; 
    } 

    location ~* \.php$ { 
     try_files   $uri =404; 
     keepalive_timeout 0; 
     fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_pass   127.0.0.1:9000; 
    } 
} 

Navegación a/funciona como se espera y muestra la página web en/var/www/root, pero si los lugares de trabajo ya que creo que deben navegar a/wp me debería llevar al wordpress instalación en/var/www/wordpress. Todo lo que estoy haciendo es:

404 Not Found

nginx/0.7.67

Quiero estar seguro de la var directorio www///wordpress/var/www/root/wordpress y navegar a/wordpress todo es perfecto.

¿Qué estoy haciendo mal con el bloque de ubicación?

Nunca he configurado nginx antes y soy un poco de un Novato web completa de todos modos.

Quiero ser capaz de tener más bloques de localización para otras aplicaciones también. Esto es realmente solo un ejemplo básico para publicar aquí.

Actualizado nginx a la versión en backports Debian Squeeze. No hay mejoría:

404 Not Found

nginx/1.1.19

+0

¿Has probado ir a/wp/instead? –

+0

No desea imaginar qué tan desfasado es nginx/0.7.67. – Dayo

+0

Lo he intentado/wp/también. Este es el nginx de los repositorios de Debian 6. Creo que Debian tiende a quedarse un poco atrás. Aunque prefiero seguir con lo que hay en los repos. – goji

Respuesta

7

La razón por la que no está funcionando es que ...

A nivel de servidor, usted tiene "root/var/www/root". Así que, básicamente, cada bloque de ubicación usará esto a menos que se anule específicamente. Esta es una buena práctica.

continuación Has anulado en el "WP" bloque de ubicación a "/ var/www/wordpress". Sin embargo, el bloque de ubicación php todavía está usando el predeterminado.

Ahora cuando pones una solicitud a "/wp/folder_a/file_a.php" que se encuentra físicamente en "/var/www/wordpress/folder_a/file_a.php", la solicitud llega al bloque de ubicación php y dado que la carpeta raíz activa para ese bloque va a buscar el archivo en "/var/www/root/folder_a/file_a.php". Como resultado, obtiene un "404 no encontrado".

Puede cambiar la directiva de la raíz a nivel de servidor "/ var/www/wordpress" y retire la anulación de la ubicación wp. Esto resolverá ese problema, pero los scripts php en "/ var/www/root" ya no funcionarán. No estoy seguro si tienes alguno.

Si necesita ejecutar PHP bajo tanto "/ var/www/root" y "/ var/www/wordpress", que tiene que hacer esto:

server { 
    ... 
    root    /var/www/root; 
    index    index.php index.htm index.html; 
    # Keep fastcgi directives together under location 
    # so removed fastcgi_index 

    # Put keepalive_timeout under 'http' section if possible 

    location /wp/ { 
     root    /var/www/wordpress; 
     # One appearance of 'index' under server block is sufficient 
     location ~* \.php$ { 
      try_files   $uri =404; 
      fastcgi_index  index.php; 
      fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      fastcgi_pass   127.0.0.1:9000; 
     } 
    } 

    location ~* \.php$ { 
     try_files   $uri =404; 
     fastcgi_index  index.php; 
     fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_pass   127.0.0.1:9000; 
    } 
} 

Es decir, un nido de php duplicado bloque de ubicación debajo del bloque de ubicación wp. Heredará la directiva raíz para wp.

para ayudar a mantener las cosas sucinta y facilidad ediciones etc, puede poner las directivas fastcgi en un archivo separado e incluirlo en que sea necesario.

So in/path/fastcgi.params, que tiene:

fastcgi_index  index.php; 
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_pass   127.0.0.1:9000; 

Su conf entonces puede ser:

server { 
    ... 
    root    /var/www/root; 
    ... 
    location /wp/ { 
     root    /var/www/wordpress; 
     location ~* \.php$ { 
      try_files   $uri =404; 
      include /path/fastcgi.params; 
     } 
    } 

    location ~* \.php$ { 
     try_files   $uri =404; 
     include /path/fastcgi.params; 
    } 
} 

De esta manera, si usted necesita para editar cualquier parámetro fastcgi, que acaba de editar en el mismo lugar.

PS. Actualizar tu nginx no resolverá esto ya que no es un problema de versión ... ¡pero actualízate de todos modos!

+0

Gracias. ¡Había sospechado que estaba usando la raíz de documento incorrecta, pero no sabía que podrías apilar bloques de ubicación así! Publicaré cuando tenga mi éxito. – goji

+0

¿Hay alguna manera de ver exactamente cuál es el valor de SCRIPT_FILENAME cuando se ejecuta un script php? – goji

+0

'location/wp /' debe ser 'location^~/wp /' para evitar que la ubicación externa de php lo sobrescriba. Vea la [documentación] (http://wiki.nginx.org/HttpCoreModule#location) – kolbyjack

Cuestiones relacionadas