uWSGI 虛擬主機模式

nginx_web發表於2012-06-07

 

預設情況下,我們可以在同一個程式中使用不同的SCRIPT_NAME變數或者是uwsgi協議描述符來執行多個應用。

 

    0.9.6版本開始,我們可以使用SERVER_NAME變數來載入多個應用了。

 

    這就是虛擬主機模式,通過在命令列中簡單的新增--vhost選項來啟用該模式(當然也可以在配置檔案或者是環境變數中新增同效的選項來實現虛擬主機模式)。例如:

 

./uwsgi -s :3031 -M -p 4 --vhost

   

動態新增的應用

 

uWSGI伺服器動態新增應用,在沒有配置檔案的情況下啟動uWSGI伺服器,可以在uwsgi中使用變數,從而載入新的應用。例如:

 

UWSGI_SCRIPT

   

    通過這個變數我們能夠傳遞一個wsgi指令碼檔名,在指令碼中定義了一個可載入的應用。

 

或者

 

UWSGI_MODULE UWSGI_CALLABLE

   

    即新增wsgi模組名字和可呼叫的應用。

 

    動態新增應用程式正式的支援cherokeenginxcgi_dynamic,並且也很容易的新增到tomcat twisted處理程式。

 

    我們可以為動態新增應用使用虛擬主機,例如:

 

server {

        listen       8080;

        server_name  localhost;

        location / {

                uwsgi_pass 192.168.173.5:3031;

                include uwsgi_params;

                uwsgi_param UWSGI_SCRIPT mymako;

                uwsgi_param UWSGI_PYHOME /Users/roberto/uwsgi/VENV1;

        }

    }

 

    server {

        listen       8080;

        server_name  mrspurr.local;

        location / {

                uwsgi_pass 192.168.173.5:3031;

                include uwsgi_params;

                uwsgi_param UWSGI_SCRIPT. mytrac;

                uwsgi_param UWSGI_PYHOME /Users/roberto/uwsgi/VENV2;

        }

 

        location /arm {

                uwsgi_pass 192.168.173.14:3031;

                include uwsgi_params;

        }

    }

 

   

 當我們想使用VirtualEnv的時候,需要為uWSGI伺服器新增--no-site選項:

   

./uwsgi -s :3031 -M -p 4 --vhost --no-site

 

為動態新增應用定義VirtualEnv

 

uWSGI使用virtualenv的快速設定:

 

第一步、建立 virtualenv:

 

$ virtualenv myenv

New python executable in myenv/bin/python

Installing setuptools...............done.

 

第二步、安裝所有所需的模組,例如pylons

 

 * ./myenv/bin/easy_install pylons

 

第三步、拷貝wsgi模組到這個新的環境(如果不想修改PYTHONPATH,那麼在lib/python2.x)

 

 

在啟動uWSGI伺服器時使用-H選項,例如:

 

$ ./uwsgi26 -H myenv -s 127.0.0.1:3031 -M -w envapp

*** Starting uWSGI on [Thu Dec 17 11:07:00 2009] ***

your process address space limit is 4294967295 bytes (4095 MB)

Setting PythonHome to myenv...

binding on TCP port: 3031

............

 

    這裡的-H表示:

 

    -H|--home                 設定pythonhome目錄/虛擬目錄

    -H|--virtualenv           設定pythonhome目錄/虛擬目錄

    -H|--venv                 設定pythonhome目錄/虛擬目錄

    -H|--pyhome               設定pythonhome目錄/虛擬目錄

   

 

VirtualEnv是基於Py_SetPythonHome() C函式的使用。只有在Py_Initialize()之前呼叫這個函式才會有效,因此,動態新增應用使用該函式時是不可能的。所以,允許動態新增應用定義VirtualEnv是唯一的解決方法。首先,必須告訴python引擎不載入site模組。這個模組(python初始化時自動載入)將會新增在sys.path,即所以所以站點包的目錄。

 

要模擬VirtualEnv,我們就不得不僅subinterpreter初始化之後在載入site模組。

 

跳過第一個import site,我們可以簡單的在動態應用載入上設定sys.prefixsys.exec_prefix並且呼叫:

 

PyImport_ImportModule("site");

   

有些使用者想不禁用初始化site模組載入,因此site模組必須被重新載入:

 

PyImport_ReloadModule(site_module);

   

   現在我們可以動態使用UWSGI_PYHOME變數簡單的設定VirtualEnv

 

location / {

       uwsgi_pass 192.168.173.5:3031;

       include uwsgi_params;

       uwsgi_param UWSGI_SCRIPT. mytrac;

       uwsgi_param UWSGI_PYHOME /Users/roberto/uwsgi/VENV2;

}

  

靜態新增應用

 

我們可以使用uwsgientrypoint模組來定義虛擬主機:

 

import uwsgi

 

def app1(env, start_response):

    ...

 

def app2(env, start_response):

    ...

 

uwsgi.applications = {'unbit.it|': app1, 'localhost|/ciao': app2}

 

   

 

 

    在新增靜態應用中,配置語法與在配置檔案中SCRIPT_NAME的配置一樣,然後不同的是必須新增域名部分,也就是將域名部分新增到詞典key中,注意上面配置中的最後一句,可以看到的是在域名部分和SCRIPT_NAME部分通過管道符“|”隔開。

 

 

   

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27043155/viewspace-732189/,如需轉載,請註明出處,否則將追究法律責任。

相關文章