我試圖用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個工作者。假設我有10個站點(相同的代碼庫,但是因爲dbs被隔離了10個不同的dbs),我有10個進程具有相同的內存佔用量。我希望能夠減少內存佔用並節省服務器資源 – Gevious
使用多個python解釋器,每個應用只能獲得幾個megs。並且可以在linux下使用KSM來減少/共享內存(也就是uwsgi-only內存)。順便說一句,如果你想嘗試在這裏檢查:http://projects.unbit.it/uwsgi/wiki/TipsAndTricks有一個使用--reload-os-env和UWSGI_SETENV var的例子(這是django的技巧) – roberto
感謝您的幫助和提示。我仍然沒有把握。這些設置仍然不會加載每個請求。我已經發布了一些代碼。如果你能最後一次看,我會很感激。在此之後,我會打電話給它一天,並且每個應用程序運行一個uwsgi實例 – Gevious