http://my.oschina.net/guol/blog/121418?fromerr=TlCvCkkM
基于python的web项目,常见的部署方法有:
fcgi:用spawn-fcgi或者框架自带的工具对各个project分别生成监听进程,然后和http服务互动。
wsgi:利用http服务的mod_wsgi模块来跑各个project。
不过还有个uwsgi,它既不用wsgi协议也不用fcgi协议,而是自创了一个uwsgi的协议,据作者说该协议大约是fcgi协议的10倍那么快。uWSGI的主要特点如下:
超快的性能。
低内存占用(实测为apache2的mod_wsgi的一半左右)。
多app管理。
详尽的日志功能(可以用来分析app性能和瓶颈)。
高度可定制(内存大小限制,服务一定次数后重启等)。
环境ubuntu 12.04 IP:10.1.6.79
安装nginx
1
|
apt-get
install
nginx-full nginx-common
|
nginx配置/etc/nginx/sites-enabled/example
1
2
3
4
5
6
7
8
9
10
11
12
13
|
server {
listen 80;
server_name 10.1.6.79;
access_log
/var/log/nginx/example_access
.log;
error_log
/var/log/nginx/example_error
.log;
root
/var/www/example
;
location / {
uwsgi_pass 127.0.0.1:9001;
include uwsgi_params;
uwsgi_param UWSGI_SCHEME $scheme;
uwsgi_param SERVER_SOFTWARE nginx/$nginx_version;
}
}
|
1
|
apt-get
install
uwsgi uwsgi-plugin-python
|
如果你想安装所有的uwsgi插件,则可以安装uwsgi-plugin-all软件包
uwsgi配置/etc/uwsgi/apps-enabled/default.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<uwsgi>
<plugin>python<
/plugin
>
<socket>127.0.0.1:9001<
/socket
>
<pythonpath>
/var/www/example/app/
<
/pythonpath
>
<app mountpoint=
"/"
>
<script>wsgi_configuration_module<
/script
>
<
/app
>
<master/>
<processes>4<
/processes
>
<reload-mercy>8<
/reload-mercy
>
<cpu-affinity>1<
/cpu-affinity
>
<max-requests>2000<
/max-requests
>
<limit-as>512<
/limit-as
>
<reload-on-as>256<
/reload-on-as
>
<reload-on-rss>192<
/reload-on-rss
>
<no-orphans/>
<vacuum/>
<
/uwsgi
>
|
uwsgi配置文件中的参数也可以在命令行通过uwsgi指定,配置文件除了xml格式外,还可以写成ini格式的,软件包安装完毕后在/usr/share/doc/uwsgi/examples/conffile目录下会有一些xml和ini格式配置文件的例子。
wsgi_configuration_module.py脚本内容
1
2
3
4
5
6
7
8
9
10
11
12
|
#!/usr/bin/python
import
os
import
sys
sys.path.append(
'/var/www/example/app'
)
os.environ[
'PYTHON_EGG_CACHE'
] =
'/var/www/example/.python-egg'
def application(environ, start_response):
status =
'200 OK'
output =
'Hello World!'
response_headers = [(
'Content-type'
,
'text/plain'
),
(
'Content-Length'
, str(len(output)))]
start_response(status, response_headers)
return
[output]
|
1
|
uwsgi -x
/etc/uwsgi/apps-enabled/default
.xml --daemonize
/var/log/uwsgi/app/default
.log
|
uwsgi 的参数:
-M 开启Master进程
-p 4 开启4个进程
-s 使用的端口或者socket地址
-d 使用daemon的方式运行, 注意, 使用-d后, 需要加上log文件地址, 比如-d /var/log/uwsgi.log
-R 10000 开启10000个进程后, 自动respawn下
-t 30 设置30s的超时时间, 超时后, 自动放弃该链接
–limit-as 32 将进程的总内存量控制在32M
-x 使用配置文件模式
并发4个线程
uwsgi -s :9090 -w myapp -p 4
主控制线程+4个线程
uwsgi -s :9090 -w myapp -M -p 4
执行超过30秒的client直接放弃
uwsgi -s :9090 -w myapp -M -p 4 -t 30
限制内存空间128M
uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128
服务超过10000个req自动respawn
uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128 -R 10000
后台运行等
uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128 -R 10000 -d uwsgi.log
除了直接用uwsgi命令启动外,还可以用init.d下的脚本启动, 不过需先修 改/etc/default/u wsgi中默认配置文件的路径,然后通过/etc/init.d/uwsgi start启动
1
2
|
#INHERITED_CONFIG=/usr/share/uwsgi/conf/default.ini
INHERITED_CONFIG=
/etc/uwsgi/apps-enabled/default
.xml
|
1
|
/etc/init
.d
/nginx
start
|
python在国内用来做web还不多,虽然python也有一些web框架,不过目前来看文档缺失、本身系统的稳定都还没经过量和时间的考验,要像PHP那样大规模的火起来还需一段时间。
nginx配置参考:http://wiki.nginx.org/HttpUwsgiModule#uwsgi_param
uwsgi安装参考:http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html
uwsgi配置参考:http://uwsgi-docs.readthedocs.org/en/latest/Options.html#vacuum