部署項目Nginx+Tornado+Supervisor


http://www.jianshu.com/p/9bebb99368ea

Tornado

Tornado 和現在的主流 Web 服務器框架(包括大多數 Python 的框架)有着明顯的區別:它是非阻塞式服務器,而且速度相當快。得利於其 非阻塞的方式和對 epoll 的運用,Tornado 每秒可以處理數以千計的連接,這意味着對於實時 Web 服務來說,Tornado 是一個理想的 Web 框架。我們開發這個 Web 服務器的主要目的就是為了處理 FriendFeed 的實時功能 ——在 FriendFeed 的應用里每一個活動用戶都會保持着一個服務器連接。
Tornado 由於內置了支持epoll/kqueue 等高效網絡庫,而具備了處理高並發的能力。

import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web import tornado.httpclient from tornado.options import define, options define("port", default=8001, help="run on the given port ", type=int) define("log_path", default='/tmp', help="log path ", type=str) class IndexHandler(tornado.web.RequestHandler): def get(self): # 接受GET的請求 headers = self.request.headers for k, v in headers.items(): print k, v greeting = self.get_argument('greeting', 'Hello') self.write('%s , friendly user! %s ' % (greeting, headers)) def write_error(self, status_code, **kwargs): self.write('Holly Shit Error %s' % status_code) if __name__=="__main__": # 啟動tornado實例 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() 

執行,這樣就運行了Tornado服務器, 可以等待訪問了

$ python hello.py --port=8000
$ curl http://localhost:8000/
Hello, friendly user!

Tornado簡易項目就搭建完畢

使用Nginx作為反向代理

一個代理服務器是一台中轉客戶端資源請求到適當的服務器的機器。一些網絡安裝使用代理服務器過濾或緩存本地網絡機器到Internet的HTTP請求。因為我們將運行一些在不同TCP端口上的Tornado實例,因此我們將使用反向代理服務器:客戶端通過Internet連接一個反向代理服務器,然后反向代理服務器發送請求到代理后端的Tornado服務器池中的任何一個主機。代理服務器被設置為對客戶端透明的,但它會向上游的Tornado節點傳遞一些有用信息,比如原始客戶端IP地址和TCP格式。
我們的服務器配置如圖8-1所示。反向代理接收所有傳入的HTTP請求,然后把它們分配給獨立的Tornado實例。

 
圖8-1
upstream tornados{ server 127.0.0.1:8020; server 127.0.0.1:8021; server 127.0.0.1:8022; } proxy_next_upstream error; server { listen 80; server_name www.tornado.cc; # 靜態文件直接由Nginx處理 location /static/{ alias /data/web/advance_python/tornado_asyn/img/; expires 24h; } 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; } } 

使用Supervisor監控Tornado進程

Supervisord是用Python實現的一款非常實用的進程管理工具,

  • 安裝 配置

    sudo apt-get install supervisor
    創建配置文件
    echo_supervisord_conf > /etc/supervisord.conf

  • Supervisor 配置文件 /etc/supervisor/conf.d

# 為了方便管理,增加一個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
loglevel=info
啟動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 命令介紹

停止某一個進程,program_name 為 [program:x] 里的 x
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進程都正常運行,並且比逐個管理方便的多



作者:cooffeelis
鏈接:http://www.jianshu.com/p/9bebb99368ea
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM