运行多个Tornado实例

  • 网页响应不是特别的计算密集型处理

  • 多个实例充分利用 CPU

  • 多端口怎么处理

  • Linux 常见应用服务配置模式 nginx 和 supervisord:采用主配置文件 + 项目配置文件

使用Supervisor监控Tornado进程

安装(如果用pip安装注意看是否需要指定使用python2版本)

supervisor 默认只支持 Python2

sudo apt-get install supervisor

或者 激活 Python3 的 virtualenv 后执行,安装支持 Python3 版本的 supervisor

pip install git+https://github.com/Supervisor/supervisor.git

  • 检查主配置文件 deploy/supervisord.conf (如果目录不存在需要创建)

  • 使用命令生成一个主服务配置文件 echo_supervisord_conf > deploy/supervisord.conf (如果没有 deploy 目录就建立)

    检查是否 inculde 配置,没有就加上

    [include]
    files = super/*.conf

    如果 sudo 没有权限就用当前目录生成,然后

    sudo cp deploy/supervisord.conf /etc/supervisor/supervisord.conf 过去

  • 增加 Supervisor 项目运行配置文件(名字如 tudo_super.conf)到 /etc/supervisor/super

  • 把这个文件复制到到  /etc/supervisor/super 下
  • sudo cp deploy/todo_super.conf /etc/supervisor/super
  • 找到启动目录
  • 到项目目录下 pwd 打印出路径
  • 还要找到 python 的路径

    which python

todo_super.conf 文件, 这里要改的是 程序启动路径,启动命令

# 增加一个tornadoes组
[group:tornadoes]
programs = tornado-,tornado-,tornado- # 分别定义三个tornado的进程配置 [program:tornado-]
directory = /home/binbin/tornado25/; 程序的启动目录
command = /home/binbin/.virtualenvs/tornado_1/bin/python /home/binbin/tornado25/app.py --port= ; 启动命令,与手动在命令行启动的命令是一样的,注意这里home不可用~代替
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = ; 启动 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = ; 启动失败自动重试次数,默认是
user = binbin ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /tmp/tornado_app_8000.log
loglevel = info [program:tornado-]
directory = /home/binbin/tornado25/; 程序的启动目录
command = /home/binbin/.virtualenvs/tornado_1/bin/python /home/binbin/tornado25/app.py --port= ; 启动命令,与手动在命令行启动的命令是一样的,注意这里home不可用~代替
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = ; 启动 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = ; 启动失败自动重试次数,默认是
user = binbin ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /tmp/tornado_app_8001.log
loglevel = info [program:tornado-]
directory = /home/binbin/tornado25/; 程序的启动目录
command = /home/binbin/.virtualenvs/tornado_1/bin/python /home/binbin/tornado25/app.py --port= ; 启动命令,与手动在命令行启动的命令是一样的,注意这里home不可用~代替
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = ; 启动 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = ; 启动失败自动重试次数,默认是
user = binbin ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /tmp/tornado_app_8002.log
loglevel = info

启动和管理

启动supervisor

一定要先启动 daemon 程序 (supervisord) 才能执行管理操作,否则会报错

使用默认的主配置文件/etc/supervisor/supervisord.conf

sudo supervisord

明确指定主配置文件

sudo supervisord -c /home/pyvip/working/supervisord.conf 使用 user 用户启动supervisord

使用 user 用户启动supervisord

sudo supervisord -u user

查看、操作进程状态

(tornado) pyvip@Vip:~/ws/tudo$ sudo supervisorctl [sudo] password for pyvip: tornadoes:tornado-8000 RUNNING pid 17652, uptime 0:00:28 tornadoes:tornado-8001 RUNNING pid 17653, uptime 0:00:28 tornadoes:tornado-8002 RUNNING pid 17654, uptime 0:00:28

# 停止运行tornado-8001服务器进程 supervisor> stop tornadoes:tornado-8001 tornados:tornado-8001: stopped

# 停止运行整个tornado服务器进程组

supervisor> stop tornadoes: tornadoes:tornado-8000: stopped tornadoes:tornado-8001: stopped tornadoes:tornado-8002: stopped supervisor> status tornadoes:tornado-8000 STOPPED Jun 26 07:43 PM tornadoes:tornado-8001 STOPPED Jun 26 07:43 PM tornadoes:tornado-8002 STOPPED Jun 26 07:43 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

使用 Nginx 作为反向代理

搭配 tornado 服务使用

安装和运行

  • 安装 sudo apt-get install nginx

  • 检测配置文件正确可用 sudo nginx -t

  • 运行 sudo nginx

  • 修改或增加了配置文件后重启 sudo nginx -s reload

nginx 配置文件

主配置文件是 /etc/nginx/nginx.conf

项目对应的配置文件放到 /etc/nginx/conf.d/*.conf 或者 /etc/nginx/sites-enabled/*

比如 tudo_nginx 文件

upstream tornadoes{
   server 127.0.0.1:8000;   # 本地访问,只用 127.0.0.1
   server 127.0.0.1:8001;
   server 127.0.0.1:8002;
}

proxy_next_upstream error;

server {
   listen 8888;   # 一般是 80
   server_name 127.0.0.1; # 根据实际情况填写对应ip

   location /{
       proxy_pass_header Server;
       proxy_set_header Host $http_host;
       proxy_redirect off;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Scheme $scheme;
       # 把请求方向代理传给tornado服务器,负载均衡
       proxy_pass http://tornadoes;
  }
}

复制到 这个路径下

sudo cp /home/binbin/tornado25/deploy/todo_nginx /etc/nginx/sites-enabled/

常见问题

  1. Linux 目录和文件的操作

  2. 命令的输入 tab 键补全的操作

  3. 按文档操作的顺序 (supervisord 没有启动的报错)

  4. supervisor 的 web 管理界面

  5. 配置文件修改定制应用的套路

  6. nginx 配置解释,conf 文件的作用

  7. vim 的使用和 sudo

  8. 为什么要用 nginx

潭州课堂25班:Ph201805201 tornado 项目 第十二课 项目部署(课堂笔记)的更多相关文章

  1. 潭州课堂25班:Ph201805201 django 项目 第二十六课 docker简介 (课堂笔记)

    官方文档: https://docs.docker.com/install/linux/docker-ce/ubuntu/#set-up-the-repository 1,更新下sudo apt-ge ...

  2. 潭州课堂25班:Ph201805201 django 项目 第二十二课 文章主页 新闻列表页面滚动加载,轮播图后台实现 (课堂笔记)

    新建static/js/news/index.js文件 ,主要用于向后台发送请求, // 新建static/js/news/index.js文件 $(function () { // 新闻列表功能 l ...

  3. 潭州课堂25班:Ph201805201 django 项目 第十八课 前台 注解 (课堂笔记)

    在静态文件 js/user上当下,的 auth.js 文件中 $(function () { let $username = $('#user_name'); // 选择id为user_name的网页 ...

  4. 潭州课堂25班:Ph201805201 爬虫高级 第十二 课 Scrapy-redis分布 项目实战 (课堂笔记)

    建代理池, 1,获取多个网站的免费代理IP, 2,对免费代理进行检测,>>>>>携带IP进行请求, 3,检测到的可用IP进行存储, 4,实现api接口,方便调用, 5,各 ...

  5. 潭州课堂25班:Ph201805201 django框架 第十二课 自定义中间件,上下文处理,admin后台 (课堂笔记)

    中间件 在项目主目录下的配置文件 在项目主目录下创建文件 写个自定义异常处理 方法1 要让其生效,要在主目录下,的中间件中进行注册 主目录下.该文件名.类名 在进入视图函数之前进行判断,  给 req ...

  6. 潭州课堂25班:Ph201805201 爬虫基础 第十四课 js破解 (课堂笔记)

    打断点 找要的数据 鼠标的点击事件 新浪微博登录 表单提交分析 : 先佃输入错误密码开始调式 f10 往下走, f11 进入函数 sh + f11 跳出函数 # -*- coding: utf-8 - ...

  7. 潭州课堂25班:Ph201805201 爬虫基础 第十二课 点触验证码二 (课堂笔记)

    为上次代码添加 模拟人操作 的鼠标的移动轨迹 # -*- coding:utf-8 -*- # 斌彬电脑 # @Time : 2018/9/14 0014 上午 8:08 from selenium ...

  8. FromBottomToTop第十二周项目博客

    FromBottomToTop第十二周项目博客 本周项目计划 设计整体架构,收集素材,制作出静态界面部分 项目进展 已完成游戏整体架构设计 已完成游戏界面.背景音乐等素材的收集 正在进行静态界面部分的 ...

  9. 潭州课堂25班:Ph201805201 django 项目 第五课 静态页面转为模板 (课堂笔记)

    一.分析静态页面   1.静态vs动态 条目 静态页面 动态页面 网站内容 固定不变 经常变动 浏览器加载速度 更快(无需向服务器发起请求) 更慢 改变网站内容 很难(修改或者创建新的html页面) ...

随机推荐

  1. Numpy进阶操作

    目录 1. 如何获取满足条设定件的索引 2. 如何将数据导入和导出csv文件 3. 如何保存和加载numpy对象 4. 如何按列或行拼接numpy数组 5. 如何按列对numpy数组进行排序 6. 如 ...

  2. C++回顾day03---<模板>

    一:函数模板 建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表.这个通用函数就称为函数模板.凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需要在模板中定义一次 ...

  3. crm 数据展示 和分页思想(一)

    1. 数据的展示 数据通过ORM查询出来 对象列表 QuerySet 1. 普通的字段 对象.字段名 ——> 数据库中的值 <td>{{ customer.phone }}</ ...

  4. 一个select元素自定义设计的新思路:appearance: none之后利用<>符号制造小箭头

    最近工作时解决了一个前端小问题(如下图所示):在Safari中,select的控件之上有不和谐的灰色部分. 刚开始时我以为是backgrand或是border设置不当之类产生的问题,在搜索了很久之后终 ...

  5. 面向对象之组合、封装、多态、property装饰器

    概要: 组合 封装 property装饰器 多态 Python推崇鸭子类型:解耦合,统一标准(不用继承) 1. 组合 继承:会传递给子类强制属性 组合:解耦合,减少占用内存.如:正常继承,如果一个班级 ...

  6. 在鼠标右键上加入使用notepad++编辑【转】

    我们在安装完notepad++文本编辑器之后,在一个文本文件上右键有时候并没有出现“使用notepad++编辑的选项”,我们可以通过简单地修改注册表文件来增加这样的功能: 1.  首先打开注册表,wi ...

  7. mysql MHA架构搭建过程

    [环境介绍] 系统环境:Red Hat Enterprise Linux 7 + 5.7.18 + MHA version 0.57 系统 IP 主机名 备注 版本 xx系统 192.168.142. ...

  8. How far away ? HDU - 2586 【LCA】【RMQ】【java】

    题目大意:求树上任意两点距离. 思路: dis[i]表示i到根的距离(手动选根),则u.v的距离=dis[u]+dis[v]-2*dis[lca(u,v)]. lca:u~v的dfs序列区间里,深度最 ...

  9. docker学习-----docker服务的安装

    docker 以下观点个人理解,只做参考 一.docker本身的优势 1.docker他本身是一个容器,用来方便我们项目打包,做服务器虚拟化,统一开发者环境等多种优势:运行于docker上的项目可以快 ...

  10. yolo类检测算法解析——yolo v3

    每当听到有人问“如何入门计算机视觉”这个问题时,其实我内心是拒绝的,为什么呢?因为我们说的计算机视觉的发展史可谓很长了,它的分支很多,而且理论那是错综复杂交相辉映,就好像数学一样,如何学习数学?这问题 ...