uWSGI小记

工作中使用uWSGI很久了,一直没有机会去了解它到底是如何工作的,借着最近维护独立Django工程的机会,来简单写下uWSGI相关的知识。

用过Django的都知道,启动django web server的方法是

$ python manage.py runserver

这种方法作为一种测试和简单演示的demo尚可,但如果上到生产环境的时候就显得有些单薄了,比如,为了增加吞吐量要启动多个django服务的时候怎么办,有某个http request处理很长时间导致整个进程block如何处理等,这就需要有个hosting server来对Django框架进行管理。

uWSGI就是这样的application server container。单看名字会以为uWSGI和WSGI有什么关系,其实uWSGI不仅支持Django,Flask等python系的web框架,对于Ruby,Perl的web框架也是支持的。做为一个通用web server,取名中包含WSGI是为了向python的WSGI标准致敬,也是因为WSGI插件是uWSGI的第一个插件。

uWSGI可作为http服务器启动,与Django工程采用如下方式交互

uwsgi --socket 127.0.0.1:3031 --chdir /home/foobar/myproject/ --wsgi-file myproject/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191

其中processes参数指定了进程的启动数量;socket选项用于有前置服务器如Nginx的情况,最新版本的Nginx已经支持了uwsgi协议,通过如下配置可将请求转发到uWSGI服务器。如果没有Niginx,可以直接使用参数http

location / {
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:3031;
}

uWSGI支持通过xml或ini文件来制定配置参数,像上面的命令行可用如下配置文件file.ini来表示,启动命令也相应变成

[uwsgi]
socket = 127.0.0.1:3031
chdir = /home/foobar/myproject/
wsgi-file = myproject/wsgi.py
processes = 4
threads = 2
stats = 127.0.0.1:9191

最后说一下haraki, 该配置用于指定当一个http请求多久时间没有响应后会被kill掉。如在xml中配置<harakiri>5</harakiri>则以为着5s内程序处理不完请求将会被杀掉。