18.tornado项目的部署和运行采用Linux常见应用服务配置模式nginx+supervisord

运行多个Tornado实例好处:

  • 网页响应不需要使用特别多的计算密集型处理
  • 多个实例充分利用 CPU
  • 多端口处理

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

1.supervisord适用场景及简介

  1. supervisord的适用场景:

在一个分布式环境中,每台机器上可能需要启动和停止多个进程,使用命令行方式一个一个手动启动和停止非常麻烦,而且查看每个进程的状态也很不方便。如果有一个工具能够实现每台机器上多个进程的简单高效中心化管理将是非常方便的。于是Supervisord工具应运而生。与Supervisord类似的工具包括monit,daemontools和runit。

  1. supervisord简介:
  • supervisord官网:http://supervisord.org/。Supervisor是Python开发的一套通用进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启(一般是三次重启数)。Supervisor是一个客户/服务器系统,它可以在类Unix系统中管理控制大量进程。有多年历史,目前很多生产环境下的服务器都在使用Supervisor。

  • Supervisor的服务器端称为supervisord,主要负责在启动自身时启动管理的子进程,响应客户端的命令,重启崩溃或退出的子进程,记录子进程stdout和stderr输出,生成和处理子进程生命周期中的事件。可以在一个配置文件中配置相关参数,包括Supervisord自身的状态,其管理的各个子进程的相关属性。配置文件一般位于/etc/supervisord.conf。

  • Supervisor的客户端称为supervisorctl,它提供了一个类shell的接口(即命令行)来使用supervisord服务端提供的功能。通过supervisorctl,用户可以连接到supervisord服务器进程,获得服务器进程控制的子进程的状态,启动和停止子进程,获得正在运行的进程列表。客户端通过Unix域套接字或者TCP套接字与服务端进行通信,服务器端具有身份凭证认证机制,可以有效提升安全性。当客户端和服务器位于同一台机器上时,客户端与服务器共用同一个配置文件/etc/supervisord.conf,通过不同标签来区分两者的配置。

  • Supervisor也提供了一个web页面来查看和管理进程状态,很是方便哦~

2.使用Supervisor监控Tornado进程

(1)supervisor的安装:

安装使用:

激活Python3的virtualenv后按如下步骤来,安装支持 Python3 版本的supervisor:

第一步:supervisor的安装和配置

  • 先安装:
pip install supervisor

正常来说,你应该按如下步骤进行配置,但是嘞,我很随性,所以咱就是不想按照这个来,直接看第二步即可(本项目中自定义配置目录)~
supervisor安装后/etc下有时默认没有配置文件,需要运行echo_supervisord_conf程序生成supervisor的初始化配置文件。具体步骤如下:

  1. 在/etc/下创建supervisor文件夹:
sudo mkdir supervisor
  1. 使用命令生成初始化配置文件:
echo_supervisord_conf > /etc/supervisor/supervisord.conf
  1. 然后编辑这个配置文件(supervisord.conf),在最后(最后一行)让这个配置文件include指定目录下的配置文件:
# 指定了socket file的位置
[unix_http_server]
file=/tmp/supervisor.sock   ;UNIX socket 文件,supervisorctl 会使用
;chmod=0700                 ;socket文件的mode,默认是0700
;chown=nobody:nogroup       ;socket文件的owner,格式:uid:gid
 
 #用于启动一个含有前端的服务,可以从Web页面中管理服务。其中,port用于设置访问地址,username和password用于设置授权认证。
;[inet_http_server]         ;HTTP服务器,提供web管理界面
;port=127.0.0.1:9001        ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
;username=user              ;登录管理后台的用户名
;password=123               ;登录管理后台的密码
 
 # 管理服务本身的配置
[supervisord]
logfile=/tmp/supervisord.log ;日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB        ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小
logfile_backups=10           ;日志文件保留备份数量默认10,设为0表示不备份
loglevel=info                ;日志级别,默认info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ;pid 文件
nodaemon=false               ;是否在前台启动,默认是false,即以 daemon 的方式启动
minfds=1024                  ;可以打开的文件描述符的最小值,默认 1024
minprocs=200                 ;可以打开的进程数的最小值,默认 200
 
 
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord
 
