`
sls0919
  • 浏览: 125874 次
  • 性别: 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+django+nginx+mysql搭建网站.zip

    tornado+django+nginx+mysql搭建网站.zip

    python教程之Django部署资料

    在这些部署方法中,Nginx + uWSGI + Django 是一种非常流行的组合,以其高性能和稳定性著称。接下来,我们将详细解释这一部署方案的具体步骤。 ##### 1. WSGI与uWSGI概念澄清 - **WSGI**:Web服务器网关接口,定义...

    Gunicorn Django部署配置方法

    在部署基于Python的Django Web应用时,Gunicorn(Green Unicorn)是一个常用的选择,它是一个高效、异步的WSGI服务器。本篇文章将详细介绍如何使用Gunicorn来部署Django项目。 1. **安装Gunicorn** 要开始部署,...

    tornado python web开发

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

    tornado框架demo

    - **部署**: Tornado 应用可以通过uWSGI或Gunicorn等服务器进行部署,再配合Nginx做反向代理和负载均衡。 - **测试**: 使用unittest或pytest等Python测试框架,编写单元测试和集成测试,确保代码质量。 总结,...

    tornado参考1

    Tornado 是一个高性能的 Python Web 框架和异步网络库,最初由 FriendFeed 开发并随后被 Facebook 收购开源。...在实际部署中,Tornado 通常与 Nginx 作为反向代理服务器一起使用,以进一步提升性能和稳定性。

    Nginx 多站点配置实例详解

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

    linux下的python环境搭建

    这个过程包括安装 Python 解释器、安装 Django 框架、安装 Bootstrap 框架、安装 Tornado 框架和安装 Nginx 服务器。 一、安装 Python 安装 Python 的步骤包括下载安装包、解压安装包、编译安装包和检测安装结果。...

    使用Python的Tornado框架实现一个Web端图书展示页面

    ### 使用Python的Tornado框架实现一个Web端图书展示页面 #### 一、Tornado框架简介与优势 Tornado是一款用Python编写的开源Web框架,它以其高性能和灵活性著称,尤其适用于需要处理大量并发连接的应用场景,如实时...

    Python-WebSSH一个基于Web的ssh客户端

    7. **部署与集成**: 可以将Python-WebSSH部署在各种Web服务器上,如Apache或Nginx,并可以与其他系统(如监控、自动化工具)集成,以实现更复杂的运维需求。 在`huashengdun-webssh-49a64b7`这个文件夹中,包含了...

    zulip:在渲染上部署Zulip

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

    web_deployment_v2.rar

    在Python世界中,Web开发是一项常见任务,而`web_deployment_v2.rar`这个压缩包文件显然包含了关于Python Web服务器部署的示例工程。这个工程旨在教你如何利用配置文件实现Web服务器、Web框架以及静态资源之间的解耦...

    Python测试资产管理系统源码.zip

    11. **部署与服务器**:完成开发后,需要将应用部署到服务器上,可能涉及Nginx、uWSGI等工具,或者使用Heroku、Docker等平台进行云部署。 12. **测试**:Python的unittest或pytest库可以编写单元测试,确保代码的...

    python-web-programming.rar

    9. **部署和运维**:了解如何将Python Web应用部署到生产环境,如使用Apache、Nginx等服务器,以及如何进行性能调优、安全配置等运维工作。 10. **RESTful API设计**:随着前后端分离的趋势,理解RESTful API的设计...

    Python+Web开发实战(pdf 源码)

    8. **部署与运维**:介绍如何将开发好的Web应用部署到服务器,如使用Nginx、Gunicorn等工具,以及基本的性能监控和调试技巧。 9. **实战项目**:通过一个实际的Web项目,将前面所学知识综合运用,可能是搭建一个...

    基于python的51商城的源码程序+详细使用说明

    由于描述中未具体提及所使用的框架,我们可以假设它可能使用了其中的一种。这些框架提供了一整套用于处理路由、模板渲染、数据库交互和会话管理的功能,使得开发者能够快速构建复杂的网站结构。 2. **数据库交互**...

    基于python的论坛系统.rar

    论坛系统最终需要部署在服务器上,可能使用Nginx或uWSGI等工具进行反向代理和负载均衡。监控和日志记录如Prometheus、Grafana和Logstash也可能被用到,以确保系统的稳定运行。 9. 测试: 使用单元测试(unittest...

Global site tag (gtag.js) - Google Analytics