python自带的轻量级的web服务器只能是用来本地测试,到了生产环境必须使用更为强大的web服务器,这里我使用的是nginx,那么python应用要和nginx进行交互就必须利用一个桥梁和nginx通信,这里截取51CTO开发频道python应用部署部分内容,python的应用部署比php略显麻烦,
常见的部署方法有:
fcgi:用spawn-fcgi或者框架自带的工具对各个project分别生成监听进程,然后和http服务通信
wsgi:利用http服务的mod_wsgi模块来跑各个project。
无论哪种都很麻烦,apache的mod_wsgi配置起来很麻烦,内存占用还大,如果要加上nginx作为静态页面的服务器那就更麻烦了;我的应用基本上到后来都是是各个project各自为战,且不说管理上的混乱,这样对负载也是不利的,空闲的project和繁忙的project同样需要占用内存。
uWSGI,既不用wsgi协议也不用fcgi协议,而是自创了一个uwsgi的协议,据说该协议大约是fcgi协议的10倍那么快,有个比较见下图:
uWSGI的主要特点如下:
部署环境中nginx作为前端响应web请求和处理静态请求,其余非静态请求通过uwsgi传递给django。安装参考了Django中国社区的这篇文章
Distribution : CentOS 6.5 minimal
uwsgi version : 2.0.4
Web Server : Nginx 1.6
Init system : sysvinit
- 安装系统(略)
- pip、django
- 安装uwsgi、测试uwsgi
- 配置django连接uwsgi
- 配置uwsgi,nginx
- 实现nginx + uwsgi + django
#django的安装前几篇文章也有,这里再centos下安装pip也很简单,uwsgi也可以通过pip来安装
yum -y install libevent-devel python-devel
yum -y install python-pip pip install uwsgi
#测试uwsgi是否能独立启动
#本地创建一个test.py文件,内容如下
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return "Hello World"
#独立启动uwsgi,测试是否可以成功
uwsgi --http :8001 --wsgi-file test.py
\\这条命令打开了本地8001端口进行监听,http访问即可看到Hello World,表明独立启动uwsgi成功
1.新建一个django project,runserver测试正常启动即可,然后确定关闭django程序关闭
2.新建uwsgi配置文件
#!/usr/bin/env python
# coding: utf-8
import os
import sys
# 将系统的编码设置为UTF8
reload(sys)
sys.setdefaultencoding('utf8')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tryfirst.settings")
from django.core.handlers.wsgi
import WSGIHandler application = WSGIHandler()
2.#这时候利用uwsgi启动服务,访问8000端口是否能看到django应用的界面
uwsgi —http :8000 —chdir /home/src/sites/mysite —module django_wsgi
\\注意chdir路径是我本地的django项目测试地址
到了这里成功的话利用uwsgi单独启动django应用就没有问题了,下一步让uwsgi和nginx实现通信,作为桥梁,就可以实现我们的目的了
详细介绍请查看uwsgi文档:http://uwsgi-docs.readthedocs.org/en/latest/Options.html
#并发四个线程
uwsgi -s :9090 -w mysite -p 4
#主控线程+4个线程
uwsgi -s :9090 -w mysite -M -p 4
#执行超过30s的client直接放弃
uwsgi -s :9090 -w mysite -M -p 4 -t 30
#限制内存空间
uwsgi -s :9090 -w mysite -M -p 4 -t 30 --limit-as 128
#服务超过10000个request自动respawn
uwsgi -s :9090 -w mysite -M -p 4 -t 30 --limit-as 128 -R 10000
#后台运行
uwsgi -s :9090 -w mysite -M -p 4 -t 30 --limit-as 128 -R 10000 -d uwsgi.log
安装nginx,这里略,上面是通过命令行启动uwsgi,线上肯定是使用配置文件。我们让nginx和uwsgi通信使用socket来进行通讯,所以注意使用的通信端口没有被其他程序占用即可
1、新建django_socket.xml,内容如下
<uwsgi>
<socket>:8000</socket>
<chdir>/home/src/sites/mysite/</chdir>
<module>django_wsgi</module>
<processes>4</processes> <!-- 进程数 -->
<daemonize>uwsgi.log</daemonize>
</uwsgi>
2、nginx核心配置如下
location / {
uwsgi_pass 127.0.0.1:8000;
include uwsgi_params;
}
3、启动nginx,以配置文件方式启动uwsgi,检查端口和进程是否能正常
nginx -s reload
uwsgi -x /home/src/sites/mysite/django_socket.xml
\\全部正常之后就可以尝试访问nginx的域名进行访问,看是否能看到django运行的页面了