Flask很是容易上手,它自带的app.run(host="0.0.0.0", port=7001)
用来调试很是方便,可是用于生产环境不管是处理高并发仍是鲁棒性都有所欠缺,通常会配合WGSI容器来进行[生产环境的部署][1]。python
小磊哥推荐了参考文章[1]中的部署方式,但愿将已有的服务放到gunicorn或者Tornado中部署,并用supervisor来管理全部进程(有几个不一样的服务)。flask
通过调研和尝试安全
首先pip安装gunicorn。
pip install gunicorn --user
bash
因为是部署在公司云主机上,一般不会给root权限。以前都是提工单给SA sudo装的,后来发现更安全也更方便的方法是pip install xxx --user
,美中不足是安装完之后须要手动添加PATH
export PATH=/home/username/.local/bin:$PATH
方便起见能够加到~/.bash_profile
中并发
简单地,gunicorn能够经过gunicorn -w 4 -b 127.0.0.1:4000 run:app
启动一个Flask应用。其中,app
-w 4
是指预约义的工做进程数为4,-b 127.0.0.1:4000
指绑定地址和端口其中run.py中文件的可能形式是:高并发
# run.py from flask import Flask app = Flask(__name__)
经过gunicorn -h
能够看到gunicorn有很是多的配置项,所以一般会写成一个config.py文件来进行配置。看了一下文档彷佛没有给出正确的config.py中配置项的命名,而且有些博客博主给出的配置项命名是错误的,致使配置没有生效,踩了很多的坑(我找不到那篇坑坑的文章了)。这篇博客[2]给出了一些比较经常使用且正确的配置。post
我所用项目的配置项以下:性能
# 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'
生产环境不须要这个配置项,但调试的时候仍是挺好用的。并且,开启debug项后,在启动gunicorn的时候能够看到全部可配置项的配置,以下所示。
以前在被上一篇博主欺骗的时候,仔细看了调试信息,发现accesslog和errorlog都没有被配置,因此致使启动之后看不到任何日志。spa
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.Logger
# config.py accesslog = "log/access.log" errorlog = "log/debug.log" loglevel = "debug"
worker_class是指开启的每一个工做进程的模式类型,默认为sync模式,也可以使用gevent模式。
workers
是工做进程数量,在上述config.py
中,取的是CPU的数量。须要注意部署机器的性能,不能无限制多开。多篇文章中推荐了multiprocessing.cpu_count() * 2 + 1
这个数量,考虑到我会在一个机器上部署两个服务,所以数量减半。
daemon = True
意味着开启后台运行,默认为False
gunicorn的环境配置和使用都比较简单,也解决了我老是用nohup python run.py >out.log 2>&1 &来启动Flask后台服务的问题。
在采用gunicorn部署以前,我也对后台服务的目录结构进行了调整。虽然只是便利工做的服务,也但愿能够尽量变的更加professional~
原文连接:https://www.jianshu.com/p/fecf15ad0c9a来源:简书