Flask部署時(shí)WSGI容器選型

flask 比較靈活,部署時(shí)候可以選擇多種wSGI容器聪轿。

這里主要對(duì)Gunicorn 和 Tornado 兩張WSGI容器做比較。

#filename: run.py

# -*- coding: utf-8 -*-
from uop import create_app
from config import APP_ENV

if __name__ == '__main__':
    app = create_app(APP_ENV)
    app.run(host='0.0.0.0', debug=True)

命令行啟動(dòng)flask服務(wù):

$ python run.py
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat

 * Debugger is active!
 * Debugger PIN: 244-749-765


172.28.32.53 - - [19/Jul/2017 09:26:42] "GET /api/iteminfo/iteminfoes/local/600212 HTTP/1.0" 200 -
172.28.32.53 - - [19/Jul/2017 09:26:44] "GET /api/resource/?user_id=600212 HTTP/1.0" 200 -
172.28.32.53 - - [19/Jul/2017 09:26:44] "GET /api/deployment/getDeploymentsByInitiator?initiator=%E8%B4%BE%E6%99%93%E7%A3%8A HTTP/1.0" 200 -
INFO:werkzeug:172.28.32.53 - - [19/Jul/2017 09:26:44] "GET /api/deployment/getDeploymentsByInitiator?initiator=%E8%B4%BE%E6%99%93%E7%A3%8A HTTP/1.0" 200 -
127.0.0.1 - - [25/Jul/2017 11:30:51] "GET /api/mpc_resource/mpc_resource_creater HTTP/1.1" 200 -
INFO:werkzeug:127.0.0.1 - - [25/Jul/2017 11:30:51] "GET /api/mpc_resource/mpc_resource_creater HTTP/1.1" 200 -
127.0.0.1 - - [25/Jul/2017 11:31:21] "GET /api/mpc_resource/mpc_resource_creater HTTP/1.1" 200 -
INFO:werkzeug:127.0.0.1 - - [25/Jul/2017 11:31:21] "GET /api/mpc_resource/mpc_resource_creater HTTP/1.1" 200 -
127.0.0.1 - - [25/Jul/2017 11:31:35] "GET /api/user/users/0753bf1a-5736-11e7-929a-fa163e9474c9 HTTP/1.1" 200 -
INFO:werkzeug:127.0.0.1 - - [25/Jul/2017 11:31:35] "GET /api/user/users/0753bf1a-5736-11e7-929a-fa163e9474c9 HTTP/1.1" 200 -
127.0.0.1 - - [25/Jul/2017 11:31:36] "GET /api/deploy_instance/deploy_instances?user_id=0753bf1a-5736-11e7-929a-fa163e9474c9 HTTP/1.1" 200 -
INFO:werkzeug:127.0.0.1 - - [25/Jul/2017 11:31:36] "GET /api/deploy_instance/deploy_instances?user_id=0753bf1a-5736-11e7-929a-fa163e9474c9 HTTP/1.1" 200 -
127.0.0.1 - - [25/Jul/2017 11:31:36] "GET /api/deploy_instance/deploy_instances?user_id=0753bf1a-5736-11e7-929a-fa163e9474c9 HTTP/1.1" 200 -
INFO:werkzeug:127.0.0.1 - - [25/Jul/2017 11:31:36] "GET /api/deploy_instance/deploy_instances?user_id=0753bf1a-5736-11e7-929a-fa163e9474c9 HTTP/1.1" 200 -
127.0.0.1 - - [25/Jul/2017 11:31:51] "GET /api/mpc_resource/mpc_resource_creater HTTP/1.1" 200 -
INFO:werkzeug:127.0.0.1 - - [25/Jul/2017 11:31:51] "GET /api/mpc_resource/mpc_resource_creater HTTP/1.1" 200 -
127.0.0.1 - - [25/Jul/2017 11:32:09] "GET /api/ip_manager/ip_managers HTTP/1.1" 200 -
INFO:werkzeug:127.0.0.1 - - [25/Jul/2017 11:32:09] "GET /api/ip_manager/ip_managers HTTP/1.1" 200 -
127.0.0.1 - - [25/Jul/2017 11:32:15] "GET /api/pool/pools HTTP/1.1" 200 -
INFO:werkzeug:127.0.0.1 - - [25/Jul/2017 11:32:15] "GET /api/pool/pools HTTP/1.1" 200 -
127.0.0.1 - - [25/Jul/2017 11:32:15] "GET /api/pool/getHosts?host=osnode011007.syswin.com&host=osnode011017.syswin.com&host=osnode011006.syswin.com&host=osnode011018.s
yswin.com&host=osnode011013.syswin.com&host=osnode011008.syswin.com&host=osnode011019.syswin.com&host=osnode011009.syswin.com&host=osnode011014.syswin.com&host=osnode0
11010.syswin.com&host=osnode011021.syswin.com&host=osnode011011.syswin.com&host=osnode011012.syswin.com&host=osnode011025.syswin.com&host=osnode011005.syswin.com&host=
osnode011033.syswin.com&host=osnode011029.syswin.com&host=osnode011022.syswin.com&host=osnode011028.syswin.com&host=osnode011024.syswin.com&host=osnode011020.syswin.co
m HTTP/1.1" 200 -

