2012-05-01 11 views
6

Difficoltà a cercare di individuare i blocchi di posizione nella configurazione di nginx. Questo è quello che ho:Impossibile individuare i blocchi di posizione in 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; 
    } 
} 

Navigazione a/funziona come previsto e mostra il sito nella directory/var/www/root, ma se posizioni funzionano come penso che dovrebbero navigando a/wp mi dovrebbe prendere per il wordpress installazione in/var/www/wordpress. Tutto quello che sto ottenendo è:

404 Not Found

nginx/0.7.67

Se riposizionare l'/ directory/var www/wordpress a/var/www/root/wordpress e vai a/wordpress tutto è perfetto.

Cosa sto facendo male con il blocco posizione ??

Non ho mai configurato nginx prima e sono comunque un po 'un newb web completo.

Desidero poter disporre anche di più blocchi di posizione per altre applicazioni. Questo è davvero solo un esempio di base per la pubblicazione qui.

Aggiornamento di nginx alla versione nei backport di Debian Squeeze. Nessun miglioramento:

404 Not Found

nginx/1.1.19

+0

Hai provato a passare a/wp/invece? –

+0

Non si vuole immaginare come non sia aggiornato nginx/0.7.67. – Dayo

+0

Ho provato anche/wp /. Questo è il nginx dai repository Debian 6. Immagino che Debian tenda ad essere un po 'indietro. Tendo a preferire di restare con ciò che è nei repository però. – goji

risposta

7

Il motivo per cui non funziona è che ...

A livello di server, è necessario "root/var/www/root". Quindi, in pratica, ogni blocco di posizione lo userà, a meno che non venga sovrascritto in modo specifico. Questa è una buona pratica.

L'avete quindi sostituito nel blocco di posizione "wp" in "/ var/www/wordpress". Tuttavia, il blocco di posizione php utilizza ancora il valore predefinito.

Ora quando si inserisce una richiesta in "/wp/folder_a/file_a.php" che si trova fisicamente in "/var/www/wordpress/folder_a/file_a.php", la richiesta raggiunge il blocco di posizione php e data la cartella radice attiva per quel blocco, va a cercare il file in "/var/www/root/folder_a/file_a.php". Di conseguenza, ottieni un "404 non trovato".

È possibile modificare la direttiva radice del livello server su "/ var/www/wordpress" e rimuovere l'override nel percorso wp. Questo risolverà il problema ma gli script php in "/ var/www/root" non funzioneranno più. Non sono sicuro se ne hai.

Se è necessario eseguire php in entrambi "/ var/www/root" e "/ var/www/wordpress", è necessario fare questo:

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

Cioè, il nido di un php duplicato blocco di posizione sotto il blocco di posizione wp. Erediterà la direttiva root per wp.

Per aiutare a mantenere le cose di successo e semplificare le modifiche ecc., È possibile inserire le direttive fastcgi in un file separato e includerlo in base alle necessità.

Così in/percorso/fastcgi.params, si dispone:

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

tuo conf può quindi essere:

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

In questo modo, se è necessario modificare ogni param FastCGI, basta modificarlo in un unico luogo.

PS. Aggiornare il tuo nginx non risolverà questo dato che non è un problema di versione .. ma aggiorna comunque!

+0

Grazie. Avevo il sospetto che stesse usando la root_doc documento, ma non sapevo che potevi impilare blocchi di posizione del genere! Ti posterò quando avrò il mio successo. – goji

+0

Esiste un modo per visualizzare esattamente qual è il valore di SCRIPT_FILENAME quando viene eseguito uno script php? – goji

+0

'location/wp /' deve essere 'location^~/wp /' per evitare che il percorso php esterno lo sovrascriva. Vedi la [documentazione] (http://wiki.nginx.org/HttpCoreModule#location) – kolbyjack

Problemi correlati