gunicorn部署Flask服务
作為一個Python選手,工作中需要的一些服務接口一般會用Flask來開發。
Flask非常容易上手,它自帶的app.run(host="0.0.0.0", port=7001)用來調試非常方便,但是用于生產環境無論是處理高并發還是魯棒性都有所欠缺,一般會配合WGSI容器來進行[生產環境的部署][1]。
小磊哥推薦了參考文章[1]中的部署方式,希望將已有的服務放到gunicorn或者Tornado中部署,并用supervisor來管理所有進程(有幾個不同的服務)。
經過調研和嘗試
環境安裝
首先pip安裝gunicorn。
pip install?gunicorn?--user
Tips. pip --user用法
由于是部署在公司云主機上,通常不會給root權限。之前都是提工單給SA sudo裝的,后來發現更安全也更方便的方法是pip install xxx --user,美中不足是安裝完以后需要手動添加PATH
export PATH=/home/username/.local/bin:$PATH
方便起見可以加到~/.bash_profile中
gunicorn?命令啟動
簡單地,gunicorn可以通過gunicorn?-w 4 -b 127.0.0.1:4000 run:app啟動一個Flask應用。其中,
- -w 4是指預定義的工作進程數為4,
- -b 127.0.0.1:4000指綁定地址和端口
- run是flask的啟動python文件,app則是flask應用程序實例
其中run.py中文件的可能形式是:
# run.py from flask import Flask app = Flask(__name__)通過gunicorn?-h可以看到gunicorn有非常多的配置項,因此通常會寫成一個config.py文件來進行配置。看了一下文檔似乎沒有給出正確的config.py中配置項的命名,并且有些博客博主給出的配置項命名是錯誤的,導致配置沒有生效,踩了不少的坑(我找不到那篇坑坑的文章了)。這篇博客[2]給出了一些比較常用且正確的配置。
我所用項目的配置項如下:
# config.py import os import gevent.monkey gevent.monkey.patch_all()import multiprocessing # debug = True loglevel = 'debug' bind = "0.0.0.0:7001" pidfile = "log/gunicorn.pid" accesslog = "log/access.log" errorlog = "log/debug.log" daemon = True # 啟動的進程數 workers = multiprocessing.cpu_count() worker_class = 'gevent' x_forwarded_for_header = 'X-FORWARDED-FOR'1. debug = True
生產環境不需要這個配置項,但調試的時候還是挺好用的。而且,開啟debug項后,在啟動gunicorn的時候可以看到所有可配置項的配置,如下所示。
之前在被上一篇博主欺騙的時候,仔細看了調試信息,發現accesslog和errorlog都沒有被配置,所以導致啟動以后看不到任何日志。
config.py中只需要配置需要修改的項的,大部分采用默認配置即可。默認配置的具體配置內容可以通過gunicorn?-h來查詢。
*配置文件和調試信息來自兩個不同進程,因此信息可能有細微差異
# Debug Info[2018-01-18 17:38:47 +0000] [16015] [DEBUG] Current configuration: proxy_protocol: False worker_connections: 1000 statsd_host: None max_requests_jitter: 0 post_fork: <function post_fork at 0x21037d0> errorlog: - enable_stdio_inheritance: False worker_class: gunicorn.workers.ggevent.GeventWorker ssl_version: 2 suppress_ragged_eofs: True syslog: False syslog_facility: user when_ready: <function when_ready at 0x2103500> pre_fork: <function pre_fork at 0x2103668> cert_reqs: 0 preload_app: False keepalive: 2 accesslog: log/debug.log group: 1001 graceful_timeout: 30 do_handshake_on_connect: False spew: False workers: 2 proc_name: None sendfile: None pidfile: log/gunicorn.pid umask: 0 on_reload: <function on_reload at 0x2103398> pre_exec: <function pre_exec at 0x2103d70> worker_tmp_dir: None limit_request_fields: 100 pythonpath: None on_exit: <function on_exit at 0x21065f0> config: gunicorn_conf.py 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 0x2103ed8> post_request: <function post_request at 0x2106050> forwarded_allow_ips: ['127.0.0.1'] worker_int: <function worker_int at 0x2103aa0> raw_paste_global_conf: [] threads: 1 max_requests: 0 chdir: /home/hzyangxiao2014/POPORobot/QASP daemon: False user: 1028 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 0x2103230> post_worker_init: <function post_worker_init at 0x2103938> child_exit: <function child_exit at 0x21061b8> worker_exit: <function worker_exit at 0x2106320> paste: None default_proc_name: run:app syslog_addr: udp://localhost:514 syslog_prefix: None ciphers: TLSv1 worker_abort: <function worker_abort at 0x2103c08> loglevel: debug bind: ['0.0.0.0:7001'] raw_env: [] initgroups: False capture_output: False reload: False limit_request_field_size: 8190 nworkers_changed: <function nworkers_changed at 0x2106488> timeout: 30 keyfile: None ca_certs: None tmp_upload_dir: None backlog: 2048 logger_class: gunicorn.glogging.Logger2. 日志
# config.py accesslog = "log/access.log" errorlog = "log/debug.log" loglevel = "debug"- 需要log目錄存在。如果不存在,啟動會報錯
- accesslog是訪問日志,可以通過access_log_format設置訪問日志格式。詳細的方法可以見參考文章[2]
- loglevel用于控制errorlog的信息級別,可以設置為debug、info、warning、error、critical。
3. workers
worker_class是指開啟的每個工作進程的模式類型,默認為sync模式,也可使用gevent模式。
workers是工作進程數量,在上述config.py中,取的是CPU的數量。需要注意部署機器的性能,不能無限制多開。多篇文章中推薦了multiprocessing.cpu_count() * 2 + 1這個數量,考慮到我會在一個機器上部署兩個服務,因此數量減半。
4. daemon
daemon = True意味著開啟后臺運行,默認為False
總結
gunicorn的環境配置和使用都比較簡單,也解決了我總是用nohup python run.py >out.log 2>&1 &來啟動Flask后臺服務的問題。
在采用gunicorn部署之前,我也對后臺服務的目錄結構進行了調整。雖然只是便利工作的服務,也希望可以盡可能變的更加professional~
轉載于:https://www.cnblogs.com/ExMan/p/10073301.html
總結
以上是生活随笔為你收集整理的gunicorn部署Flask服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS 14.0.1关闭验证,iPhon
- 下一篇: uc浏览器极速版如何填写邀请码(UC浏览