PythonTip >> 博文 >> Django

django开发环境部署(四)——uwsgi,nginx

zihua 2014-05-14 18:05:36 点击: 2189 | 收藏


django开发环境部署四(四)

  1. python自带的轻量级的web服务器只能是用来本地测试,到了生产环境必须使用更为强大的web服务器,这里我使用的是nginx,那么python应用要和nginx进行交互就必须利用一个桥梁和nginx通信,这里截取51CTO开发频道python应用部署部分内容,python的应用部署比php略显麻烦,

  2. 常见的部署方法有:
    fcgi:用spawn-fcgi或者框架自带的工具对各个project分别生成监听进程,然后和http服务通信
    wsgi:利用http服务的mod_wsgi模块来跑各个project。

  3. 无论哪种都很麻烦,apache的mod_wsgi配置起来很麻烦,内存占用还大,如果要加上nginx作为静态页面的服务器那就更麻烦了;我的应用基本上到后来都是是各个project各自为战,且不说管理上的混乱,这样对负载也是不利的,空闲的project和繁忙的project同样需要占用内存。

uwsgi

  1. uWSGI,既不用wsgi协议也不用fcgi协议,而是自创了一个uwsgi的协议,据说该协议大约是fcgi协议的10倍那么快,有个比较见下图:

  2. uWSGI的主要特点如下:

    • 超快的性能
    • 低内存占用(实测为apache2的mod_wsgi的一半左右)
    • 多app管理
    • 详尽的日志功能(可以用来分析app性能和瓶颈)
    • 高度可定制(内存大小限制,服务一定次数后重启等)

部署环境中nginx作为前端响应web请求和处理静态请求,其余非静态请求通过uwsgi传递给django。安装参考了Django中国社区的这篇文章

uwsgi+nginx+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

step1:安装uwsgi,测试uwsgi

#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成功

step2:配置django连接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实现通信,作为桥梁,就可以实现我们的目的了

step3:uwsgi的一些参数和调优建议

详细介绍请查看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



step4:配置uwsgi连接nginx

安装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运行的页面了

step5:uwsgi的启动关闭脚本

这部分是可选的,但是一旦投入线上使用,每次都使用命令行很显然是不切实际的,所以编写成类似于独立启动的服务脚本,方便启动和关闭uwsgi

原文链接:http://my.oschina.net/songmingming/blog/264410

作者:zihua | 分类: Django | 标签: django | 阅读: 2189 | 发布于: 2014-05-14 18时 |
上一篇:seo和python
下一篇: php通过xmlrpc和python通信