使用 Gunicorn 做WSGI容器:

#filename:  wsgi.py

# -*- coding: utf-8 -*-
from flask import Flask
from uop import create_app

application = create_app('testing')
#application = create_app('default')

if __name__ == '__main__':
    application.run()

使用gunicorn啟動(dòng)flask:

$ gunicorn -b 0.0.0.0:5000  wsgi:application
[2017-07-19 12:12:25 +0000] [28126] [INFO] Starting gunicorn 19.7.1
[2017-07-19 12:12:25 +0000] [28126] [INFO] Listening at: http://0.0.0.0:5000 (28126)
[2017-07-19 12:12:25 +0000] [28126] [INFO] Using worker: sync
[2017-07-19 12:12:25 +0000] [28131] [INFO] Booting worker with pid: 28131
/root/uop-backend_runtime/uop-backend/uop/auth/handler.py:21: ExtDeprecationWarning: Importing flask.ext.httpauth is deprecated, use flask_httpauth instead.
  from flask.ext.httpauth import HTTPBasicAuth

屏幕沒有任何輸出,flask 框架自己的輸出都沒有了

配置gunicorn 的log_level 為debug

(uop_backend_runtime) [root@uop-test-0cf36b77-f909-4bf8-a728-eb82f379c6bf uop-backend]# /root/.virtualenvs/uop_backend_runtime/bin/gunicorn -b 0.0.0.0:5000  wsgi:application  --log-level=debug
[2017-07-19 12:07:29 +0000] [28044] [DEBUG] Current configuration:
  proxy_protocol: False
  worker_connections: 1000
  statsd_host: None
  max_requests_jitter: 0
  post_fork: <function post_fork at 0x2936938>
  errorlog: -
  enable_stdio_inheritance: False
  worker_class: sync
  ssl_version: 2
  suppress_ragged_eofs: True
  syslog: False
  syslog_facility: user
  when_ready: <function when_ready at 0x2936668>
  pre_fork: <function pre_fork at 0x29367d0>
  cert_reqs: 0
  preload_app: False
  keepalive: 2
  accesslog: None
  group: 0
  graceful_timeout: 30
  do_handshake_on_connect: False
  spew: False
  workers: 1
  proc_name: None
  sendfile: None
  pidfile: None
  umask: 0
  on_reload: <function on_reload at 0x2936500>
  pre_exec: <function pre_exec at 0x2936ed8>
  worker_tmp_dir: None
  limit_request_fields: 100
  pythonpath: None
  on_exit: <function on_exit at 0x293b758>
  config: None
  logconfig: None
  check_config: False
  statsd_prefix:
  secure_scheme_headers: {'X-FORWARDED-PROTOCOL': 'ssl', 'X-FORWARDED-PROTO': 'https', 'X-FORWARDED-SSL': 'on'}
  reload_engine: auto
  proxy_allow_ips: ['127.0.0.1']
  pre_request: <function pre_request at 0x293b0c8>
  post_request: <function post_request at 0x293b1b8>
  forwarded_allow_ips: ['127.0.0.1']
  worker_int: <function worker_int at 0x2936c08>
  raw_paste_global_conf: []
  threads: 1
  max_requests: 0
  chdir: /root/uop-backend_runtime/uop-backend
  daemon: False
  user: 0
  limit_request_line: 4094
  access_log_format: %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"
  certfile: None
  on_starting: <function on_starting at 0x2936398>
  post_worker_init: <function post_worker_init at 0x2936aa0>
  child_exit: <function child_exit at 0x293b320>
  worker_exit: <function worker_exit at 0x293b488>
  paste: None
  default_proc_name: wsgi:application
  syslog_addr: udp://localhost:514
  syslog_prefix: None
  ciphers: TLSv1
  worker_abort: <function worker_abort at 0x2936d70>
  worker_abort: <function worker_abort at 0x2936d70>
  loglevel: debug
  bind: ['0.0.0.0:5000']
  raw_env: []
  initgroups: False
  capture_output: False
  reload: False
  limit_request_field_size: 8190
  nworkers_changed: <function nworkers_changed at 0x293b5f0>
  timeout: 30
  keyfile: None
  ca_certs: None
  tmp_upload_dir: None
  backlog: 2048
  logger_class: gunicorn.glogging.Logger
