2009-06-18 12 views
34

Ustawiłem Nginx jako mój główny serwer internetowy i mam za sobą dwa serwery oparte na Mochiweb. Niektóre żądania są odwracane do tych dwóch serwerów. teraz, chcę uzyskać dostęp do phpmyadmin (zlokalizowanego w/var/www/nginx-default/phpMyAdmin) za pomocą nginx, ale ciągle mówi się, że nie znaleziono błędu 404. Czy tu brakuje czegoś oczywistego?Dyrektywa lokalizacyjna Nginx wydaje się nie działać. Czy czegoś brakuje?

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

Odpowiedz

77

Problem polega na tym, że tylko „najlepsze” dyrektywa location zostanie podjęta, w tej kolejności:

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

Stosując ten zestaw reguł, dyrektywa /phpmyadminlocation jest zwalczana przez wyrażenie regularne ".php$" location, więc ten pierwszy jest całkowicie ignorowany. Dodatkowo twoja dyrektywa php fastcgi jest podłączona do twojego katalogu /home/me/dev, co oznacza, że ​​phpMyAdmin jest całkowicie niedostępny. Możesz użyć przepisania, aby uzyskać poprawny katalog główny skryptów 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

Dzięki za odpowiedź! Próbowałem tego dawno temu, ale wtedy nigdy nie działało. Zawsze miałem błędy HTTP 404. Dopiero teraz zrozumiałem problem. Miałem pliki phpmyadmin w/var/www/nginx-default/phpmyadmin. Kiedy nginx przetwarza dyrektywę dla pliku php, wyszukuje wewnątrz/var/www/nginx-default/phpmyadmin/phpmyadmin drugi phpmyadmin będący tym z żądania. To z katalogu głównego, szuka katalogu względnego, który jest ponownie phpmyadmin. Musiałem więc stworzyć inny katalog wewnątrz phpmyadmin i umieścić tam wszystkie pliki. Teraz działa! – ErJab

+3

+1 Właśnie spłonęły ostatnie 2 godziny próbując dowiedzieć się problemu z moim nginx.conf i WRESZCIE skończyły się tutaj ... Jestem nowy dla nginx i to jest bardzo frustrujące, aby wszystko było w porządku ... – dlamotte

+0

Świetnie odpowiedź. Nie zdawałem sobie sprawy, że Nginx zawsze wybiera tylko jedną lokalizację, nawet jeśli pasuje więcej niż jedna. Muszę przyznać, że zostało to jasno określone w dokumentacji. –

0

Być może wyszukuje index.html? Spróbuj zmienić się

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

i dodać sekcję poniżej, aby uniknąć problemów związanych z case-

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

Ustaw bezpośrednio "root". Mniej dyrektyw, mniej komputerów potrzebnych do ustawienia większej liczby zmiennych. Istnieją również inne rzeczy (takie jak fastcgi_param DOCUMENT_ROOT), które nie zostaną poprawnie ustawione w aktualnie akceptowanej odpowiedzi. Metoda ta będzie obsługiwać wszystko, jednakże:

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

jeśli '/ phpmyadmin' jest częścią URI (' http: // host: port/phpmyadmin/... '), root powinien być ustawiony na'/var/www/nginx-default/', chyba że phpmyadmin jest zainstalowany do '/ var/www/nginx-default/phpMyAdmin/phpmyadmin'. – Sithsu

+0

Ta odpowiedź bardzo mi pomogła, wielkie dzięki) Powinienem wspomnieć, że powinno być ";" na końcu tej linii: root/var/www/nginx-default/phpMyAdmin –

2

Walczyłem z tym przez kilka godzin teraz i żadna z opisanych powyżej rozwiązań pracował na moim przypadku (ponieważ musiałem uruchomić index.php index.php z argumentami, a inne skrypty php niż index.php), ale w końcu osiągnęły konfiguracje robocze:

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; 
    } 
Powiązane problemy