http://www.jianshu.com/p/9bebb99368ea

Tornado

Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。我们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。
Tornado 由于内置了支持epoll/kqueue 等高效网络库,而具备了处理高并发的能力。

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpclient from tornado.options import define, options
define("port", default=8001, help="run on the given port ", type=int)
define("log_path", default='/tmp', help="log path ", type=str) class IndexHandler(tornado.web.RequestHandler):
def get(self):
# 接受GET的请求
headers = self.request.headers
for k, v in headers.items():
print k, v
greeting = self.get_argument('greeting', 'Hello')
self.write('%s , friendly user! %s ' % (greeting, headers)) def write_error(self, status_code, **kwargs):
self.write('Holly Shit Error %s' % status_code) if __name__=="__main__":
# 启动tornado实例
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

执行,这样就运行了Tornado服务器, 可以等待访问了

$ python hello.py --port=8000
$ curl http://localhost:8000/
Hello, friendly user!

Tornado简易项目就搭建完毕

使用Nginx作为反向代理

一个代理服务器是一台中转客户端资源请求到适当的服务器的机器。一些网络安装使用代理服务器过滤或缓存本地网络机器到Internet的HTTP请求。因为我们将运行一些在不同TCP端口上的Tornado实例,因此我们将使用反向代理服务器:客户端通过Internet连接一个反向代理服务器,然后反向代理服务器发送请求到代理后端的Tornado服务器池中的任何一个主机。代理服务器被设置为对客户端透明的,但它会向上游的Tornado节点传递一些有用信息,比如原始客户端IP地址和TCP格式。
我们的服务器配置如图8-1所示。反向代理接收所有传入的HTTP请求,然后把它们分配给独立的Tornado实例。

 
图8-1
upstream tornados{
server 127.0.0.1:8020;
server 127.0.0.1:8021;
server 127.0.0.1:8022;
}
proxy_next_upstream error;
server {
listen 80;
server_name www.tornado.cc; # 静态文件直接由Nginx处理
location /static/{
alias /data/web/advance_python/tornado_asyn/img/;
expires 24h;
}
location /{
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
# 把请求方向代理传给tornado服务器,负载均衡
proxy_pass http://tornados;
}
}

使用Supervisor监控Tornado进程

Supervisord是用Python实现的一款非常实用的进程管理工具,

  • 安装 配置

    sudo apt-get install supervisor
    创建配置文件
    echo_supervisord_conf > /etc/supervisord.conf

  • Supervisor 配置文件 /etc/supervisor/conf.d

# 为了方便管理,增加一个tornado组
[group:tornados]
programs=tornado-0,tornado-1,tornado-2 # 分别定义三个tornado的进程配置
[program:tornado-0]
# 进程要执行的命令
command=python /data/web/advance_python/tornado_asyn/hello.py --port=8020
directory=/data/web/advance_python/tornado_asyn/
user=www-data
# 自动重启
autorestart=true
redirect_stderr=true
# 日志路径
stdout_logfile=/home/lidongwei/log/supervisor/tornado/tornado0.log
loglevel=info [program:tornado-1]
command=python /data/web/advance_python/tornado_asyn/hello.py --port=8021
directory=/data/web/advance_python/tornado_asyn/
user=www-data
autorestart=true
redirect_stderr=true
stdout_logfile=/home/lidongwei/log/supervisor/tornado/tornado1.log
loglevel=info [program:tornado-2]
command=python /data/web/advance_python/tornado_asyn/hello.py --port=8022
directory=/data/web/advance_python/tornado_asyn/
user=www-data
autorestart=true
redirect_stderr=true
stdout_logfile=/home/lidongwei/log/supervisor/tornado/tornado2.log
loglevel=info
启动supervisor

使用默认的配置文件 /etc/supervisord.conf
supervisord
明确指定配置文件
supervisord -c /etc/supervisord.conf
使用 user 用户启动supervisord
supervisord -u user

查看、操作进程状态

[/etc/supervisor/conf.d]$ sudo supervisorctl
[sudo] password for lidongwei:
tornados:tornado-0 RUNNING pid 10012, uptime 1:22:04
tornados:tornado-1 RUNNING pid 10011, uptime 1:22:04
tornados:tornado-2 RUNNING pid 10013, uptime 1:22:04

# 停止运行tornado-1服务器进程
supervisor> stop tornados:tornado-1
tornados:tornado-1: stopped
supervisor> status
tornados:tornado-0 RUNNING pid 10012, uptime 1:23:19
tornados:tornado-1 STOPPED Mar 12 06:46 PM
tornados:tornado-2 RUNNING pid 10013, uptime 1:23:19

# 停止运行整个tornado服务器进程组
supervisor> stop tornados:
tornado-0: stopped
tornado-2: stopped
supervisor> status
tornados:tornado-0 STOPPED Mar 12 06:50 PM
tornados:tornado-1 STOPPED Mar 12 06:46 PM
tornados:tornado-2 STOPPED Mar 12 06:50 PM

supervisorctl 命令介绍

停止某一个进程,program_name 为 [program:x] 里的 x
supervisorctl stop program_name
启动某个进程
supervisorctl start program_name
重启某个进程
supervisorctl restart program_name
结束所有属于名为 groupworker 这个分组的进程 (start,restart 同理)
supervisorctl stop groupworker:
结束 groupworker:name1 这个进程 (start,restart 同理)
supervisorctl stop groupworker:name1
停止全部进程,注:start、restart、stop 都不会载入最新的配置文件
supervisorctl stop all
载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程
supervisorctl reload
根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
supervisorctl update

总结

