2009-06-18 71 views
34

我已經將Nginx設置爲我的主要Web服務器,並且在它後面有兩個基於Mochiweb的服務器。某些請求被反向代理到這兩臺服務器。 現在,我想使用nginx訪問phpmyadmin(位於/ var/www/nginx-default/phpMyAdmin),但它一直說錯誤404找不到。我在這裏錯過了很明顯的東西嗎Nginx位置指令似乎沒有工作。我錯過了什麼嗎?

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

回答

77

這裏的問題是,只有「最佳」 location指令被採取,順序如下:

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

使用此規則集,您的/phpmyadminlocation指令被正則表達式「.php$」擊敗指令,所以前者完全被忽略。另外,你的php fastcgi指令被硬連線到你的/home/me/dev目錄,這意味着phpMyAdmin是完全無法訪問的。您可以使用重寫來爲您的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

感謝您的答案!我嘗試了很久,但從未回過頭。我總是得到HTTP 404錯誤。直到現在我才明白這個問題。我有/ var/www/nginx-default/phpmyadmin下的phpmyadmin文件。當nginx處理php文件的指令時,它在/ var/www/nginx-default/phpmyadmin/phpmyadmin中搜索第二個phpmyadmin,它是請求中的一個。這是從根目錄,它搜索相關的目錄,這又是phpmyadmin。所以我不得不在phpmyadmin中創建另一個目錄並將所有文件放在那裏。現在它工作了! – ErJab 2010-02-10 18:23:07

+3

+1我剛剛燒燬了最近2個小時,試圖找出我的nginx.conf中的問題,最後在這裏結束......我是nginx的新手,讓事情恰到好處是非常令人沮喪的... – dlamotte 2010-05-06 20:18:42

0

也許它搜索index.html?嘗試改變,以

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

,並添加部分的下方,避免了與案件有關的問題

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

直接設置'root'。更少的指令,更少的計算需要設置更多的變量。還有其他的東西(比如fastcgi_param DOCUMENT_ROOT)在當前接受的答案中不會被正確設置。此方法將處理所有然而:

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

我現在有了這個掙扎了幾個小時,沒有上述合作,我的情況下討論的解決方案(因爲我需要的index.php運行的index.php帶參數,並其他的PHP腳本比index.php),但最終達到了以下工作配置:

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