2015-12-05 155 views
0


我正在考慮製作一個將動態添加新django網站和靜態網站的django應用程序。
我可以做所有的步驟,但問題是,如果我有很多用戶正在嘗試添加網站,如果每次添加一個網站,我必須服務uwsgi開始/停止和服務nginx重新啓動..網站當用戶嘗試訪問它時會遇到問題。
有沒有解決方案,我如何更新重新啓動服務的變化?
任何幫助或建議將被認爲是優先的。 謝謝!更新uwsgi和nginx更改無需重新啓動服務

回答

0

首先,我們從uWSGI開始。

如果您嘗試在一臺uWSGI服務器上啓動所有應用程序,則表明您的操作有誤。每個django應用程序應該需要單獨的uWSGI服務器...

...並且有內置於uWSGI的解決方案:emperor and vassals。只需將emperor配置爲主要的uWSGI服務,並將其配置爲可以動態啓動和停止vassals而無需重新啓動自身。這樣,如果有人會改變django應用程序的配置,只有一個vassal將被啓動/停止或重新加載(必須發生的事情,你無法避免)。

現在,讓我們配置nginx的

對於nginx的是不幸的是很難達到的。首先,您不必重新啓動nginx,您可以使用服務nginx重新加載,優雅地重新加載它的配置。但是如果你對此不滿意,還有另一種解決方案。

對於這個解決方案的工作,所有的django項目都必須具有完全相同的nginx配置(如果你想在它們之間創建一些差異,檢查它是否可以在uWSGI中實現,使用巧妙的nginx配置,你將能夠使用任何uWSGI功能)。如果這個要求能夠得到滿足,只要做到這一點:

  1. 捕捉一切可能的Django的網站(他們每個人必須爲不同的域)創建配置文件,它可以是這樣的:

    server { 
        server_name ~^(www\.)?(?<domain>.+)$; 
        # server_name can contain any regular expression. Just remember that it should start with `~` and contain `^` and `$` 
        # as you can see, we can use named capture group as an variable later 
        # you can add any named capture group for later use 
    
        root /sites/$domain/public; 
    
        location @default { 
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
         proxy_set_header Host $http_host; 
         proxy_redirect off; 
         include /etc/nginx/uwsgi_params; 
    
         uwsgi_pass unix:/run/uwsgi/${domain}.sock; 
         break; 
        } 
    
        location /static/ { 
         try_files $uri @default; 
        } 
    
        location /media/ { 
         try_files $uri @default; 
        } 
    
        location ~* ^/(android-(?:chrome|icon)[-0-9x]*\.png|ms(?:tile|-icon)[-0-9x]*\.png|browserconfig.xml|apple-(?:touch-)?icon[-0-9x]*\.png|favicon[-0-9x]*.png|favicon\.ico|manifest.json|apple-touch-icon-precomposed\.png)$ { 
         try_files $uri /static/favicon$uri @default; 
        } 
    
        error_page 500 502 503 504 /500.html; 
        location = /500.html { 
         try_files /500.html /error.html /error500.html; 
        } 
    
        location/{ 
         try_files /maintenance.html @default; 
        } 
    } 
    
  2. 將每個項目存儲在打補丁的目錄中將以某種方式匹配域名。如果要將每個項目存儲在其所屬的用戶目錄中,則該目錄名稱必須包含在URL中。

    換句話說,您必須能夠通過其域來構建投影目錄。

    您可以通過創建一些全局目錄來破解該限制,該目錄將包含符合鏈接到實際項目目錄。

    注意!!可能存在安全漏洞!如果有人將創建目錄,哪條路徑將與主機名相匹配,nginx將在該主機名上提供該目錄。即使域名不會指向您的服務器,也可以有人訪問它。因此,您應該更好地使用全局目錄的方法,將符號鏈接應用於實際項目。

  3. 確保套接字到uWSGI服務器也可以從域名創建。你也可以在這裏使用符號鏈接。

相關問題