2009-06-18 22 views
34

Tôi đã thiết lập Nginx làm máy chủ web chính của mình và có hai máy chủ dựa trên Mochiweb đằng sau nó. Một số yêu cầu được đảo ngược proxy cho hai máy chủ này. bây giờ, tôi muốn truy cập phpmyadmin (nằm tại/var/www/nginx-default/phpMyAdmin) bằng nginx, nhưng nó vẫn nói lỗi 404 không tìm thấy. Tôi có thiếu thứ gì đó hiển nhiên ở đây không?Chỉ thị vị trí Nginx dường như không hoạt động. Tui bỏ lỡ điều gì vậy?

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

Trả lời

77

Vấn đề ở đây là chỉ "tốt nhất" location chỉ thị được thực hiện, theo thứ tự này:

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

Sử dụng quy tắc này, chỉ thị /phpmyadminlocation của bạn bị đánh bại bởi cụm từ thông dụng ".php$" location chỉ thị, vì vậy trước đây bị bỏ qua hoàn toàn. Ngoài ra, chỉ thị php fastcgi của bạn được kết nối với thư mục /home/me/dev của bạn, có nghĩa là phpMyAdmin hoàn toàn không thể truy cập được. Bạn có thể sử dụng viết lại để lấy đúng gốc cho tập lệnh phpMyAdmin của mình:

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

Cảm ơn bạn đã trả lời! Tôi đã cố gắng này một thời gian dài trở lại nhưng nó không bao giờ làm việc trở lại sau đó. Tôi luôn gặp lỗi HTTP 404. Chỉ bây giờ tôi đã tìm ra được vấn đề. Tôi đã có các tập tin phpmyadmin dưới/var/www/nginx-default/phpmyadmin. Khi nginx xử lý chỉ thị cho một tập tin php, nó tìm kiếm bên trong/var/www/nginx-default/phpmyadmin/phpmyadmin phpmyadmin thứ hai là một từ yêu cầu. Đó là từ thư mục gốc, nó tìm kiếm thư mục tương đối mà lại là phpmyadmin. Vì vậy, tôi đã phải tạo một thư mục bên trong phpmyadmin và đặt tất cả các tập tin đó. Bây giờ nó hoạt động! – ErJab

+3

+1 Tôi vừa mới cháy hết 2 tiếng đồng hồ cố gắng tìm ra vấn đề với nginx.conf của tôi và CUỐI CÙNG kết thúc ở đây ... Tôi mới đến nginx và nó rất bực bội để có được những điều đúng ... – dlamotte

+0

Tuyệt vời câu trả lời. Tôi không nhận ra rằng Nginx luôn chọn chỉ một vị trí, ngay cả khi có nhiều hơn một trận đấu. Tôi phải thừa nhận rằng nó đã được ghi rõ trong tài liệu. –

0

Có lẽ nó tìm kiếm index.html? Hãy thử thay đổi để

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

và thêm phần dưới đây, để tránh trường hợp liên quan đến vấn đề

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

Đặt 'gốc' trực tiếp. Ít chỉ thị hơn, ít tính toán cần thiết để đặt nhiều vars hơn. Ngoài ra còn có những thứ khác (như fastcgi_param DOCUMENT_ROOT) sẽ không được đặt chính xác trong câu trả lời hiện được chấp nhận. Phương pháp này sẽ xử lý tất cả những gì tuy nhiên:

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

nếu '/ phpmyadmin' là một phần của URI (' http: // host: port/phpmyadmin/... '), gốc nên được đặt thành'/var/www/nginx-default/', trừ khi phpmyadmin được cài đặt vào '/ var/www/nginx-default/phpMyAdmin/phpmyadmin'. – Sithsu

+0

Câu trả lời này đã giúp tôi rất nhiều, cảm ơn rất nhiều) Tôi nên đề cập rằng cần có ';' ở cuối dòng này: root/var/www/nginx-default/phpMyAdmin –

2

tôi vật lộn với điều này trong nhiều giờ ngay bây giờ và không ai trong số các giải pháp nêu trên làm việc cho trường hợp của tôi (kể từ khi tôi cần thiết để chạy index.php, index.php với các đối số, và các tập lệnh php khác ngoài index.php), nhưng cuối cùng đã đạt được các cấu hình hoạt động như sau:

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; 
    } 
Các vấn đề liên quan