blog

Nginx结合Supervisor部署Tornado

Supervisor

Supervisor是使用Python开发的一款进程管理工具,不能在Windows上运行,至少现在是不可以,它主要是在类UNIX上管理进程,当然,它主要管理的是前台进程而不是后台进程,

主要应用场景如一个进程需要对外提供服务并且要一直运行着,但是由于一些未知的因素进程挂掉了,这个时候如果这个进程被Supervisor所管理,那么当进程挂掉的时候,Supervisor就会自动启动它,继续对外提供服务,否则进程挂掉了就需要我们手动启动了。

操作系统环境如下

[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-514.2.2.el7.x86_64 #1 SMP Tue Dec 6 23:06:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# cat /proc/cpuinfo | grep "processor"
processor	: 0

安装Supervisor

[root@localhost ~]# yum -y install supervisor

生成配置文件

[root@localhost ~]# tail -2 /etc/supervisord.conf 
[include]
# 这里是说只要这个目录下面以.ini结尾的文件都会被supervisor加载
files = supervisord.d/*.ini

创建tornado进程配置文件

[root@localhost ~]# vim /etc/supervisord.d/tornados.ini
# 为了方便管理,增加一个tornado组
[group:tornados]
programs=tornado-0,tornado-1

# 分别定义三个tornado的进程配置
[program:tornado-0]
# 进程要执行的命令
command=python /root/tornado/hello.py --port=8000
directory=/root/tornado/
user=root
# 自动重启
autorestart=true
redirect_stderr=true
# 日志路径
stdout_logfile=/root/tornado/tornado0.log
loglevel=info


[program:tornado-1]
command=python /root/tornado/hello.py --port=8001
directory=/root/tornado/
user=root
autorestart=true
redirect_stderr=true
stdout_logfile=/root/tornado/tornado1.log
loglevel=info

创建tornado启动程序

[root@localhost ~]# mkdir tornado
[root@localhost ~]# cd tornado/
[root@localhost tornado]# vim hello.py
#!/usr/bin/env python
# _*_coding:utf-8 _*_

import tornado.ioloop
import tornado.web
import sys

PORT = sys.argv[1]

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write(PORT)

application = tornado.web.Application([
    (r'/', MainHandler),
])

if __name__ == "__main__":
    application.listen(PORT)
    tornado.ioloop.IOLoop.instance().start()

启动试试

[root@localhost tornado]# python3.4 hello.py 8000

打开另一个shell窗口curl下看看有没有返回值

[root@localhost ~]# curl 127.0.0.1:8000
# 有返回启动时指定的端口代表tornado没问题
8000

创建www用户

[root@localhost tornado]# useradd -s /sbin/nologin -M www

启动Supervisor

# 启动的时候需要指定配置文件
[root@localhost tornado]# supervisord -c /etc/supervisord.conf

验证启动是否成功

# 看进程
[root@localhost tornado]# ps -ef | grep "supervisord" | grep -v "grep"
root       1151      1  0 15:50 ?        00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf

访问tornado

[root@localhost tornado]# curl 127.0.0.1:8000
8000
[root@localhost tornado]# curl 127.0.0.1:8001
8001

配置Nginx

先安装Nginx,我这里的配置就简单点,一路往下

[root@localhost tornado]# cd ../
# 安装编译Nginx所依赖的包
[root@localhost ~]# yum -y install pcre pcre-devel zlib zlib-devel 

编译安装Nginx

[root@localhost ~]# wget http://nginx.org/download/nginx-1.10.2.tar.gz
[root@localhost ~]# tar xf nginx-1.10.2.tar.gz 
[root@localhost ~]# cd nginx-1.10.2
[root@localhost nginx-1.10.2]# ./configure \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--user=nginx \
--group=nginx
[root@localhost nginx-1.10.2]# make
[root@localhost nginx-1.10.2]# make install

编辑Nginx配置文件

[root@localhost nginx-1.10.2]# cd /etc/nginx/
[root@localhost nginx]# vim nginx.conf
user  www;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    upstream tornados{
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
    }
    server {
        listen       80;
        server_name  localhost;

    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;
      }
    }
}

检测与法是否有错误

[root@localhost nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

启动Nginx

[root@localhost nginx]# nginx 
# 查看启动状态
[root@localhost nginx]# netstat -tlnp | grep "80"
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6011/nginx: master

访问80端口,这个时候发现已经打通了,nginx的调度算法也是轮训的。

[root@localhost nginx]# curl 127.0.0.1
8000
[root@localhost nginx]# curl 127.0.0.1
8001
[root@localhost nginx]# curl 127.0.0.1
8000
[root@localhost nginx]# curl 127.0.0.1
8001
...

先写这么多吧,冻死了,配置文件什么的都比较少,这个要根据具体业务具体优化的,特别是nginx,这个要问问运维的同学了。。