Supervisor和你系统的初始化进程一起工作,并且它应该在系统启动时自动注册守护进程。当supervisor启动后,程序组会自动在线。默认情况下,Supervisor会监控子进程,并在任何程序意外终止时重生。如果你想不管错误码,重启被管理的进程,你可以设置autorestart
为true

Supervisor不只可以使管理多个Tornado实例更容易,还能让你在Tornado服务器遇到意外的服务中断后重新上线时泰然处之。
三个tornado进程都正常运行,并且比逐个管理方便的多


作者:cooffeelis
链接:http://www.jianshu.com/p/9bebb99368ea
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

部署项目Nginx+Tornado+Supervisor的更多相关文章

  1. centos7 使用nginx + tornado + supervisor搭建服务

    如何在Linux下部署一个简单的基于Nginx+Tornado+Supervisor的Python web服务. Tornado:官方介绍,是使用Python编写出来的一个极轻量级.高可伸缩性和非阻塞 ...

  2. 将Flask应用程序部署在nginx,tornado的简单方法

    来自:http://www.xuebuyuan.com/618750.html 在网上搜索了一下部署flask应用的方法,大部分是用wsgi部署在nginx上面,部署了很久,都没有成功,可能是我领悟能 ...

  3. Nginx + tornado + supervisor部署

    参考链接:supervisor + Tornado + Nginx 使用详解, 用tornado ,Supervisord ,nginx架网站, tornado官方文档 项目文档树: . ├── ch ...

  4. CentOS 下部署Nginx+Gunicorn+Supervisor部署Flask项目

    原本之前有一部分东西是在Windows Server,但是由于Gunicorn不支持Windows部署起来颇为麻烦.最近转战CentOS,折腾一段时间,终于简单部署成功.CentOS新手,作为一个总结 ...

  5. 给我一台全新的服务器,使用nginx+gunicorn+supervisor部署django

    0.准备工作 在一台全新的服务器中新建用户以及用户的工作目录,之后的操作都以这个用户的身份进行,而不是直接用root. 举个栗子: 在服务器下新建用户rinka并赋予sudo权限 1) root登陆, ...

  6. Nginx+Gunicorn+Supervisor部署Flask应用

    Flask 内置了简单的 Web 环境,让我们在开发的时候只需要专注于应用实现,而真正要在生产环境运行时这个简单的 Web 环境就不够用了,还需要一系列操作才能让 Web 应用高效的运行起来.现在记录 ...

  7. Django 部署 uwsgi + nginx + supervisor

    Django 部署 uwsgi + nginx + supervisor https://hacpai.com/article/1460607620615?p=1&m=0 zonghua • ...

  8. tornado + supervisor + nginx 的一点记录

    看了比较多的blog基本都是这个架构: supervisor ------------ app1 |-------app2 |-------.... |-------appn |-------ngin ...

  9. flask +gevent+nginx+Gunicorn+supervisor部署flask应用

    上篇   可以完美部署flask ,但是视乎在结合gevent+apscheduler 实现异步非阻塞后台和定时任务的时候视乎不是那么完美.请教了前辈,决定使用flask+gevent+nginx+g ...

随机推荐

  1. [HDU6155]Subsequence Count(线段树+矩阵)

    DP式很容易得到,发现是线性递推形式,于是可以矩阵加速.又由于是区间形式,所以用线段树维护. https://www.cnblogs.com/Miracevin/p/9124511.html 关键在于 ...

  2. DP Training(Updating)

    感觉前面做了那么多$dp$全是自己想的还是太少啊…… 好像在LZT的博客上看到了不错的资源?赶紧开坑,以一句话题解为主 Codeforces 419B 第一题就开始盗图 由于只有一个交点,手玩一下发现 ...

  3. 洛谷.3803.[模板]多项式乘法(NTT)

    题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...

  4. C++之lambda理解

    简介 在C++ Primer中,是这样定义的-一个lambda表达式表示一个可调用的代码单元,可以将其理解为一个未命名的内联函数:与任何函数类似,一个lambda具有一个返回类型,一个参数列表和一个函 ...

  5. ASP.NET 构建高性能网站 第4篇

    部署优化 我们都知道,不同的部署方式对站点的性能是有影响的,可能有些朋友已经知道了这点,不管怎样,我们这里还是详细系统的讲述一下这个问题,熟悉的朋友权当回顾J. Release方式编译项目 如果我们的 ...

  6. 一个.net下的轻量级的Serverless 文档数据库LiteDB

    今天发现了一个.net下的轻量级的Serverless 文档数据库LiteDB,感觉还不错 官方网站: http://www.litedb.org/ 项目主页: https://github.com/ ...

  7. 浅析Windows系统调用——2种切换到内核模式的方法

    http://shayi1983.blog.51cto.com/4681835/1710861/

  8. [Asp.Net web api]基于自定义Filter的安全认证

    摘要 对第三方开放的接口,处于安全的考虑需要对其进行安全认证,是否是合法的请求.目前在项目中也遇到这种情况,提供的接口因为涉及到客户铭感数据,所以在调用的时候,不能直接暴露,需要有一个认证的机制.所以 ...

  9. Entity Framework实现事务回滚

    在使用Entity Framework为主从表添加数据,当一个表添加数据成功,另一个表添加数据失败,这时候就需要用到事务回滚. 比如有以下关系的2张表. 客户端使用TransactionScope类可 ...

  10. 使用静态库的一些问题 -all_load

    1.使用类目在我们的静态库中涉及到 类目 catagory的使用时,会崩溃:此时我们需要设置project的Info里面的Link Flag处,增加-all_load,这样会链接所以存在的symbol ...