Supervisor + Nginx + Python3 部署Tornado

Supervisor 部署tornado

#1 環境

CentOS 7.6
Python3.7

#2 需求分析

  • Tornado與Python的其他web框架不同,它自帶HTTPServer
  • Tornado不需要向Django那樣,需要一個uWSGI啓動
  • Tornado可以使用uWSGI啓動,但是會非常影響它的性能,因爲uWSGI是同步的web服務器

所以, 本文主要介紹使用 Supervisor + Nginx部署一個簡單Tornado應用

#3 總體分工

  • Supervisor

用於啓動/關閉等管理Tornado應用

  • Nginx

反向代理 + 負載均衡

#4 Supervisor

#4.1 CentOS安裝Supervisor

有兩種安裝方式 :

  • 使用yum安裝
yum install -y supervisor
  • 使用pip安裝
pip3 install supervisor

本文使用pip3安裝

這種方式安裝不會自動生成配置文件,需要你手動創建配置文件夾和配置文件

手動生成節點文件 :

mkdir -p /etc/supervisor/conf.d 

手動生成配置文 :

echo_supervisord_conf > /etc/supervisor/supervisord.conf

#4.2 解釋說明兩個文件的作用

在這裏插入圖片描述

  • supervisord.conf

Supervisor的配置文件, 我們只需要關心文件的最後一部分即可

...
...
[include]
files = /etc/supervisor/conf.d/*.conf

意思是, 將/etc/supervisor/conf.d/下的*.conf文件加入,我們只需要在/etc/supervisor/conf.d/添加節點文件即可(類似Nginx的配置文件)

  • conf.d

加點文件夾

#4.3 節點配置文件

[group:tornadoes]
programs=tornado-9898,tornado-9899                                                           [program:tornado-9898]
command=python3 /root/a.py --port=9898
directory=/root
user=root
autorestart=true
redirect_stderr=true
stdout_logfile=/root/tornado1.log
loglevel=info                                                                                
[program:tornado-9899]
command=python3 /root/a.py --port=9899
directory=/root
user=root
autorestart=true
redirect_stderr=true
stdout_logfile=/root/tornado2.log
loglevel=info   

解釋 :

  • command
python3 /root/a.py --port=9898

需要執行的命令,python3可以換成python解釋器的絕對路徑,/root/a.py是我的Tornado文件路徑

#4.4 tornado應用

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpclient
from tornado.options import define, options

define("port", default=8765, help="run on the given port ", type=int)                        

class ExampleHandler(tornado.web.RequestHandler):                                            
    def get(self):
        self.write({"status":1, "msg":"success"})                            

if __name__=="__main__":

    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[
        (r"/", ExampleHandler)]
    )
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()  

#4.5 操作

  • 啓動 Supervisor
supervisord -c /etc/supervisor/supervisord.conf
  • 關閉 Supervisor
ps -ef | grep supervisord
kill -s SIGTERM pid

#4.6 管理 Supervisor

  • 進入客戶端
supervisorctl
  • 停止運行某個服務器進程
supervisor> stop tornadoes:tornado-9898
  • 查看狀態
supervisor> status
  • 停止運行整個tornado服務器進程組
supervisor> stop tornadoes:
  • 啓動某個進程
supervisorctl start program_name
  • 重啓某個進程
supervisorctl restart program_name
  • 結束所有屬於名爲 groupworker 這個分組的進程
supervisorctl stop groupworker:
  • 停止全部進程
supervisorctl stop all
  • 載入最新的配置文件,停止原有進程並按新的配置啓動、管理所有進程
supervisorctl reload
  • 啓動新配置或有改動的進程
supervisorctl update

#5 Nginx

upstream tornados{
    server 127.0.0.1:9898;
    server 127.0.0.1:9899;
}
proxy_next_upstream error;
server {
    listen 9999;
    server_name www.minhung.me;
    location /{
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://tornados; # 把請求方向代理傳給tornado服務器,負載均衡 
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章