[2017-07-19 12:07:29 +0000] [28044] [INFO] Starting gunicorn 19.7.1
[2017-07-19 12:07:29 +0000] [28044] [DEBUG] Arbiter booted
[2017-07-19 12:07:29 +0000] [28044] [INFO] Listening at: http://0.0.0.0:5000 (28044)
[2017-07-19 12:07:29 +0000] [28044] [INFO] Using worker: sync
[2017-07-19 12:07:29 +0000] [28049] [INFO] Booting worker with pid: 28049
[2017-07-19 12:07:29 +0000] [28044] [DEBUG] 1 workers
/root/uop-backend_runtime/uop-backend/uop/auth/handler.py:21: ExtDeprecationWarning: Importing flask.ext.httpauth is deprecated, use flask_httpauth instead.
  from flask.ext.httpauth import HTTPBasicAuth
[2017-07-19 12:07:46 +0000] [28049] [DEBUG] GET /api/iteminfo/iteminfoes/project_item
[2017-07-19 12:09:01 +0000] [28049] [DEBUG] GET /api/deployment/getDeploymentsByInitiator

出現(xiàn)了大量的調(diào)試信息,request 的日志也出現(xiàn)了录淡,但是只有URL, 沒有request中請(qǐng)求的的參數(shù)

tornado

# filename: run_tornado.py


# -*- coding: utf-8 -*-
from uop import create_app
from config import APP_ENV

from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.options import define, options
import logging

if __name__ == '__main__':
    options.parse_command_line()

    logging.info('[UOP] UOP is starting...')

    app = create_app(APP_ENV)
    http_server = HTTPServer(WSGIContainer(app))
    http_server.listen(5000)
    IOLoop.instance().start()

輸出日志:

$ python run_tornado.py
[I 170719 08:44:14 run_tornado:15] [UOP] come into main
[I 170719 08:44:20 wsgi:355] 200 GET /api/iteminfo/iteminfoes/project_item?user_id=600212 (172.28.32.53) 6.31ms
[I 170719 08:44:28 wsgi:355] 200 GET /api/resource/?user_id=600212 (172.28.32.53) 9.28ms
[I 170719 08:44:28 handler:376] [UOP] come into uop/deployment/handler.py, args: {'initiator': '\xe8\xb4\xbe\xe6\x99\x93\xe7\xa3\x8a'}
[I 170719 08:44:28 wsgi:355] 200 GET /api/deployment/getDeploymentsByInitiator?initiator=%E8%B4%BE%E6%99%93%E7%A3%8A (172.28.32.53) 3.68ms

