2011-11-15 32 views
18

Tôi có một ứng dụng django chạy trên http://localhost:12345. Tôi muốn người dùng truy cập thông qua url http://my.server.com/myapp. tôi sử dụng nginx để đảo ngược proxy để nó như sau:làm thế nào để triển khai django dưới một suburl đằng sau nginx

... ... 
server_name my.server.com; 
location /myapp { 
    rewrite /myapp(.*) $1 break;   
    ... ... # proxy param 
    proxy_pass http://localhost:12345; 
} 
... ... 

Câu hỏi đặt ra là, khi cấu hình như trên, làm thế nào để làm cho các url trong các trang phản ứng của tôi để có một tiền tố của "/ myapp" để nginx có thể hướng chúng một cách chính xác đến myapp. Ví dụ: các url trong một trang như "/ foo/far" phải được thay đổi thành "/ myapp/foo/bar" để cho phép nginx proxy sử dụng myapp. cấu hình nginx phù hợp để sử dụng để đạt được điều này là gì?

Tôi có thể sử dụng biến cài đặt của django để chỉ định tiền tố url gốc, nhưng nó không linh hoạt trong tâm trí của tôi, vì biến phải được sửa đổi theo cấu hình nginx khác nhau (nói một ngày nginx có thể thay đổi suburl từ "/ myapp "to"/anotherapp ").

Trả lời

11

Khi tiền tố được đặt trong Nginx, máy chủ web lưu trữ ứng dụng Django không có cách nào để biết tiền tố URL. Như orzel đã nói, nếu bạn sử dụng apache + mod_wsgi thậm chí nginx + gunicorn/uwsgi (với một số cấu hình bổ sung), bạn có thể sử dụng giá trị WSGIScriptAlias, được đọc tự động bởi Django.

Khi tôi cần phải sử dụng một tiền tố URL, tôi thường đặt nó bản thân mình trong urls.py gốc của tôi, nơi tôi chỉ có một dòng, bắt đầu bằng tiền tố và bao gồm một urls.py khác

(r'^/myapp/', include('myapp.urls')), 

Nhưng tôi đoán điều này có nút cổ chai giống như thiết lập một tiền tố trong settings.py, bạn có cấu hình dự phòng trong nginx và Django.

Bạn cần phải làm điều gì đó trong máy chủ lưu trữ ứng dụng Django của bạn tại: 12345. Bạn có thể đặt tiền tố ở đó và chuyển nó tới Django bằng WSGIScriptAlias ​​hoặc tương đương với mod_wsgi bên ngoài của nó. Tôi không thể cung cấp thêm thông tin vì tôi không biết ứng dụng Django của bạn đang chạy như thế nào. Ngoài ra, có lẽ bạn nên xem xét việc chạy ứng dụng Django của bạn trực tiếp từ Django, sử dụng uWSGI hoặc gunicorn.

Để vượt qua các tiền tố để Django từ máy chủ web, bạn có thể sử dụng này:

proxy_set_header SCRIPT_NAME /myapp; 

Thông tin thêm here

+1

Cảm ơn, Nghe có vẻ như tôi phải đi với mẹo WSGIScriptAlias ​​ –

+2

Cảm ơn GOODNESS cho bài đăng này. Mẹo "proxy_set_header" đã cứu tôi khỏi cơn ác mộng của Google khi tìm kiếm. Tôi nên biết rõ hơn. Gracias. –

2

Đây là một phần cấu hình của tôi cho nginx mà không được đặt là FORCE_SCRIPT_NAME, nhưng sau đó, tôi không sử dụng thư mục phụ. Có lẽ nó sẽ hữu ích cho việc thiết lập các tùy chọn liên quan đến USE_X_FORWARDED_HOST trong nginx thay vì Django.

upstream app_server_djangoapp { 
    server localhost:8001 fail_timeout=0; 
} 

server { 
    listen xxx.xxx.xx.xx:80; 
    server_name mydomain.com www.mydomain.com; 
    if ($host = mydomain.com) { 
     rewrite ^/(.*)$ http://www.mydomain.com/$1 permanent; 
    } 
    ... 
    location/{ 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_redirect off; 

     if (!-f $request_filename) { 
      proxy_pass http://app_server_djangoapp; 
      break; 
     } 
    } 
    ... 
} 
Các vấn đề liên quan