Tornado一個高效的異步非阻塞式的實時Web服務器,是Facebook旗下的 FriendFeed 網站開源Web服務器版本。可是它內置的HTTP服務器功能有限,不能在生產環境下使用。javascript
在 FriendFeed 中,他們使用Nginx作負載均衡和靜態文件伺服。 多臺服務器上,同時部署了多個 Tornado 實例,一般,一個 CPU 內核 會對應一個 Tornado 線程。由於Tornado是跑在負載均衡服務器(如 nginx)後面的,因此須要把 xheaders=True
傳到 HTTPServer
的構造器當中去。這是爲了讓 Tornado 使用 X-Real-IP
這樣的的 header 信息來獲取用戶的真實 IP地址,若是使用傳統 的方法,你只能獲得這臺負載均衡服務器的 IP 地址。css
下面是 nginx 配置文件的一個示例,總體上與FriendFeed 中使用的差很少html
我新建了一個 tornado-simple 的項目,這是個人目錄結構前端
static目錄裏面存放靜態文件,到時候在配置Nginx時靜態目錄時,就指向該目錄。java
app.py的代碼node
1 # -*- coding: utf-8 -*- 2 3 import tornado.ioloop 4 import tornado.web 5 6 7 class MainHandler(tornado.web.RequestHandler): 8 def get(self): 9 self.write("Hello, world") 10 11 12 13 app = tornado.web.Application([ 14 (r"/", MainHandler), 15 ]) 16 if __name__ == "__main__": 17 app.listen(8080) 18 tornado.ioloop.IOLoop.instance().start()
下面是nginx.conf配置python
1 # 工做線程數 2 worker_processes 1; 3 4 # 錯誤日誌 5 error_log logs/error.log; 6 7 # pid 8 pid logs/nginx.pid; 9 10 #鏈接數 11 events { 12 worker_connections 1024; 13 } 14 15 # 配置HTTP 16 http { 17 #上行的前端 18 upstream frontends{ 19 server 127.0.0.1:8080; 20 } 21 #可識別的媒體類型 22 include mime.types; 23 default_type application/octet-stream; 24 access_log logs/access.log; 25 26 # 是否可發送文件 27 sendfile on; 28 # 長鏈接 29 keepalive_timeout 65; 30 # 代理超時 31 proxy_read_timeout 200; 32 #關閉tcp push 33 tcp_nopush on; 34 # 關閉tcp延遲 35 tcp_nodelay on; 36 # 啓用gzip壓縮算法 37 gzip on; 38 gzip_min_length 1000; 39 gzip_proxied any; 40 gzip_types text/plain text/css text/xml 41 application/x-javascript application/xml 42 application/atom+xml text/javascript; 43 proxy_next_upstream error; 44 45 # 監聽服務器配置 46 server { 47 listen 80; 48 server_name localhost; 49 #容許文件上傳的最大大小 50 client_max_body_size 50M; 51 52 # 指定靜態文件映射 53 location ^~ /static/ { 54 root 你本身的目錄/tornado-simple/; 55 if ($query_string) { 56 expires max; 57 } 58 index index.html index.htm; 59 } 60 # 重寫 favicon.ico 61 location = /favicon.ico { 62 rewrite (.*) /static/favicon.ico; 63 } 64 # 指定默認的錯誤頁面 65 error_page 500 502 503 504 /50x.html; 66 location = /50x.html { 67 root html; 68 } 69 70 #代理配置 71 location / { 72 proxy_pass_header Server; 73 proxy_set_header Host $http_host; 74 proxy_redirect off; 75 proxy_set_header X-Real-IP $remote_addr; 76 proxy_set_header X-Scheme $scheme; 77 proxy_pass http://frontends; 78 } 79 } 80 }
啓動Tornadonginx
1 python app.py
啓動nginxweb
1 sudo nginx