上一篇文章: Python:Tornado 第四章:Tornado網站部署:第二節:靜態文件
通常調試過程當中咱們使用python app.py運行網站,方便咱們在命令行中看運行情況。python
但在生產環境下咱們須要後臺運行網站。咱們可使用linux的nohup命令。linux
nohup python app.py >> log/app.log &
使用nuhup能夠後臺運行一個進程,可是一旦網站出現錯誤,進程關閉,網站將會中止運行。這時候就須要supervisor來幫咱們守護進程,自動重啓網站。nginx
Supervisord是用Python實現的一款很是實用的進程管理工具。
sudo apt-get install supervisor 修改配置文/etc/supervisord.conf 只須要將最後一行改成下面的形式就能夠了: [include] files = /etc/supervisor/conf.d/.conf 默認好像是以「/.ini」結尾的配置文件
在/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
使用默認的配置文件 /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 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進程都正常運行,而且比逐個管理方便的多
雖然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以循環方式分配到達的訪問請求。_服務器
在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; } }