默认情况下,我们可以在同一个进程中使用不同的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模块名字和可调用的应用。
动态添加应用程序正式的支持cherokee、nginx和cgi_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 设置python的 home目录/虚拟目录 -H|--virtualenv 设置python的 home目录/虚拟目录 -H|--venv 设置python的 home目录/虚拟目录 -H|--pyhome 设置python的 home目录/虚拟目录 |
VirtualEnv是基于Py_SetPythonHome() C函数的使用。只有在Py_Initialize()之前调用这个函数才会有效,因此,动态添加应用使用该函数时是不可能的。所以,允许动态添加应用定义VirtualEnv是唯一的解决方法。首先,必须告诉python引擎不载入site模块。这个模块(在python初始化时自动载入)将会添加在sys.path,即所以所以站点包的目录。
要模拟VirtualEnv,我们就不得不仅subinterpreter初始化之后在载入site模块。
跳过第一个import site,我们可以简单的在动态应用载入上设置sys.prefix和sys.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; } |
静态添加应用
我们可以使用uwsgi的entrypoint模块来定义虚拟主机:
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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/27043155/viewspace-732189/