在生產系統使用Tornado WebServer來代替FastCGI加速你的Django應用

From:http://www.cnblogs.com/Alexander-Lee/archive/2011/05/02/tornado_host_django.html

由於官網被牆,討論組也被牆(囧,萬惡的牆)所以tornado的資料很少,官網的資料也語焉不詳,所以很多童鞋對如何部署使用Tornado心裏沒底。所以本文的主要目的就是教會剛入門的新手如何在生產環境使用Tornado

Tornado是一個異步web框架和服務器,所以在開發longpulling的chat之類應用非常的合適,但是其實本身也是一個高性能的http服務器,也可以作爲一個WSGIServer。所以即使你的網站沒有使用Tornado的框架,而是用了web.py或者是Django來開發(傻瓜萬歲),這個時候Tornado依然可以用來加速你的網站。使用Tornado來代替fastCGI可以大幅提高性能,且可以承載的併發能力也有了成倍的提高(大家可以自己Profile,本文只介紹如果做)。

下面我們開始來介紹如何配置。這裏我們假設你的一個用Django寫的網站在一臺Linux的服務器上快樂地着(ubuntu or CentOS,沒試過在其他發行版折騰過,windows?你在說笑吧),隨着網站越來越紅火,你越發感覺服務器不堪重負。這個時候Tornado出現了,他可以讓你再苟延殘喘好幾個月,節約一大把的銀子去把妹.............回到正題。根據官網的推薦部署方式,我們還是採用Nginx通過upstream來反向代理到N個Tornado的服務器實例上的部署方式。so

Setp1:安裝supervisord

由於Tornado並沒有自身提供Daemon的能力,所以我們需要用一個服務管理工具來管理Tornado的進程,supervisord是用Python實現的一款非常實用的進程管理工具。可以很方便的管理N過進程,且支持進程分組。Supervisord可以通過sudo easy_install supervisor安裝,當然也可以通過Supervisord官網下載後setup.py install安裝。

Step2: 給Django的站點增加一個Tornado的服務器文件(比如serv.py)

創建一個文件Serv.py在Django站點的根目錄,內容如下:

複製代碼
1 __author__ = 'alexander' 2  import os 3  import sys 4 5  from tornado.options import options, define, parse_command_line 6  import django.core.handlers.wsgi 7  import tornado.httpserver 8  import tornado.ioloop 9  import tornado.web 10  import tornado.wsgi 11 12 _HERE = os.path.dirname(os.path.abspath(__file__)) 13 sys.path.append(_HERE) 14 sys.path.append(os.path.join(_HERE, '..')) 15 sys.path.append(os.path.join(_HERE, '../contrib')) 16 os.environ['DJANGO_SETTINGS_MODULE'] = "settings" 17 18  def main(port): 19 wsgi_app = tornado.wsgi.WSGIContainer( 20 django.core.handlers.wsgi.WSGIHandler()) 21 tornado_app = tornado.web.Application( 22 [('.*', tornado.web.FallbackHandler, dict(fallback=wsgi_app)), 23 ]) 24 server = tornado.httpserver.HTTPServer(tornado_app) 25 server.listen(port) 26 tornado.ioloop.IOLoop.instance().start() 27 28  if __name__ == '__main__': 29 main(int(sys.argv[1]))
複製代碼

我這裏通過第一個參數來指定Tornado服務監聽的端口。這樣比較靈活,這點我們在後面的步驟會用到。這個時候我們可以通過

python Serv.py 8000

這個命令來啓動服務器

Step3: 配置Supervisord

第一步安裝的Supervisord還沒有配置,所以我們需要先創建一個配置文件的樣板。在root權限下執行

echo_supervisord_conf > /etc/supervisord.conf

這個時候在/etc/創建了配置文件,用vim打開這個文件,在配置文件的屁股後面加上以下這一段

