`
sls0919
  • 浏览: 122712 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用Tornado+Nginx部署Django的一种尝试(转)

阅读更多

转自:奋斗足迹|崔玉松 http://fendou.org/post/2012/06/01/tornad-nginx-django/

使用Tornado+Nginx部署Django的一种尝试

Tornado是一个异步web框架和服务器,所以在开发longpulling的chat之类应用非常的合适,但是其实本身也是一个高性能的http服务器,也可以作为一个WSGIServer。所以即使你的网站没有使用Tornado的框架,而是用了web.py或者是Django来开发(傻瓜万岁),这个时候Tornado依然可以用来加速你的网站。使用Tornado来代替fastCGI可以大幅提高性能,且可以承载的并发能力也有了成倍的提高(大家可以自己Profile,本文只介绍如果做)。

很多人诟病Django,特别是使用Python的人,的确,python社区从来不缺少框架,仅仅Python官方wiki上列出的知名Framework就数十种之多,作为一个全功能的框架,要兼容东西太多,性能损失是很难避免的,问题是损失到什么程度,我们能否针对自己应用特点去优化,而不是人云亦云的拒绝与鄙视或者自己造轮子,随着瀑布流始祖http://pinterest.com/的崛起,而这个网站恰恰是Django做的,目前这个网站每天的独立访客超过1800万人,总数据超过400T,而总雇员只有12人。这就是Python和Django的生产力。关于http://pinterest.com/使用Django的详情,可以参考这边:http://highscalability.com/blog/2012/5/21/pinterest-architecture-update-18-million-visitors-10x-growth.html

下面我们开始来介绍如何配置。这里我们假设你的一个用Django写的网站在一台Linux的服务器上快乐地着(ubuntu or CentOS,没试过在其他发行版折腾过,windows?你在说笑吧),随着网站越来越红火,你越发感觉服务器不堪重负。这个时候Tornado出现了,他可以让你再苟延残喘好几个月,节约一大把的银子去把妹.............回到正题。根据官网的推荐部署方式,我们还是采用Nginx通过upstream来反向代理到N个Tornado的服务器实例上的部署方式。so

Setp1:安装supervisord

由于Tornado并没有自身提供Daemon的能力,所以我们需要用一个服务管理工具来管理Tornado的进程,supervisord是用Python实现的一款非常实用的进程管理工具。可以很方便的管理N过进程,且支持进程分组。Supervisord可以通过sudo easy_install supervisor安装,当然也可以通过Supervisord官网下载后setup.py install安装。

Step2: 给Django的站点增加一个Tornado的服务器文件(比如serv.py)

创建一个文件Serv.py在Django站点的根目录(Django 1.4中应该放到和urls.py同一级目录),内容如下:

import os

import sys

from tornado.options import options, define, parse_command_line

import django.core.handlers.wsgi

import tornado.httpserver

import tornado.ioloop

import tornado.web

import tornado.wsgi

_HERE = os.path.dirname(os.path.abspath(file))

sys.path.append(_HERE)

sys.path.append(os.path.join(_HERE, '..'))

sys.path.append(os.path.join(_HERE, '../contrib'))

os.environ['DJANGO_SETTINGS_MODULE'] = "settings"

def main(port):

 wsgi_app = tornado.wsgi.WSGIContainer(

     django.core.handlers.wsgi.WSGIHandler())

 tornado_app = tornado.web.Application(

     [('.*', tornado.web.FallbackHandler, dict(fallback=wsgi_app)),

     ])

 server = tornado.httpserver.HTTPServer(tornado_app)

 server.listen(port)

 tornado.ioloop.IOLoop.instance().start()

if name == 'main':

 main(int(sys.argv[1]))

我这里通过第一个参数来指定Tornado服务监听的端口。这样比较灵活,这点我们在后面的步骤会用到。这个时候我们可以通过

python Serv.py 8000

这个命令来启动服务器

Step3: 配置Supervisord

第一步安装的Supervisord还没有配置,所以我们需要先创建一个配置文件的样板。在root权限下执行

echo_supervisord_conf > /etc/supervisord.conf

这个时候在/etc/创建了配置文件,用vim打开这个文件,在配置文件的屁股后面加上以下这一段

[program:web]

command=python /var/www/site/Serv.py 80%(process_num)02d

process_name=%(program_name)s_%(process_num)02d

umask=022

startsecs=0

stopwaitsecs=0

redirect_stderr=true

stdout_logfile=/tmp/codoon.log

numprocs=4

numprocs_start=1

这个配置会启动4个Tornado的服务进程分别监听 8001,8002,8003,8004 这四个端口

command这一行是要执行的命令,这里是用 python /var/www/site/Serv.py 端口号来启动Tornado的服务进程 80%(process_num)02d 的用途是通过进程编号来生成端口号。下面的process_name这个参数也会用到。这里要指定的文件名就是上一步我们创建那个Serv.py文件

process_name是进程的名字,由于这里要启动4个进程,所以要用process_num来区分

umask是程序执行的权限参数

startsecs这个参数是程序启动的等待时间

stopwaitsecs这个参数是程序停止的等待时间

redirect_stderr这个参数将错误流重定向到std的流输出,这样可以省去一个日志文件的配置,当然也可以不用这个参数分开配置日志文件

stdout_logfile 这个参数是STD流输出日志文件的路径,Tornado会输出所有的请求和错误信息,通过这个可以统一做日志处理,分隔什么的,在程序里就只需要print到std流就行了。

numprocs 这个参数指定了进程的数量,这里是4,表明要启动4个Tornado进程

numprocs_start 这个参数指定了进程号的起始编号,这里是1,这样前面的command和process_name里的%(process_num)02d部分就会在执行的时候被替换为01~05的字符串

配置修改完成后:wq保存退出,执行:

supervisorctl reload

重新加载配置后,这些进程就启动起来了

Step4:修改配置Nginx

首先找到在vhost目录里你的站点配置文件,打开后,在头上增加upstream的内容

upstream frontends {

server 127.0.0.1:8001;

server 127.0.0.1:8002;

server 127.0.0.1:8003;

server 127.0.0.1:8004;

}

然后在Server配置节里找到

location / { 这个配置节

以前是用的FastCGI,所以里面的配置可能是这样子的

host and port to fastcgi server

fastcgi_pass 127.0.0.1:8081;

fastcgi_param PATH_INFO $fastcgi_script_name;

fastcgi_param REQUEST_METHOD $request_method;

fastcgi_param QUERY_STRING $query_string;

fastcgi_param CONTENT_TYPE $content_type;

fastcgi_param CONTENT_LENGTH $content_length;

fastcgi_pass_header Authorization;

fastcgi_param REMOTE_ADDR $remote_addr;

fastcgi_param SERVER_PROTOCOL $server_protocol;

fastcgi_param SERVER_PORT $server_port;

fastcgi_param SERVER_NAME $server_name;

fastcgi_intercept_errors off;

把这些统统删掉,变成了这样

location / {

}

在{}中加入upstream的配置,变成如下样子

location / {

proxy_pass_header Server;

proxy_set_header Host $http_host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Scheme $scheme;

proxy_pass http://frontends;

proxy_next_upstream error;

}

保存配置文件后执行 让nginx重启的指令 nginx -s reload(注意 nginx文件在不同发行版中位置有差别)

然后你就能够通过域名看到你的网站了,试试是不是快多了

注意:生产系统下开启多少个Tornado进程比较好呢,这个见仁见智了,据我压力测试的结果看来,用CPU核数*2的数量最好,再多 就浪费了没有提升(为什么乘2?因为有种CPU上的技术叫超线程)。我的VPS上用的4个进程。如果是8核IntelCPU要挖尽CPU潜能的话需要开16个进程

分享到:
评论

相关推荐

    tornado python web开发

    作为Web服务器,Tornado 有较为出色的抗负载能力,官方用nginx反向代理的方式部署Tornado和其它 Python web应用框架进行对比,结果最大浏览量超过第二名近40%。 性能: Tornado有 着优异的性能。它试图解决C10k问题,...

    【Python】Flask、Django项目的部署【原创】

    文章目录0. 参考1. 概述2. GunicornA....从django、flask、tornado的部署说起 Supervisor使用详解 supervisor(一)基础篇 1. 概述 Python的web框架主要有Django、Flask等,而这两个都是运行在WSGI协议之上的

    Nginx 多站点配置实例详解

    比如 virtualenv app1 跑的是 Django 的一个应用,而 virtualenv app2 跑的是 Tornado。那么如何配置 Nginx,让它同时支持这两个 virtualenv 的运行呢? 首先是 Nginx 的主配置,位于 etc/nginx/ngnix.conf,让它...

    zulip:在渲染上部署Zulip

    该存储库中的代码将在Render上创建以下组件: Zulip Web /应用程序服务器,其中包含: NGINX:前端Web服务器,为Django和Tornado提供静态资产和代理Django:主要的网络应用服务器龙卷风:用于维持持久客户端连接的...

    Beginning Web Development with Python

    用Flask, Tornado, Nginx等进行网络开发 Flask is minimal and simple. You don’t get ORM’s, Admin Panels and other stuff that Django has out of the box. You can install a very cool admin panel with just...

    python入门到高级全栈工程师培训 第3期 附课件代码

    02 Django的ORM基本操作补充之一对多 03 学员管理示例:编辑学生 04 Django的ORM基本操作补充之多对多 05 学员管理示例:为班级分配老师 06 初识Ajax以及简单应用 07 学员管理示例:Ajax删除学生 08 本节作业以及...

    fastor:Python服务端开发框架-极易上手,超过你的想象!

    欢迎使用Python服务端开发框架Fastor Fastor是一个专门为Python打造的API与层次管理系统,通过精心设计的技术与技术实现,集成了大部分稳定开发组件,memcache,redis,龙卷风,django,mysql等。功能丰富:支持大...

    资源HTML.rar

    超全的python开发文档,电商、爬虫、前端、网络编程、微信小程序、celery、django、flask、git、linux、nginx、python环境安装、redis、shell、tornado。

    2017黑马Python就业班

    ├─01基础 │ │ 第1节 linux操作系统基础 │ │ 第2节 python语法基础 │ │ 第3节 项目-飞机大战 │ │ 补充资料 │ │ │ └─第1节 linux操作系统基础 ...│ 第4节 自动化部署 │ 资料 │ ├─课件和资料 5

    flask-template:用于创建基于Flask的项目的模板

    Flask是Django和Tornado等其他Python领域内流行的Web开发框架之一。 我个人比较喜欢它,因为它提供了一种极简主义的方法。 它带有非常基本的包装程序和帮助程序包,您可以选择在开发项目并确定需要的内容时安装难题...

    leetcode下载-learn-git:少即是多

    Tornado gevent/eventlet WEB后端开发技术: 协议、架构、存储、缓存、安全 Bootstrap MySQL MongoDB Redis* Spark Hive Hadoop Storm 大数据开发 分布式计算平台 Scrapy Linux 下开发 NginX tomcat Rabbitmq WSGI ...

    autoops:linux资产管理,cmdb,django,webssh,运维管理平台,数据库操作平台本项目已停止开发!因长期未对代码进行维护,可能会造成项目在不同环境上无法部署,运行BUG等问题,请告知!项目优先参考!

    介绍AutoOps是一款基于2.0版django开发的工具,主要面向linux运维工程师使用,管理linux资产信息,mysql数据库,批量执行命令,脚本,获取流量图,web ssh管理,技术文档等功能。欢迎大家测试使用,有问题可反馈。...

    传智博客python就业班

    │ 第4节 自动化部署.zip │ 资料.zip │ ├─课件和资料 │ django.zip │ linux基础.zip │ Python基础.zip │ Python核心编程.zip │ shell.zip │ tornado.zip │ 前端.zip │ 微信公众号.zip │ 数据库.zip │...

    ProjectStartup

    Schan 使用 HTML5、Python 编程语言、Django Web 框架、Tornado 可扩展非阻塞 Web 服务器构建,使用 jQuery javascript 库和 Memcached 缓存系统 特征 轻量级架构 实时发布和订阅系统(后自动加载) 带有 XML、...

    word源码java-TechBoard:整理开发中积累的各种开源库、框架、工具、方法等

    word源码java TechBoard 整理开发中积累的各种开源库、框架、工具、方法等,为现有技术做积累及未来技术方向做索引。 语言 ...标准 ...开发模型 RUP、IDP、SCRUM、AM、XP、PSP、TSP ...Tornado、Flask、Twisted、Django、Pyra

Global site tag (gtag.js) - Google Analytics