NOTE:
In [10]: print('\xe8\xb4\xbe\xe6\x99\x93\xe7\xa3\x8a')
賈曉磊

簡(jiǎn)要分析:

  1. pyton run.py的時(shí)候,flask 框架本身有一些日志會(huì)在屏幕輸出油坝。
  2. 使用gunicorn之后, flask自己的日志被“覆蓋”了嫉戚。
  3. 使用gunicorn開啟日志debug模式,會(huì)生成一些日志澈圈,但是request 的日志不完整彬檀。

最終選了tornado做flask的WSGI容器。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瞬女,一起剝皮案震驚了整個(gè)濱河市窍帝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拆魏,老刑警劉巖盯桦,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慈俯,死亡現(xiàn)場(chǎng)離奇詭異渤刃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贴膘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門卖子,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刑峡,你說我怎么就攤上這事洋闽。” “怎么了突梦?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵诫舅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我宫患,道長(zhǎng)刊懈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任娃闲,我火速辦了婚禮虚汛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘皇帮。我一直安慰自己卷哩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布属拾。 她就那樣靜靜地躺著将谊,像睡著了一般冷溶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓢娜,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天挂洛,我揣著相機(jī)與錄音,去河邊找鬼眠砾。 笑死虏劲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的褒颈。 我是一名探鬼主播柒巫,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼谷丸!你這毒婦竟也來了堡掏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤刨疼,失蹤者是張志新(化名)和其女友劉穎泉唁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揩慕,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亭畜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了迎卤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拴鸵。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蜗搔,靈堂內(nèi)的尸體忽然破棺而出劲藐,到底是詐尸還是另有隱情,我是刑警寧澤樟凄,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布聘芜,位于F島的核電站,受9級(jí)特大地震影響缝龄,放射性物質(zhì)發(fā)生泄漏汰现。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一二拐、第九天 我趴在偏房一處隱蔽的房頂上張望服鹅。 院中可真熱鬧,春花似錦百新、人聲如沸企软。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仗哨。三九已至形庭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厌漂,已是汗流浹背萨醒。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留苇倡,地道東北人富纸。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像旨椒,于是被迫代替她去往敵國(guó)和親晓褪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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

  • [TOC]一直想做源碼閱讀這件事综慎,總感覺難度太高時(shí)間太少涣仿,可望不可見。最近正好時(shí)間充裕示惊,決定試試做一下好港,并記錄一下...
    何柯君閱讀 7,193評(píng)論 3 98
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)米罚,斷路器钧汹,智...
    卡卡羅2017閱讀 134,697評(píng)論 18 139
  • 作者:詹聰聰 序言: 本人工作中需要用到flask-socketio,在學(xué)習(xí)英文文檔時(shí)發(fā)現(xiàn)阔拳,flask-socke...
    Python中文社區(qū)閱讀 12,665評(píng)論 6 39
  • 夏日炎炎天氣熱崭孤,陽光似火戶外燒类嗤。無風(fēng)無雨樹悄靜糊肠,閑著沒事品茶香。泉靚水甜茶湯純遗锣,美點(diǎn)肴正心相怡货裹。清茶濁酒迎賓客,點(diǎn)...
    甘朝武閱讀 67評(píng)論 0 0
  • 簡(jiǎn)書日語學(xué)習(xí)交流群新版打卡活動(dòng)第二期第一天 話題為相對(duì)詞應(yīng)用,需要學(xué)員整理下列單詞的基本含義笔咽、用法搔预、以及與其他單詞...
    白子童閱讀 397評(píng)論 0 0