2016-03-04 119 views
8

我已經通過以前的一些線程去服務Django的一個子目錄: 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的通過uWSGI

的基本教訓是,你應該只需要配置您的網站(可用)來實現這個。現在我已經試過

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

一切的各種排列運行完美,當我定義的位置是「/」(並刪除SCRIPT_NAME,modifier1,PATH_INFO和根本無所謂。但是試圖用一個子目錄總是導致找不到網頁(404):?

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

(編輯),它增加了目錄的要求什麼我不搞清楚

(試過forced_script_name - should't必須使用這個並給出其他頭痛類型 - 和uwsgi配置設置)

編輯:

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

不工作...套接字是存在的,當我配置/工程 - 我看不出我錯過了什麼。

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

這將加載了網站,但所有的鏈接指向http://example.com/link/to/something而不是http://example.com/project/link/to/something

+0

django 1.9.2,uwsgi 2.07-debian (在ubuntu 15.10服務器上運行) – Bjorn

回答

0

最終放棄了試圖做到「整齊」。

最終的解決方案只是讓一個設置變量,我前綴static_url和項目urls.py文件。沒有SCRIPT_NAME或任何複雜的nginx端。

0

首先,去除uwsgi_modifier1 30;。 Django將自行處理SCRIPT_NAME,並且不需要由uWSGI重寫PATH_INFO。如果沒有被uWSGI從標題中刪除,則它可能會有害。

其次,從nginx的配置中刪除uwsgi_param PATH_INFO "$1";PATH_INFO在uwsgi_params文件中已定義的,它應該是$document_uri(因爲它是在uwsgi_params),不$1如果你傳遞SCRIPT_NAME到Django的。

即調整後,Django的應該把SCRIPT_NAME作爲URL前綴,將調整URL調度和URL扭轉了這一點。

+1

最終結果爲: location/project/{ root/path/to/project; include/etc/nginx/uwsgi_params; uwsgi_param SCRIPT_NAME/project; uwsgi_pass unix:/tmp/project.sock; } (重新啓動nginx和uwsgi後) - 相同的結果=請求URL http://www.example.com/project/project 這是當我試圖瀏覽http://www.example.com/project – Bjorn

+0

爲什麼它添加一個目錄到那裏請求? – Bjorn

0

如果應用程序是如此簡單,那麼我寧願沒有任何更多的這種簡單的解決方案簡單的「/前綴」可以被添加到一個線urls.py

否則「/前綴」必須在Django管理附加在爲您的網站備案domain網站表。 domain應再「example.com/project」與第二方案,因爲Django的必須知道域和前綴,特別是對正確的重定向。自然,前綴也必須從網絡服務器的請求URL中去除,就像你現在在nginx設置中一樣。

我通常這種部署的驗證拆分到兩個問題:

  • 會報告的Web服務器(nginx的)預期或長或短的網址Django的?
  • 是否知道Django的完整基準網址,並在所有網頁中一致地使用它?

我同時使用nginx日誌和Django日誌記錄來查看其中哪些最終被錯誤配置。 (您沒有寫出足夠的重要信息。)

應該測試的一個重要情況是:即使您在註銷後嘗試使用這些URL,也需要驗證是否需要進行身份驗證的網頁正確地重定向到登錄頁面。

更多詳細資料可在similar question找到。

+0

現在的問題是如何指向不同的靜態目錄(在op中提到的更新之後) – Bjorn

+0

您的問題是網頁包含對靜態文件的無效引用或者nginx找不到正確的靜態url?如果項目位於「/」,我希望你能正確提供靜態文件。如果項目的動態頁面位於「/ project」中,則靜態文件不會更改。我知道你要求提供「/ project」前綴,因爲你需要在同一個域上有更多的項目。沒有明確表示您接受傳統的「/ static/appname /」,例如「/靜態/管理」沒有「/項目」在任何地方的網址。我認爲是因爲你還沒有指定任何東西。 – hynekcer

+0

我得到它的工作,以便我找到靜態文件就好,/項目/正確響應 - 但由於某種原因項目/應用程序不給我任何東西,nginx將控制權傳遞給一些默認項目/app/index.html處理程序 - 不是我的django應用程序:/ – Bjorn

3

nginx uwsgi_modifier1已在uWSGI中棄用。

您的目標是能夠從任何地方託管一個wsgi應用程序,而不需要調整應用程序以考慮它的服務位置。

在uWSGI這樣做的當前方法是像這樣的地圖爲每個URI的應用程序組合掛載點:

[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可以採取的module

的地方有關的Django具體,

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

最後!經過多次搜索,我發現你的解決方案合適。謝謝! – clapas

+1

很高興有幫助。讓uWSGI正確運行是我做過的最困難的事情之一;-) – shanemgrey