2012-09-10 29 views
5

Tôi có một ứng dụng django-admin duy nhất có tên là myapp mà tôi muốn triển khai nhiều phiên bản trên các hộp vật lý khác nhau, một cho mỗi khách hàng. Tuy nhiên, tôi muốn tất cả chúng được truy cập từ một miền tương tự, mydomain.com/customer1/myapp.nhiều ứng dụng django với nginx proxy_pass và viết lại

Tôi đã bỏ qua các cài đặt proxy cụ thể và thử nhiều thứ được đề xuất trên SO, nhưng không có trường hợp nào phù hợp với trường hợp sử dụng của tôi ... và vì tôi biết rất ít về cả hai nginxdjango Tôi đang thua lỗ!

nginx.conf hiện tại của tôi là:

server { 
    listen 80; 
    server_name myserver.com 

    location ^~ /static { 
     alias /path/to/static/files/; 
    } 
# location/{ 
#  proxy_pass http://127.0.0.1:8001; 
# } 
    location ^~ /customer1/myapp/static { 
     alias /path/to/static/files/; 
    } 
    location /customer1/myapp { 
     rewrite ^/customer1/myapp/(/?)(.*) /$2 break; 
     proxy_pass http://127.0.0.1:8001; 
    } 
} 

tôi có thể nhận được màn hình đăng nhập như mong đợi qua myserver.com/customer1/myapp/admin. Tuy nhiên khi tôi cố gắng đăng nhập, nginx viết lại url của tôi tới myserver.com/admin không phải là url hợp lệ. Làm cách nào để giữ nginx thực sự viết lại url và chỉ thay đổi url được chuyển đến 127.0.0.1:8001?

FWIW, tôi đang sử dụng gunicorn để phục vụ với gunicorn -b 127.0.0.1:8001 -n myapp. Nếu tôi bỏ ghi chú vị trí / và xóa hai khối vị trí cuối cùng, ứng dụng sẽ hoạt động tuyệt vời.

Tôi sắp đặt cách tiếp cận này nếu có các giải pháp thay thế. Mục tiêu là để tránh sửa đổi mã django cho mỗi triển khai và thay vào đó chỉ cần thêm mã tối thiểu vào nginx.conf để triển khai mới.

+0

Câu hỏi về việc triển khai có thể phù hợp hơn cho serverfault.com –

+0

Tôi không hiểu, bạn chỉ đang cố gắng tạo url django ngược lại để tạo/customerX/myapp/admin/thay vì/admin /? – jpic

+0

@jpic Không, tôi muốn django chỉ nhìn thấy url gốc. ví dụ. '127.0.0.1: 8001/admin'. Tôi cho rằng tôi có thể làm điều này với nginx, nhưng tôi không chắc chắn như thế nào. Và lưu ý về 'serverfault.com', tôi sẽ đăng ở đó nếu tôi không tìm ra bất cứ điều gì ở đây, cảm ơn. – Justin

Trả lời

16

về cơ bản, bạn chỉ định url như một phần của chỉ thị proxy_pass, chỉ thị vị trí sau nên làm điều đó:

location ~ ^/customer1/myapp(/?)(.*) { 
    proxy_pass http://127.0.0.1:8001/$2; 
} 

thấy http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass cho lời giải thích chi tiết về cách nginx vượt qua uri

+1

Cảm ơn bạn vì điều này, tôi đã không nhận ra tôi có thể sử dụng các nhóm trong biểu thức sau đây. Tuy nhiên, điều này viết lại url của tôi trong trình duyệt để 'http: //127.0.0.1: 8001/$ 2' Tôi muốn nó ở lại như cũ. Nó cũng không chơi tốt với màn hình đăng nhập django-admin. – Justin

+1

Điều này hoạt động tốt cho hầu hết các ứng dụng và tôi chấp nhận, nhưng giải pháp tốt nhất tôi tìm thấy là sử dụng tên miền phụ 'customer.myserver.com' thay vì bao gồm khách hàng trong phần chính của url. – Justin

+1

Câu trả lời này là THỰC HÀNH BAD; vui lòng xem http://serverfault.com/a/728792/110020 để được giải thích về các vấn đề. – cnst

3

Bạn nên sử dụng như sau:

location /customer1/myapp { 
    return 302 $uri/; 
} 
location /customer1/myapp/ { 
    proxy_pass http://127.0.0.1:8001/ 
} 

Lưu ý rằng điều này vượt trội hơn khi sử dụng các biến trong phạm vi proxy_pass, bởi vì nếu bạn sử dụng biến, sau đó proxy_redirect không còn có giá trị mặc định default và sẽ là off thay thế, sau đó chuyển nội bộ 302 chuyển hướng trong ứng dụng của bạn sẽ không được ánh xạ tới /customer1/myapp/ sau khi được tìm nạp bởi nginx, điều này có thể khiến bạn gặp khó khăn và nhiều 404.

Và, có, sử dụng tên miền riêng cho khách hàng cá nhân là một ý tưởng tốt hơn, vì nó an toàn hơn (ví dụ như xử lý cookie chẳng hạn).

Các vấn đề liên quan