部署

tornado是有它自己的HTTP服務(wù)器的

一般情況

def main():
    app = make_app()
    app.listen(8888)
    IOLoop.current().start()

if __name__ == '__main__':
    main()

需要 改變可以同時(shí)打開的文件數(shù)量,通過/etc/security/limits.conf或者supvisor的minfds設(shè)置榛丢。

啟動(dòng)多個(gè)進(jìn)程

def main():
    app = make_app()
    server = tornado.httpserver.HTTPServer(app)
    server.bind(8888)
    server.start(0)  # 有幾個(gè)CPU啟動(dòng)幾個(gè) 共享一個(gè)端口
    IOLoop.current().start()

限制問題是每個(gè)進(jìn)程是有自己的IOloop,不能動(dòng)全局的IOloop坑填;無法做不停機(jī)更新;因?yàn)槎急O(jiān)聽一個(gè)端口沒法有效控制。

最好是分開啟動(dòng)它們氧秘,每個(gè)監(jiān)聽不同的端口,可以使用supvisor的process groups概念趴久。當(dāng)每個(gè)進(jìn)程監(jiān)聽不同端口時(shí)丸相,可以使用負(fù)載均衡例如HAProxy或nginx來分發(fā)。

在負(fù)載均衡之后

可以在初始化HTTPServer時(shí)傳入xheaders=True來告訴tornado使用X-Real-IP來獲得用戶的IP地址而不是負(fù)載均衡的IP彼棍。

user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
    use epoll;
}

http {
    # Enumerate all the Tornado servers here
    upstream frontends {
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
        server 127.0.0.1:8003;
    }

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    access_log /var/log/nginx/access.log;

    keepalive_timeout 65;
    proxy_read_timeout 200;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    gzip on;
    gzip_min_length 1000;
    gzip_proxied any;
    gzip_types text/plain text/html text/css text/xml
            application/x-javascript application/xml
            application/atom+xml text/javascript;

    # Only retry if there was a communication error, not a timeout
    # on the Tornado server (to avoid propagating "queries of death"
    # to all frontends)
    proxy_next_upstream error;

    server {
        listen 80;

        # Allow file uploads
        client_max_body_size 50M;

        location ^~ /static/ {
            root /var/www;
            if ($query_string) {
                expires max;
            }
        }
        location = /favicon.ico {
            rewrite (.*) /static/favicon.ico;
        }
        location = /robots.txt {
            rewrite (.*) /static/robots.txt;
        }

        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://frontends;
        }
    }
}

靜態(tài)文件部署

settings = {
    "static_path": os.path.join(os.path.dirname(__file__), "static"),
    "cookie_secret": "__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__",
    "login_url": "/login",
    "xsrf_cookies": True,
}
application = tornado.web.Application([
    (r"/", MainHandler),
    (r"/login", LoginHandler),
    (r"/(apple-touch-icon\.png)", tornado.web.StaticFileHandler,
    dict(path=settings['static_path'])),
], **settings)

所有以static開頭的訪問都會(huì)到static dir中去灭忠。包括robots.txt和favicon.ico。

<html>
<head>
    <title>FriendFeed - {{ _("Home") }}</title>
</head>
<body>
    <div>![]({{ static_url()</div>
</body>
</html>

使用static_url的url是/static/images/logo.png?v=aae54會(huì)包含一個(gè)該文件的hash值座硕,這樣在圖片未改變之前都會(huì)cache弛作。

使用nginx來提供靜態(tài)文件:

location /static/ {
    root /var/friendfeed/static;
    if ($query_string) {
        expires max;
    }
}

debug和自動(dòng)重載

啟用了debug后

autoreload=True  監(jiān)聽文件變化并自動(dòng)reload 使用了該設(shè)置則不能用多進(jìn)程
compiled_template_cache=False: Templates will not be cached.
static_hash_cache=False: Static file hashes (used by the static_url function) will not be cached
serve_traceback=True: When an exception in a is not caught, an error page including a stack trace will be generated.

wsgi

import tornado.web
import tornado.wsgi

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

tornado_app = tornado.web.Application([
    (r"/", MainHandler),
])
application = tornado.wsgi.WSGIAdapter(tornado_app)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市华匾,隨后出現(xiàn)的幾起案子映琳,更是在濱河造成了極大的恐慌,老刑警劉巖蜘拉,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萨西,死亡現(xiàn)場離奇詭異,居然都是意外死亡旭旭,警方通過查閱死者的電腦和手機(jī)原杂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來您机,“玉大人穿肄,你說我怎么就攤上這事〖士矗” “怎么了咸产?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仲闽。 經(jīng)常有香客問我脑溢,道長,這世上最難降的妖魔是什么赖欣? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任屑彻,我火速辦了婚禮,結(jié)果婚禮上顶吮,老公的妹妹穿的比我還像新娘社牲。我一直安慰自己,他們只是感情好悴了,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布搏恤。 她就那樣靜靜地躺著违寿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熟空。 梳的紋絲不亂的頭發(fā)上藤巢,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音息罗,去河邊找鬼掂咒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛迈喉,可吹牛的內(nèi)容都是我干的绍刮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼弊添,長吁一口氣:“原來是場噩夢啊……” “哼录淡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起油坝,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤嫉戚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后澈圈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彬檀,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年瞬女,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窍帝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诽偷,死狀恐怖坤学,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情报慕,我是刑警寧澤深浮,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站眠冈,受9級特大地震影響飞苇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜗顽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一布卡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雇盖,春花似錦忿等、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娃闲。三九已至虚汛,卻和暖如春匾浪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卷哩。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工蛋辈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人将谊。 一個(gè)月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓冷溶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尊浓。 傳聞我的和親對象是個(gè)殘疾皇子逞频,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)栋齿,斷路器苗胀,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 本文不講解各種技術(shù)的詳細(xì)使用,只把整個(gè)node初步部署的過程寫出來瓦堵,最終目的是能確保nodejs成功在云主機(jī)跑起來...
    osjj閱讀 23,490評論 10 46
  • 昨晚夜跑后在回宿舍的路上,我想了很久惋鸥,覺得能夠忘掉一個(gè)人的最好的方法之一就是斷掉與他所有能夠聯(lián)系到的聯(lián)系方式杂穷。我打...
    多啦a夢b閱讀 690評論 9 7
  • 今天是周四耐量,是我和女兒約定好不批評她的日子,好好說話 迎卤,這一天簡稱joy day. 女兒五歲半了拴鸵,一直以來乖巧懂事...
    EIC喵姐閱讀 273評論 0 0
  • 控制不了自己,隨心蜗搔、隨意劲藐、隨事、隨人樟凄,高興就好聘芜。本來就短暫的時(shí)光里,為何非要將就他人而不是讓自己開心缝龄。
    w王大大da閱讀 200評論 0 0