http://my.oschina.net/guol/blog/121418 基于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-getinstall 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; ###uwsgi_pass 与uwsgi通信 include uwsgi_params; uwsgi_param UWSGI_SCHEME $scheme; uwsgi_param SERVER_SOFTWARE nginx/$nginx_version; } } | 安装uwsgi
1 | apt-getinstall 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> ###uwsgi_pass 与nigix通信 <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 importos importsys 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] | 启动uwsgi
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/uwsgi中默认配置文件的路径,然后通过/etc/init.d/uwsgi start启动
1 2 | #INHERITED_CONFIG=/usr/share/uwsgi/conf/default.ini INHERITED_CONFIG=/etc/uwsgi/apps-enabled/default.xml | 启动nginx
效果如下: python在国内用来做web还不多,虽然python也有一些web框架,不过目前来看文档缺失、本身系统的稳定都还没经过量和时间的考验,要像PHP那样大规模的火起来还需一段时间。 #################################################################### Nginx+uWsgi+web.py 搭建与简单测试 Nginx+uWsgi+web.py 搭建与简单测试 Nginx + uWsgi + web.py 效率真是不错。 安装uWsgi o 首先是下载 http://projects.unbit.it/downloads/uwsgi-1.9.14.tar.gz o 解压 sudo python setup.py build o 安装 make nginx和web.py的安装就不多说 nginx配置 1 location / { 1 include uwsgi_params; 1 #uwsgi_pass 127.0.0.1:9002; 1 #对应uwsgi.ini配置的socket文件 1 uwsgi_pass unix:/tmp/uwsgi.sock; 1 } 1 #静态文件访问 1 location /static/ { 1 if (-f $request_filename) { 1 rewrite ^/static/(.*)$ /static/$1 break; 1 } 1 } 基于web.py的脚本index.py 1 import web 1 1 urls = ("/.*", "hello") 1 app = web.application(urls, globals()) 1 1 class hello: 1 def GET(self): 1 return 'Hello, world!' 1 1 #if __name__ == "__main__": #注意将改行注释掉 1 application = app.wsgifunc() uWsgi的配置 1 [uwsgi] 1 #socket = 127.0.0.1:9002 1 #用socket文件方式 1 socket = /tmp/uwsgi.sock 1 chdir = /data/www/webpy/ 1 processes = 8 1 threads = 2 1 master = true 1 module = index 1 ;pidfile = /data/uwsgi-bin/uwsgi.pid 1 ;listen = 128 1 #守护进程方式运行,并指明日志文件 1 daemonize = /data/www/webpy/uwsgi.log 注意chdir指向程序目录,module是主运行文件,见上,加入pidfile后好像对性能有影响,所以这里注释掉。 运行 sudo uwsgi uwsgi.ini 测试 测试使用的是apache的ab工具。ab -n1000 -c100 http://192.168.1.1:8080/,结果如下: 拿php来测试下,同样的服务器,同样的nginx,使用的是nginx + php-fpm fastcgi的模式。 看得出比PHP还是快了不少 |