博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
部署项目Nginx+Tornado+Supervisor
阅读量:5075 次
发布时间:2019-06-12

本文共 5017 字,大约阅读时间需要 16 分钟。

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

Tornado

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

Tornado 由于内置了支持epoll/kqueue 等高效网络库,而具备了处理高并发的能力。

import tornado.httpserverimport tornado.ioloopimport tornado.optionsimport 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
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=8020directory=/data/web/advance_python/tornado_asyn/user=www-data# 自动重启autorestart=trueredirect_stderr=true# 日志路径stdout_logfile=/home/lidongwei/log/supervisor/tornado/tornado0.logloglevel=info[program:tornado-1]command=python /data/web/advance_python/tornado_asyn/hello.py --port=8021directory=/data/web/advance_python/tornado_asyn/user=www-dataautorestart=trueredirect_stderr=truestdout_logfile=/home/lidongwei/log/supervisor/tornado/tornado1.logloglevel=info[program:tornado-2]command=python /data/web/advance_python/tornado_asyn/hello.py --port=8022directory=/data/web/advance_python/tornado_asyn/user=www-dataautorestart=trueredirect_stderr=truestdout_logfile=/home/lidongwei/log/supervisor/tornado/tornado2.logloglevel=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 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载于:https://www.cnblogs.com/DjangoBlog/p/8044234.html

你可能感兴趣的文章
重启rabbitmq服务
查看>>
正则表达式(进阶篇)
查看>>
无人值守安装linux系统
查看>>
【传道】中国首部淘宝卖家演讲公开课:农业本该如此
查看>>
jQuery应用 代码片段
查看>>
MVC+Servlet+mysql+jsp读取数据库信息
查看>>
黑马程序员——2 注释
查看>>
用OGRE1.74搭建游戏框架(三)--加入人物控制和场景
查看>>
转化课-计算机基础及上网过程
查看>>
android dialog使用自定义布局 设置窗体大小位置
查看>>
ionic2+ 基础
查看>>
互联网模式下我们更加应该“专注”
查看>>
myeclipse集成jdk、tomcat8、maven、svn
查看>>
查询消除重复行
查看>>
Sand Making Plant Produced by Red Star
查看>>
Win 10 文件浏览器无法打开
查看>>
HDU 1212 Big Number(C++ 大数取模)(java 大数类运用)
查看>>
-bash: xx: command not found 在有yum源情况下处理
查看>>
[leetcode]Minimum Path Sum
查看>>
内存管理 浅析 内存管理/内存优化技巧
查看>>