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站點的根目錄,內容如下:
我這裏通過第一個參數來指定Tornado服務監聽的端口。這樣比較靈活,這點我們在後面的步驟會用到。這個時候我們可以通過
python Serv.py 8000
這個命令來啓動服務器
Step3: 配置Supervisord
第一步安裝的Supervisord還沒有配置,所以我們需要先創建一個配置文件的樣板。在root權限下執行
echo_supervisord_conf > /etc/supervisord.conf
這個時候在/etc/創建了配置文件,用vim打開這個文件,在配置文件的屁股後面加上以下這一段
這個配置會啓動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個進程