; [program:xx]是被管理的进程配置参数,xx是进程的名称
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run  ; 程序启动命令
autostart=true       ; 在supervisord启动的时候也自动启动
startsecs=10         ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true     ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3       ; 启动失败自动重试次数,默认是3
user=tomcat          ; 用哪个用户启动进程,默认是root
priority=999         ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB  ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20   ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false     ;默认为false,向进程组发送kill信号,包括子进程
 # 对事件进行的管理
;[eventlistener:theeventlistenername]

# 对任务组的管理,包含其它配置文件
;[group:thegroupname]
;programs=progname1,progname2  ; each refers to 'x' in [program:x] definitions
;priority=999                  ; the relative start priority (default 999)

[include]
files = supervisord.d/*.ini    ;可以指定一个或多个以.ini结束的配置文件
  1. supervisord.d这个目录也是得自己新建:
mkdir supervisord.d

然后再在/etc/supervisord.d/目录里放置所有的supervisor的配置文件即可。
supervisord.d目录就是用来存放用户自定义的进程配置,默认的子进程配置文件结尾为include配置的 .ini。

  1. 若/etc/supervisord.d/目录里配置文件有改动,需执行supervisorctl update命令加载新的配置
  • supervisorctl update:配置文件修改后可以使用该命令加载新的配置
  • supervisorctl reload:重新启动配置中的所有程序

第二步:本项目相关配置

  1. cd到项目根目录创建deploy目录用于存放supervisor配置文件:
mkdir deploy
  1. 使用命令在deploy目录下生成一个主服务配置文件
echo_supervisord_conf > deploy/supervisord.conf
  1. 在deploy下创建super文件夹,在里面创建用来装配置的文件tudo.ini:
mkdir super
  1. 检查deploy/supervisord.conf中是否include配置,没有就加上:
[include]
files = super/*.ini
  1. 增加Supervisor项目运行配置文件(名字如 tudo.conf)到 /deploy/super/tudo.ini:
# 增加一个tornadoes进程组
[group:tornadoes]
programs = tornado-8000,tornado-8001,tornado-8002

# 分别定义三个tornado的进程配置

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

[program:tornado-8001]
directory = /home/Dja_pro/tudo_file/ ; 程序的启动目录
command = /root/.virtualenvs/tudo_pro/bin/python /home/Dja_pro/tudo_file/app.py --port=8001 ;
autostart = true
startsecs = 5
autorestart = true
startretries = 3
user = root
redirect_stderr = true
stdout_logfile_maxbytes = 20MB
stdout_logfile_backups = 20
stdout_logfile = /tmp/tudo_log/tornado_app_8001.log
loglevel = info

[program:tornado-8002]
directory = /home/Dja_pro/tudo_file/ ; 程序的启动目录
command = /root/.virtualenvs/tudo_pro/bin/python /home/Dja_pro/tudo_file/app.py --port=8002 ;
autostart = true
startsecs = 5
autorestart = true
startretries = 3
user = root
redirect_stderr = true
stdout_logfile_maxbytes = 20MB
stdout_logfile_backups = 20
stdout_logfile = /tmp/tudo_log/tornado_app_8002.log
loglevel = info
  1. cd到项目目录下的deploy目录里(.conf同级目录),然后使用supervisord启动supervisor服务:

如果出现错误:

Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.

解决办法:

sudo unlink /tmp/supervisor.sock

或者

sudo unlink /var/run/supervisor.sock

到现在已经OK了,我们去浏览器就可以访问项目啦~

  1. supervisorctl 交互操作:
    输入命令 supervisorctl 进入 supervisorctl 的 shell 交互界面:
    (下面命令都可以加supervisorctl直接执行,不进supervisorctl的shell交互界面也行哦~)

help # 查看帮助
status # 查看程序状态
stop program_name # 关闭 指定的程序(program_name是[program:x]中的x)
start program_name # 启动 指定的程序
restart program_name # 重启 指定的程序
stop all # 关闭所有
start all # 启动所有
restart all # 重启所有
update # 重启配置文件修改过的程序(修改了配置,通过这个命令加载新的配置)
supervisorctl reload # 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程
supervisorctl update # 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启

(注意:start,restart,stop都不会载入最新的配置文件!)

使用less /tmp/tudo_log/tornado_app_8062.log查看日志。

拓展一:supervisor开启web端操作页面

  1. 修改配置文件(supervisord.conf)
    把[inet_http_server]模块的注释去掉
    并修改默认的IP、用户名与密码。

需要注意的是:

  • port后面填的不是本机地址如47.xxx.xxx.xxx,它是指的是谁可以访问服务器的supervisor,不填的话就是谁都可以访问。比如可以直接改成port= :9001
  1. 再reload一下就可以啦~
supervisorctl reload
  • 现在我们就可以通过网页端进行本项目的开,关操作了哦~

拓展二:supervisor的启动和管理

  1. 启动supervisor
    一定要先启动 daemon 程序 (supervisord) 才能执行管理操作,否则会报错!
  • 使用默认的主配置文件( /etc/supervisor/supervisord.conf):
    sudo supervisord

  • 明确指定主配置文件(自定义配置目录的):
    sudo supervisord -c /home/tudo_file/deploy/supervisord.conf

  • 使用 user 用户启动supervisord:
    sudo supervisord -u user

  1. 结束 supervisor 进程:
ps -aux|grep supervisord

3. 使用Nginx作为反向代理

  • 搭配 tornado 服务使用:

    在这里插入图片描述

(1)安装nginx

  1. 直接在服务器里执行:
    sudo apt-get install nginx
  2. 确定是否启动
    sudo service nginx status

(安装好后使用ps -ef|grep nginx查看是否运行起来了【双核】)

在这里插入图片描述

(使用ls /etc/nginx 检测配置文件是否存在)
3. 使用命令cat /etc/nginx/sites-enabled/default查看NGING的静态文件内容或者在浏览器输入ip能看到Welcome to nginx!即OK。

在这里插入图片描述

(2)配置nginx完成部署

  • 简单起见,我们直接在/etc/nginx/nginx.conf(主配置文件)文件中的http内加入如下代码:
upstream tornadoes{
    server 192.168.31.1:8060;  
    server 192.168.31.1:8061;
    server 192.168.31.1:8062;
}

proxy_next_upstream error;

server {
    listen 80;   # 一般是 80
    server_name 192.168.31.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;
    }
}

值得一提的是,我这里是为了方便起见,所以直接将本项目配置放到了nginx的主配置文件/etc/nginx/nginx.conf中,这当然不是规矩之举。
nginx官方会推荐我们将项目对应的配置文件放到/etc/nginx/conf.d或者/etc/nginx/sites-enabled/文件夹里。
有兴趣的可以自己搞下试试哦~

  • 其实现在nginx反向代理已经ok了,我们直接访问域名就可以看到项目了,因为nginx默认会当你更改配置时会自动重载。
  • 当然,如果你不放心,可以执行如下命令:
    检查配置文件是否正确:
sudo nginx -t

重载nginx:

sudo nginx -s reload
  • 当我们输入nginx出现如下输出就OK了:

    在这里插入图片描述

拓展:

设置 Nginx 参数——避免使用 Nginx 服务器上传文件时,浏览器报 413 请求过大 !

找到配置文件 nginx.conf (如没有额外配置其他 conf ),在 http{} 或 server{} 或 location{} 节点下添加 client_max_body_size:

client_max_body_size 10m; #(改成你想要的数值)

在这里插入图片描述

nginx -s reload

相关文章

文章浏览阅读3.7k次,点赞2次,收藏5次。Nginx学习笔记一、N...
文章浏览阅读1.7w次,点赞14次,收藏61次。我们在使用容器的...
文章浏览阅读1.4k次。当用户在访问网站的过程中遇到404错误时...
文章浏览阅读2.7k次。docker 和 docker-compose 部署 nginx+...
文章浏览阅读1.3k次。5:再次启动nginx,可以正常启动,可以...
文章浏览阅读3.1w次,点赞105次,收藏182次。高性能:Nginx ...