Python:Tornado 第四章:Tornado網站部署:第三節:運營期配置

上一篇文章: Python:Tornado 第四章:Tornado網站部署:第二節:靜態文件

一、後臺運行

通常調試過程當中咱們使用python app.py運行網站,方便咱們在命令行中看運行情況。python

但在生產環境下咱們須要後臺運行網站。咱們可使用linux的nohup命令。linux

nohup python app.py >> log/app.log &

二、supervisor守護進程

使用nuhup能夠後臺運行一個進程,可是一旦網站出現錯誤,進程關閉,網站將會中止運行。這時候就須要supervisor來幫咱們守護進程,自動重啓網站。nginx

Supervisord是用Python實現的一款很是實用的進程管理工具。
  • 安裝 配置

sudo apt-get install supervisor
修改配置文/etc/supervisord.conf
只須要將最後一行改成下面的形式就能夠了:
[include]
files = /etc/supervisor/conf.d/.conf
默認好像是以「/.ini」結尾的配置文件
  • Supervisor 配置文件 /etc/supervisor/conf.d:

在/etc/supervisor/conf.d/下建立文件:tornado.confweb

# 爲了方便管理,增長一個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=8020
directory=/data/web/advance_python/tornado_asyn/
user=www-data
# 自動重啓
autorestart=true
redirect_stderr=true
# 日誌路徑
stdout_logfile=/home/lidongwei/log/supervisor/tornado/tornado0.log
loglevel=info
[program:tornado-1]
command=python /data/web/advance_python/tornado_asyn/hello.py --port=8021
directory=/data/web/advance_python/tornado_asyn/
user=www-data
autorestart=true
redirect_stderr=true
stdout_logfile=/home/lidongwei/log/supervisor/tornado/tornado1.log
loglevel=info
[program:tornado-2]
command=python /data/web/advance_python/tornado_asyn/hello.py --port=8022
directory=/data/web/advance_python/tornado_asyn/
user=www-data
autorestart=true
redirect_stderr=true
stdout_logfile=/home/lidongwei/log/supervisor/tornado/tornado2.log
  • 啓動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 命令介紹

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進程都正常運行,而且比逐個管理方便的多

三、nginx代理多進程

雖然Tornado的內置IOLoop服務器能夠直接做爲運營服務器運行,但部署一個應用到生產環境面臨着最大化利用系統資源的新挑戰。由於Tornado架構的異步特性,沒法用大多數Python網絡框架標準WSGI進行站點部署,爲了強化Tornado應用的請求吞吐量,在運營環境中一般採用反向代理+多Tornado後臺實例的部署策略。segmentfault

反向代理是代理服務器的一張。它根據客戶端的請求,從後端的服務器上獲取資源,而後將這些資源返回給客戶端。當前最經常使用的開源反向代理服務器是Nginx:網站經過Internet DNS服務器將用戶瀏覽器的訪問定位到多臺Nginx服務器上,每臺Nginx服務器又將訪問重定向到多臺Tornado服務器上。多個Tornado服務器既能夠部署在一臺物理機上,也能夠部署在多臺物理機上。以資源最大化利用爲目的,應該以每一個物理機的CPU數量來決定分配在該臺物理機上運行的Tornado實例數。後端

Nginx配置反向代理的方法很是簡單,打開Nginx配置文件nginx.conf,進行相似以下配置,而後重啓Nginx服務器便可:瀏覽器

user nginx;
worker_process 5;

error_log /var/log/nginx/error.log

pid /var/run/nginx.pid;

events{
use epoll;
}

proxy_next_upstream error;

upstream backs{
//配置3個後臺Tornado服務
server 192.168.0.1:8001;
server 192.169.0.1:8002;
server 192.168.0.2:8003;
}

server{
listen 80; //監聽80端口
server_name www.mysite.com;
}

location / {
proxy_pass http://backs;
}

除了一些標準配置,這個配置文件最重要的部分是upstram、listen和prox_pass指令。upstream backs{}定義了3我的後臺Tornado服務的IP地址及各自的端口號;server{}中的listen定義了Nginx監聽端口號80;proxy_pass定義了全部對根目錄的訪問由以前定義的upstream backs中的服務器組提供服務,在默認狀況下Nginx以循環方式分配到達的訪問請求。_服務器

四、nginx配合supervisor實現多進程

在app.py中添加接受命令行參數:網絡

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        greeting = self.get_argument('greeting', 'Hello')
        self.write(greeting + ', friendly user!')

if __name__ == "__main__":
    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()

可在supervisor配置文件中添加:架構

[program:tornado-8000]
command=python /var/www/main.py --port=8000
directory=/var/www
user=www-data
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/tornado.log
loglevel=info

[program:tornado-8001]
command=python /var/www/main.py --port=8001
directory=/var/www
user=www-data
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/tornado.log
loglevel=info

使用nginx代理:

user nginx;
worker_processes 5;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
use epoll;
}
proxy_next_upstream error;
upstream tornadoes {
server 127.0.0.1:8000;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
server {
listen 80;
server_name www.example.org *.example.org;
location /static/ {
root /var/www/static;
if ($query_string) {
expires max;
}
}
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;
proxy_pass http://tornadoes;
}
}
相關文章
相關標籤/搜索