2009-06-18 2 views
34

Ho configurato Nginx come server Web principale e due server basati su Mochiweb. Alcune richieste sono inverse con proxy a questi due server. ora, voglio accedere a phpmyadmin (che si trova in/var/www/nginx-default/phpMyAdmin) usando nginx, ma continua a dire che l'errore 404 non è stato trovato. Mi sto perdendo qualcosa di ovvio qui?La direttiva sulla posizione di Nginx non sembra funzionare. Mi sto perdendo qualcosa?

server { 
    ############### General Settings #################### 
    listen 80; 
    server_name localhost; 
    access_log /home/me/dev/wwwaccess.log; 

    ############## Document Root #######################  
    location/{ 
     root /home/me/dev; 
     index index.html index.htm index.php; 
    } 

    ############## PHPMyAdmin ####################### 
    location /phpmyadmin { 
     root /var/www/nginx-default/phpMyAdmin; 
     index index.html index.htm index.php; 
    } 

    ############## Proxy Settings for FastCGI Server ##### 
    location ~ \.php$ { 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME /home/me/dev$fastcgi_script_name; 
     include /etc/nginx/fastcgi_params; 
    } 


    ############# Proxy Settings for Mochi1 ############### 
    location /mochi1 { 
      proxy_pass   http://127.0.0.1:8000; 
      proxy_redirect  off; 

      proxy_set_header Host    $host; 
      proxy_set_header X-Real-IP  $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

      client_max_body_size  10m; 
      client_body_buffer_size 128k; 

      proxy_connect_timeout  90; 
      proxy_send_timeout   90; 
      proxy_read_timeout   3600; 

      proxy_buffering off; 
     } 

    ############# Proxy Settings for Mochi2 ############### 
    location /mochi2 { 
      proxy_pass   http://127.0.0.1:8001; 
      proxy_redirect  off; 

      proxy_set_header Host    $host; 
      proxy_set_header X-Real-IP  $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

      client_max_body_size  10m; 
      client_body_buffer_size 128k; 

      proxy_connect_timeout  90; 
      proxy_send_timeout   90; 
      proxy_read_timeout   3600; 

      proxy_buffering off; 
     } 

    ############# Error redirection pages ################ 
    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
     root /home/me/dev; 
    } 
} 

risposta

77

Il problema qui è che solo il "meglio" direttiva location ottiene preso, in questo ordine:

location = <path> (longest match wins) 
location ^~ <path> (longest match wins) 
location ~ <path> (first defined match wins) 
location <path> (longest match wins) 

Utilizzando questo set di regole, la direttiva /phpmyadminlocation viene eliminata dall'espressione regolare ".php$"Direttiva, quindi il primo viene completamente ignorato. Inoltre, la tua direttiva php fastcgi è cablata alla tua directory /home/me/dev, il che significa che phpMyAdmin è totalmente inaccessibile. È possibile utilizzare una riscrittura per ottenere la radice corretto per gli script phpMyAdmin:

location ~ \.php$ { 
    set $php_root /home/me/dev; 
    if ($request_uri ~* /phpmyadmin) { 
     set $php_root /var/www/nginx-default/phpMyAdmin; 
    } 

    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_index index.php; 
    fastcgi_param SCRIPT_FILENAME $php_root$fastcgi_script_name; 
    include /etc/nginx/fastcgi_params; 
} 
+5

Grazie per la risposta! Ho provato questo tempo indietro ma non ha funzionato mai allora. Ho sempre avuto errori HTTP 404. Solo ora ho capito il problema. Ho avuto i file phpmyadmin in/var/www/nginx-default/phpmyadmin. Quando nginx elabora la direttiva per un file php, cerca all'interno di/var/www/nginx-default/phpmyadmin/phpmyadmin il secondo phpmyadmin che è quello della richiesta. Quello è dalla directory principale, cerca la directory relativa che è di nuovo phpmyadmin. Quindi ho dovuto creare un'altra directory all'interno di phpmyadmin e mettere tutti i file lì. Ora funziona! – ErJab

+3

+1 Ho appena bruciato le ultime 2 ore cercando di capire il problema con il mio nginx.conf e FINALMENTE finì qui ... Sono nuovo di nginx ed è molto frustrante ottenere le cose nel modo giusto ... – dlamotte

+0

Grande risposta. Non mi rendevo conto che Nginx sceglie sempre solo una posizione, anche se più di una partita. Devo ammettere che è stato chiaramente indicato nella documentazione. –

0

Forse ricerche per index.html? Provare a cambiare per

location /phpmyadmin { 
    root /var/www/nginx-default/phpMyAdmin; 
    index index.php; 
} 

e aggiungere la sezione di seguito, per evitare problemi connessi a casi

location /phpMyAdmin { 
    rewrite ^/* /phpmyadmin last; 
} 
6

Impostare il 'root' direttamente. Meno direttive, meno informatica necessaria per impostare più vars. Ci sono anche altre cose (come fastcgi_param DOCUMENT_ROOT) che non verranno impostate correttamente nella risposta attualmente accettata. Questo metodo consente di gestire tutto ciò che comunque:

location ~ \.php$ { 
    if ($request_uri ~* /phpmyadmin) { 
     root /var/www/nginx-default/phpMyAdmin; 
    } 

    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_index index.php; 
    include /etc/nginx/fastcgi_params; 
} 
+1

se '/ phpmyadmin' fa parte dell'URI (' http: // host: port/phpmyadmin/... '), root deve essere impostato su'/var/www/nginx-default/', a meno che phpmyadmin sia installato a '/ var/www/nginx-default/phpMyAdmin/phpmyadmin'. – Sithsu

+0

Questa risposta mi ha aiutato moltissimo, grazie mille) Devo dire che ci dovrebbe essere ";" alla fine di questa riga: root/var/www/nginx-default/phpMyAdmin –

2

Ho lottato con questo per ore e che nessuna delle soluzioni di cui sopra lavorato per il mio caso (poiché avevo bisogno di eseguire index.php, index.php con argomenti, e altri script php di index.php), ma alla fine ha raggiunto le configurazioni di lavoro come la seguente:

location /php-app { 
    passenger_enabled off; 
    alias /path/to/php-app/$1; 
    index index.php index.html; 
    try_files $uri $uri/ @rewrite; 
    } 

    location @rewrite { 
    rewrite ^/php-app(.*)$ /index.php?q=$1 last; 
    } 

location ~ \.php$ { 
    alias /path/to/php-app/$1; 
    rewrite ^/php-app(.*)$ $1 last; 
    passenger_enabled off; 
    fastcgi_pass unix:/tmp/php-fpm.socket; 
    fastcgi_index index.php; 
    include /etc/nginx/fastcgi_params; 
    fastcgi_param SCRIPT_FILENAME /path/to/php-app$fastcgi_script_name; 
    fastcgi_intercept_errors on; 
    }