2013-10-21 64 views
0

我試圖用nginx和uwsgi設置django應用程序。設置是這樣的,有一個代碼庫,但我運行不同的實例,每個實例指向不同的數據庫。目前,我爲每個應用程序定義了一個uwsgi進程,但對我來說,這看起來很浪費,因爲很多內存都被相同的代碼佔用,而只有db連接字符串不同。nginx uwsgi設置不同設置的應用程序

我希望有一個設置,我只創建一個uwsgi進程,但傳遞一個字符串到uwsgi容器中,django可以使用這個容器來確定數據庫字符串並從中取出它。

起初我試過有在設置文件中的條件,如本:

settings.py

import uwsgi 
db_name = uwsgi.end['db_name'] 

我然後通過數據庫名稱爲uwsgi實例。然而,只有第一個應用程序的數據被使用。例如,如果我重新啓動uwsgi服務器並首先訪問example1,然後example2,example1的數據庫用於這兩個請求。如果我再次重新啓動uwsgi並首先訪問example2,那麼即使我之後訪問example1,也會調用該數據庫。

然後我改變了機智,並嘗試設置動態應用程序。我將代碼庫複製到兩個不同的位置,只有設置文件不同。然而,同樣的事情發生在上面。

正是我試圖做可能嗎?有沒有辦法讓設置(重新)加載每個請求?

更新

經過一番努力,我還沒有得到它的權利。我按照給出的建議,但沒有運氣。這裏的萬畝當前設置

uwsgi.ini

[uwsgi] 
master = true 
single-interpreter = true 
processes = 1 
threads = 0 
socket = /var/run/uwsgi/lms_gui.sock 
logto = /tmp/lms_gui.log 
uid = nginx 
reload-os-env = true 

virtualenv = /var/www/myenv 
plugins = python27 
chdir = /var/www/squire/sites/lms/gui 

nginx

server { 
listen 162.13.123.195; 
server_name example1; 

location/{ 
    uwsgi_pass unix:///var/run/uwsgi/lms_gui.sock; 
    uwsgi_param site_name example1; 
    uwsgi_param UWSGI_MODULE example1_wsgi; 
    uwsgi_param UWSGI_SETENV DJANGO_SETTINGS_MODULE=example1_settings; 
    include uwsgi_params; 
} 
} 
server { 
listen 162.13.123.195; 
server_name example2; 

location/{ 
    uwsgi_pass unix:///var/run/uwsgi/lms_gui.sock; 
    uwsgi_param site_name example2; 
    uwsgi_param UWSGI_MODULE example2_wsgi; 
    uwsgi_param UWSGI_SETENV DJANGO_SETTINGS_MODULE=example2_settings; 
    include uwsgi_params; 
} 
} 

由於最初的設置只加載設置第一個請求文件,但從來沒有一次。我也改變了wsgi.py入口點的名稱,但沒有運氣。

回答

1

儘管可能有這樣的設置(幾年前它在uWSGI下很常見),但它會在各地引起(不久或稍後)頭痛。

最好(或更好:理智)方法開始一個進程爲每個uWSGI實例,並讓它擴展到更多的工人在需要時:

--processes 8 --cheaper 1 --idle 60

將只有一名工作人員開始每個實例,並且最終(根據需要)最多會提高到8.除此之外,當實例閒置超過60秒時,它將被擱置(只有主人正在運行),直到另一個請求被髮布。

你還可以做其他的微調,但一般的規則是django下的多個解釋器(它的工作方式)並不是一條簡單的路徑。

+0

問題是我必須爲每個站點運行1個工作者。假設我有10個站點(相同的代碼庫,但是因爲dbs被隔離了10個不同的dbs),我有10個進程具有相同的內存佔用量。我希望能夠減少內存佔用並節省服務器資源 – Gevious

+0

使用多個python解釋器,每個應用只能獲得幾個megs。並且可以在linux下使用KSM來減少/共享內存(也就是uwsgi-only內存)。順便說一句,如果你想嘗試在這裏檢查:http://projects.unbit.it/uwsgi/wiki/TipsAndTricks有一個使用--reload-os-env和UWSGI_SETENV var的例子(這是django的技巧) – roberto

+0

感謝您的幫助和提示。我仍然沒有把握。這些設置仍然不會加載每個請求。我已經發布了一些代碼。如果你能最後一次看,我會很感激。在此之後,我會打電話給它一天,並且每個應用程序運行一個uwsgi實例 – Gevious