複製代碼
[program:web] command=python /var/www/site/Serv.py 80%(process_num)02d process_name=%(program_name)s_%(process_num)02d umask=022 startsecs=0 stopwaitsecs=0 redirect_stderr=true stdout_logfile=/tmp/codoon.log numprocs=4 numprocs_start=1
複製代碼

這個配置會啓動4個Tornado的服務進程分別監聽 8001,8002,8003,8004 這四個端口

command這一行是要執行的命令,這裏是用 python /var/www/site/Serv.py 端口號來啓動Tornado的服務進程 80%(process_num)02d 的用途是通過進程編號來生成端口號。下面的process_name這個參數也會用到。這裏要指定的文件名就是上一步我們創建那個Serv.py文件

process_name是進程的名字,由於這裏要啓動4個進程,所以要用process_num來區分

umask是程序執行的權限參數

startsecs這個參數是程序啓動的等待時間

stopwaitsecs這個參數是程序停止的等待時間

redirect_stderr這個參數將錯誤流重定向到std的流輸出,這樣可以省去一個日誌文件的配置,當然也可以不用這個參數分開配置日誌文件

stdout_logfile 這個參數是STD流輸出日誌文件的路徑,Tornado會輸出所有的請求和錯誤信息,通過這個可以統一做日誌處理,分隔什麼的,在程序裏就只需要print到std流就行了。

numprocs 這個參數指定了進程的數量,這裏是4,表明要啓動4個Tornado進程

numprocs_start 這個參數指定了進程號的起始編號,這裏是1,這樣前面的command和process_name裏的%(process_num)02d部分就會在執行的時候被替換爲01~05的字符串

配置修改完成後:wq保存退出,執行:

supervisorctl reload

重新加載配置後,這些進程就啓動起來了

Step4:修改配置Nginx

首先找到在vhost目錄裏你的站點配置文件,打開後,在頭上增加upstream的內容

upstream frontends {       

  server 127.0.0.1:8001;       

  server 127.0.0.1:8002;       

  server 127.0.0.1:8003;       

  server 127.0.0.1:8004;

}

然後在Server配置節裏找到

 location / { 這個配置節

以前是用的FastCGI,所以裏面的配置可能是這樣子的

# host and port to fastcgi server                         
#fastcgi_pass 127.0.0.1:8081;                         
#fastcgi_param PATH_INFO $fastcgi_script_name;                         
#fastcgi_param REQUEST_METHOD $request_method;                         
#fastcgi_param QUERY_STRING $query_string;                         
#fastcgi_param CONTENT_TYPE $content_type;                         
#fastcgi_param CONTENT_LENGTH $content_length;                         
#fastcgi_pass_header Authorization;                         
#fastcgi_param REMOTE_ADDR $remote_addr;                         
#fastcgi_param SERVER_PROTOCOL $server_protocol;                         
#fastcgi_param SERVER_PORT $server_port;                         
#fastcgi_param SERVER_NAME $server_name;                         
#fastcgi_intercept_errors off;

把這些統統刪掉,變成了這樣

location / {

}

在{}中加入upstream的配置,變成如下樣子


location / {                         
  proxy_pass_header Server;                         
  proxy_set_header Host $http_host;                         
  proxy_set_header X-Real-IP $remote_addr;                         
  proxy_set_header X-Scheme $scheme;                         
  proxy_pass http://frontends;                         
  proxy_next_upstream error;

}

保存配置文件後執行  讓nginx重啓的指令 nginx -s reload(注意 nginx文件在不同發行版中位置有差別)

然後你就能夠通過域名看到你的網站了,試試是不是快多了

注意:生產系統下開啓多少個Tornado進程比較好呢,這個見仁見智了,據我壓力測試的結果看來,用CPU核數*2的數量最好,再多 就浪費了沒有提升(爲什麼乘2?因爲有種CPU上的技術叫超線程)。我的VPS上用的4個進程。如果是8核IntelCPU要挖盡CPU潛能的話需要開16個進程


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章