2016-03-04 19 views
8

Tôi đã trải qua một số chủ đề theo thời gian: How do I set subdirectory in nginx with Django how to deploy django under a suburl behind nginx Serving flask app on subdirectory nginx + uwsginginx phục vụ Django trong thư mục con qua uWSGI

Bài học cơ bản là bạn chỉ nên cần phải cấu hình trang web (s-có sẵn) của bạn để đạt được điều này. Bây giờ tôi đã cố gắng hoán vị khác nhau của

server { 
listen 80; 
server_name www.example.com; 

location = /favicon.ico { access_log off; log_not_found off; } 
location /static/ { 
    root /path/to/project; 
} 

location /project/ { 
    root   /path/to/project; 
    include   /etc/nginx/uwsgi_params; 
    uwsgi_param  SCRIPT_NAME /project; 
    uwsgi_modifier1 30; 
    uwsgi_param PATH_INFO "$1"; 
    uwsgi_pass  unix:/tmp/project.sock; 
}} 

Tất cả mọi thứ chạy một cách hoàn hảo khi tôi xác định vị trí là "/" (và loại bỏ SCRIPT_NAME, modifier1, PATH_INFO và rễ không quan trọng. Nhưng cố gắng sử dụng một thư mục con luôn dẫn đến trang không tìm thấy (404):.?

Request URL: http://www.example.com/project/project 

(chỉnh sửa) nó thêm một thư mục để yêu cầu gì tôi không tìm ra

(thử forced_script_name - should't phải sử dụng này và cung cấp khác các loại nhức đầu - và cài đặt cấu hình uwsgi)

EDIT:

location /project/ { 
    root   /path/to/project; 
    include   /etc/nginx/uwsgi_params; 
    uwsgi_param  SCRIPT_NAME /project; 
    uwsgi_pass  unix:/tmp/project.sock; 
} 

Không làm việc ... Các ổ cắm là có và các công trình khi tôi cấu hình cho/- Tôi chỉ không thể nhìn thấy những gì tôi đang mất tích.

UPDATE:

location ~ /project(?<path_info>/.*|$) { 
    include   /etc/nginx/uwsgi_params; 
    uwsgi_pass  unix:/tmp/project.sock; 
    uwsgi_param  PATH_INFO $path_info; 
    uwsgi_param  SCRIPT_NAME /project; 
} 

này tải lên trang web nhưng tất cả các liên kết trỏ đến http://example.com/link/to/something thay vì http://example.com/project/link/to/something

+0

django 1.9.2, uwsgi 2.07-debian (chạy trên máy chủ ubuntu 15.10) – Bjorn

Trả lời

0

Cuối cùng đã từ bỏ việc cố gắng thực hiện điều này "gọn gàng".

Giải pháp cuối cùng chỉ là tạo biến cài đặt mà tôi đã thêm tiền tố vào tệp urls.py của static_url và dự án. Không có SCRIPT_NAME hoặc bất kỳ điều gì phức tạp ở phía nginx.

0

Trước hết, loại bỏ uwsgi_modifier1 30;. Django sẽ tự xử lý SCRIPT_NAME và không cần phải có số PATH_INFO được viết lại bởi uWSGI. Nó có thể gây hại nếu SCRIPT_NAME không bị xóa khỏi tiêu đề bởi uWSGI.

Thứ hai, xóa uwsgi_param PATH_INFO "$1"; khỏi cấu hình nginx. PATH_INFO đã được xác định trong tệp uwsgi_params và phải là $document_uri (vì nó nằm trong uwsgi_params), không phải là $1 nếu bạn đang chuyển SCRIPT_NAME sang django.

Sau chỉnh sửa đó, django sẽ coi tiền tố là SCRIPT_NAME làm điều chỉnh url và điều chỉnh url cho điều đó.

+1

Kết quả cuối cùng là: vị trí/dự án/{ root/path/to/project; bao gồm/etc/nginx/uwsgi_params; uwsgi_param SCRIPT_NAME/dự án; uwsgi_pass unix: /tmp/project.sock; } (sau khi khởi động lại nginx và uwsgi) - cùng một kết quả = URL yêu cầu http://www.example.com/project/project Điều này khi tôi đang cố duyệt qua http://www.example.com/project – Bjorn

+0

Tại sao nó _adding_ một thư mục có yêu cầu? – Bjorn

0

Nếu ứng dụng đơn giản đến mức "/ tiền tố" đơn giản có thể được thêm vào một dòng trong urls.py thì tôi thích giải pháp đơn giản này mà không cần thêm bất kỳ thứ gì.

Nếu không "/ tiền tố" phải nối đến domain cột trong hồ sơ cho trang web của bạn trong Sites bảng trong Django admin. Tên miền nên sau đó "example.com/project" với giải pháp thứ hai, bởi vì Django phải biết tên miền và tiền tố, đặc biệt là cho chuyển hướng chính xác. Đương nhiên tiền tố cũng phải được rút ra từ URL của yêu cầu của máy chủ web, như bạn làm điều đó ngay bây giờ trong cài đặt nginx.

Tôi thường chia việc xác minh triển khai như vậy để hai câu hỏi:

  • Liệu báo cáo web server (nginx) dự kiến ​​URL ngắn hơn hoặc lâu hơn để Django?
  • Không biết Django URL cơ sở đầy đủ của nó và có sử dụng nó trong tất cả các trang web một cách nhất quán không?

Tôi sử dụng cả nhật ký nginx và ghi nhật ký Django được bật để xem kết quả nào trong số đó cuối cùng bị miscofigured. (Bạn không viết đủ thông tin quan trọng.)

Trường hợp quan trọng cần được kiểm tra là: Xác minh rằng các trang web yêu cầu được xác thực được chuyển hướng đến trang đăng nhập một cách chính xác, ngay cả khi bạn thử các URL này sau khi đăng xuất.

Chi tiết khác có thể được tìm thấy trong similar question.

+0

vấn đề là bây giờ làm thế nào để trỏ đến các thư mục tĩnh khác nhau (sau khi cập nhật được đề cập trong op) – Bjorn

+0

Vấn đề của bạn là trang web chứa tham chiếu không hợp lệ đối với tệp tĩnh hoặc url tĩnh phải không được tìm thấy bởi nginx? Tôi hy vọng rằng bạn có thể cung cấp các tệp tĩnh một cách chính xác nếu dự án sẽ nằm trong "/". Không có gì thay đổi với các tệp tĩnh nếu các trang động của dự án nằm trong "/ project". Tôi hiểu rằng bạn đã yêu cầu tiền tố "/ project" vì bạn cần thêm nhiều dự án trên cùng một miền. Nó không được thể hiện rõ ràng rằng bạn chấp nhận "/ static/appname /" cổ điển, ví dụ: "/ static/admin" không có "/ project" ở bất kỳ đâu trong url.Tôi nghĩ vậy bởi vì bạn chưa chỉ định bất cứ điều gì. – hynekcer

+0

Tôi đã làm việc đó để tôi tìm các tệp tĩnh tốt và/project/đang phản hồi chính xác - nhưng vì một số lý do dự án/ứng dụng không mang lại cho tôi bất cứ điều gì, nginx đang chuyển quyền kiểm soát đến một số dự án mặc định /app/index.html handler - không phải ứng dụng django của tôi:/ – Bjorn

3

Nginx uwsgi_modifier1 không được dùng nữa trong uWSGI.

Mục tiêu của bạn là có thể lưu trữ ứng dụng wsgi từ bất cứ nơi nào mà không cần ứng dụng cần được điều chỉnh để tính đến nơi nó được phân phát.

Phương pháp hiện tại để làm điều này trong uWSGI là để lập bản đồ điểm lắp cho mỗi ứng dụng kết hợp URI như vậy:

[uwsgi] 
socket = 127.0.0.1:3031 
; mount apps 
mount = /app1=app1.py 
mount = /app2=app2.py 
; rewrite SCRIPT_NAME and PATH_INFO accordingly 
manage-script-name = true 

Hosting multiple apps in the same process (aka managing SCRIPT_NAME and PATH_INFO)

mount có thể chiếm chỗ của module

Đối với Django đặc biệt ,

; Before 
module = django_app.wsgi:application 
; After 
mount = /django_app=django_app.wsgi:application 
manage-script-name = true 
+0

Cuối cùng! Sau khi tìm kiếm nhiều, tôi thấy phù hợp với giải pháp của bạn. Cảm ơn bạn! – clapas

+1

Vui mừng được trợ giúp. Bắt uWSGI chạy ngay là một trong những điều khó khăn nhất mà tôi từng làm ;-) – shanemgrey

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