flask-发布web服务

Gunicorn + Nginx + CentOS 7

部署方案是:
Web 服务器采用 Gunicorn host Flask
用 Supervisor 引用 Gunicorn 作常规启动服务
基于 Nginx 作代理

  1. nginx 做为代理服务器:负责静态资源发送(js、css、图片等)、动态请求转发以及结果的回复;
  2. uWSGI 做为后端服务器:负责接收 nginx 请求转发并处理后发给 Flask 应用以及接收 Flask 应用返回信息转发给 nginx;
  3. Flask 应用收到请求后处理数据并渲染相应的返回页面给 uWSGI 服务器。

设置完毕后,整个执行流程如下:

  1. 设置flask环境变量用于设置配置文件
    export FLASK_CONFIG=”production”

  2. 先进入进入python虚拟环境
    source ./gisWebsite/bin/activate

  3. 然后运行gunicorn
    gunicorn run:app -p gisWebserver.pid -c gunicorn_config.py

Supervisor相关参见博文”Supervisor的使用”。

gunicorn配置文件

gunicorn_config.py

# coding=utf-8
import sys
import os
import multiprocessing

path_of_current_file = os.path.abspath(__file__)
path_of_current_dir = os.path.split(path_of_current_file)[0]

_file_name = os.path.basename(__file__)

sys.path.insert(0, path_of_current_dir)

worker_class = 'sync'
workers = multiprocessing.cpu_count() * 2 + 1

chdir = path_of_current_dir

worker_connections = 1000
timeout = 30
max_requests = 2000
graceful_timeout = 30

loglevel = 'info'

reload = True
debug = False

bind = "%s:%s" % ("127.0.0.1", 8000)
pidfile = '%s/run/%s.pid' % (path_of_current_dir, _file_name)
errorlog = '%s/logs/%s_error.log' % (path_of_current_dir, _file_name)
accesslog = '%s/logs/%s_access.log' % (path_of_current_dir, _file_name)

在配置文件里面设置日志等相关信息
gunicorn run:app -p gisWebserver.pid -c gunicorn_config.py

重启
kill -HUP masterpid

配置nginx

先备份配置文件
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

修改为

server {
listen 80;
server_name example.org; # 这是HOST机器的外部域名,用地址也行

location / {
proxy_pass http://127.0.0.1:5000; # 这里是指向 gunicorn host 的服务地址
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

}

重启nginx服务
sudo service nginx restart

这个时候就能访问gunicorn监听的本地地址了。

下面信息尚未操作,有待证实。
将 Gunicorn 作为服务运行
这就是最后一步了,我们在此将采用 UpStart 配置Flask程序作为服务程序在Linux起动时运行。首先建立起动配置文件:

sudo nano /etc/init/myflask.conf

然后加入如下配置

description "The myflask service"

start on runlevel [2345]
stop on runlevel [!2345]


respawn
setuid root
setgid www-data

env PATH= /var/www/myflask/venv/bin
chdir /var/www/myflask/

exec gunicorn -w 4 -b 127.0.0.1:8080 wsgi:application

启动 myflask 服务
sudo service myflask start

独立的 WSGI 容器

  1. Gunicorn:是一个 unix 上被广泛使用的高性能的 WSGI HTTP 服务器,和大多数的web框架兼容,并具有实现简单,轻量级,高性能等特点。Gunicorn 会开启大量进程,等待并处理接收到的请求,每个单独进程能同时处理它们接收到的请求,避免进程启动和销毁的开销。
  2. Tornado:是一款开源的可伸缩、非阻塞式的 Web 服务器和工具集,在高并发的应用场景中有不错的效果。同样,要想通过 Tornado 来部署 Flask 也是很简便的。
  3. Gevent:是一个基于协同程序的python库,与tornado的部署方式类似,通过gevent部署flask也是十分的便利。