2009-06-18 14 views
34

Nginx'i ana web sunucum olarak kurdum ve arkasındaki iki Mochiweb tabanlı sunucu var. Bazı istekler bu iki sunucuya ters çevrilmiştir. şimdi, nginx kullanarak phpmyadmin (/ var/www/nginx-default/phpMyAdmin adresinde bulunan) adresine erişmek istiyorum, ancak Hata 404'ün bulunmadığını söylemeye devam ediyor. Burada bariz bir şey eksik miyim?Nginx konum yönergesi çalışmıyor görünüyor. Bir şey mi eksik?

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

cevap

77

Buradaki sorun sadece "en iyi" location direktifi bu sırada alınıyor olmasıdır:

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

Bu kural kümesini kullanarak, /phpmyadminlocation yönergesinin anlamı, ".php$" location direktifi, bu yüzden eski tamamen göz ardı ediliyor. Ayrıca, php fastcgi yönergeleriniz /home/me/dev dizininize bağlıdır, bu da phpMyAdmin'in tamamen erişilemez olduğu anlamına gelir. Sen phpMyAdmin komut için doğru kök almak için bir yeniden yazım kullanabilirsiniz:

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

Cevabınız için teşekkürler! Bunu uzun zaman önce denedim ama o zamanlar hiç işe yaramadı. Her zaman HTTP 404 hatalarım var. Sadece şimdi problemi çözdüm. Phpmyadmin dosyalarını/var/www/nginx-default/phpmyadmin altında yaptım. Nginx bir php dosyasının yönergesini işlediğinde,/var/www/nginx-default/phpmyadmin/phpmyadmin içinde arama yapar, ikinci phpmyadmin istekte yer alır. Bu kök dizinden, tekrar phpmyadmin olan ilgili dizini arar. Bu yüzden phpmyadmin'in içinde başka bir dizin oluşturmak ve oradaki tüm dosyaları koymak zorunda kaldım. Şimdi çalışıyor! – ErJab

+3

+ 1 Nginx.conf ve FINALLY ile sorunu anlamaya çalışırken son 2 saatimi yaktım. Nginx'e yeni geldim ve işleri düzeltmek çok sinir bozucuy ... – dlamotte

+0

Great Cevap. Nginx'in birden fazla eşleşme olsa bile her zaman sadece bir yer seçtiğini farketmedim. Belgede açıkça belirtildiğini itiraf etmeliyim. –

0

Belki de index.html için arama yapar? vaka ile ilgili sorunları

önlemek için, aşağıdaki bölümü

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

için değiştirmeyi deneyin ve eklemek

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

doğrudan 'kök' ayarlayın. Daha az yönerge, daha fazla bilgi için daha az hesaplama gerekiyor. Şu anda kabul edilen cevapta doğru olarak ayarlanmayacak başka şeyler de var (fastcgi_param DOCUMENT_ROOT gibi). Bu yöntem o ancak tüm idare edecek:

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

'/ phpmyadmin', URI'nin bir parçasıysa (' http: // host: port/phpmyadmin/... '), phpmyadmin yüklü değilse, root'/var/www/nginx-default/'olarak ayarlanmalıdır./var/www/nginx-default/phpMyAdmin/phpmyadmin'. – Sithsu

+0

Bu cevap bana çok yardımcı oldu, çok teşekkürler) ';' bu satırın sonunda: kök/var/www/nginx-default/phpMyAdmin –

2

şimdi saatlerce bu mücadele ve benim durumumda çalıştı yukarıda ele çözümlerin hiçbiri, (i argümanlarla index.php, index.php çalıştırmak için gerekli beri ve index.php'den başka php betikleri, ancak nihayet aşağıdaki gibi çalışma konfigürasyonlarına ulaşıldı:

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