阿里云Flask+Gunicorn+Supervisor+Nginx搭建生产环境服务器

我们在用Flask开发服务端的时候,最终会面临着生产环境怎么部署的问题,难道和开发环境一样,启动入口文件,监听写定的端口就可以吗?当然不是,因为Flask自带的服务器很弱,主要是为了方便开发调试用的。而生产环境不会采用Flask自带的服务器的。生产环境应该使用gunicorn或者uWSIG。本文主要介绍的是gunicorn搭建生产环境。

生产环境介绍

我会以自己的博客网站生产环境的搭建为例来说明。

生产环境

  • 系统:阿里云Ubuntu 16.04
  • Python版本:Python3.7
  • 虚拟环境:virtualenv+virtualenvwrapper

所需工具和模块

  • Flask:Python的服务器框架
  • Gunicorn:WSGI的容器
  • Supervisor:进程管理工具
  • Nginx:反向代理服务器

生产环境的搭建

下面介绍的是搭建生产环境的主要步骤和配置,不包括pythonvirtualenv以及业务上相关模块的安装。这类安装网上资料很多,可自行进行查阅。

创建虚拟环境

在安装和配置好了virtualenvvirtualenvwrapper之后就可以创建虚拟环境了,当然virtualenvwrapper不是必须的,只是命令更加好用而已。

创建虚拟环境

mkvirtualenv env_flask

运行成功后我们就创建了一个env_flask的虚拟环境,你会看到用户的前缀变成了

(env_flask) root@qiye:~#

再试着运行一下python命令

Python 3.7.4 (default, Sep 29 2019, 10:03:44) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
pip install flask

在安装好程序运行所需要的包后,再运行

deactivate

就可以退出虚拟环境

常用的命令

  • mkvirtualenv env_name 创建虚拟环境
  • workon env_name 启动虚拟环境
  • workon 查看虚拟环境
  • deactivate 退出虚拟环境
  • rmvirtualenv env_name 删除虚拟环境

当然你也可以根据自己的喜好选择pipenv来创建虚拟环境,它不仅可以创建虚拟环境,也是一个好用的包管理工具。

注意: 虚拟环境里的python和环境外的python是独立的,你可以想象在成一个独立的空间。环境里和环境外安装的包互不影响。

安装和配置Gunicorn

前面说过了Gunicorn是一个WSGI容器。主要用于提供http的请求和响应。他比开发服务器更强健、性能更高。

注意:这类容器很多,通常有GunicornuWSGIGeventWaitress等,主流的选择是Gunicorn和uWSGI。使用简单,容易配置,性能优秀。

在进入虚拟环境后,直接输入

pip install gunicorn

就可以安装了。那我们应该怎么使用呢?
最简单的使用方式如下所示:

gunicorn -w 4 -b 0.0.0.0:8001 test:app
  • wworkers的缩写,表示开启的进程数量,建议该值为CUP数量*2 + 1,可以参考官网进行配置和设定
  • b指的是监听地址和端口
  • test表示的是入口文件
  • app表示创建的app对象。

这样就能简单的开启服务了。是不是很简单,但是这样也并不方便服务的启停,监控等,所以经常会和进程管理工具supervisor一起使用,后面会讲到怎么和gunicorn搭配使用。

当然这里只是简单的配置和启动,还有许多配置项,我们也经常会用到。我们最好把配置写在一个文件里,然后在运行这个文件岂不是更好。它是一个python文件,比如为gunicorn_web.py

import multiprocessing

bind = '127.0.0.1:8000' # 监听的地址和端口。
workers = multiprocessing.cpu_count() * 2 + 1 # 开启的进程数

threads = multiprocessing.cpu_count() * 2 # 工作进程中线程的数量。只适用于gthread 进程工作方式
backlog = 2048 client处于waiting的数目
worker_class = "gevent" # worker进程的工作方式
worker_connections = 1000 # 客户端最大同时连接数。
daemon = False # 应用是否以daemon方式运行
errorlog = './log/gunicorn.log' # 错误日志路径
.
.
.

很多配置可以查看官网配置项

我个人的博客网站因为很简单,就没有单独写成配置文件。直接在supervisor的配置文件里写上command=/root/.virtualenvs/env_flask/bin/gunicorn -w4 -b 0.0.0.0:8001 app:app

安装和配置Supervisor

Supervisor是一个client/server系统,是一款运行在类UNIX系统上的进程管理工具。可以很简单的控制进程的开关,启停,监听等操作。虽然是基于python开发,可使用范围却不局限于python服务。进程管理都可以使用supervisor。

早期的Supervisor版本还只支持Python2,现在版本4发布后已经完美的支持Python3了。

安装的方式有很多,根据不同的系统输入不同的安装命令,本文都是以Ubuntu 16.04为例来进行说明。

直接用系统安装命令安装

apt-get install supervisor

安装成功后,会在/etc/supervisor生成supervisord.conf配置文件。

root@qiye:/etc/supervisor# ls
conf.d  supervisord.conf

当然我们习惯性的不去修改默认的配置文件,而是专门把自己的配置文件单独写在指定的文件夹中,我部署的这个博客的配置就是放在conf.d文件夹下的missoweb.conf文件中。

采用pip进行安装

pip install supervisor

官网有更为详细的安装步骤。

配置文件

在安装成功后,就需要写配置文件了。前面说过这个博客的配置就是放在conf.d文件夹下的missoweb.conf文件中。

missoweb.conf配置文件内容为

[program:missoweb]
command=/root/.virtualenvs/env_flask/bin/gunicorn -w4 -b 0.0.0.0:8001 app:app
directory=/data/MissoWebServer/
stdout_logfile=/logs/gunicorn.log
stderr_logfile=/logs/gunicorn.err
autostart=false                                 ; 
autorestart=false

这个配置很简单。常用配置下面会一一说明

  1. [program:missoweb]程序名称(用于启动,停止,重启等)
  2. command=运行程序的命令,表示我用虚拟环境env_flask里的gunicron来启动这个项目,监听8001端口。
  3. directory=指定启动入口的目录。
  4. stdout_logfile指定输出日志文件存放在哪里,保存在什么文件里。
  5. stderr_logfile指定错误日志文件存放在哪里,保存在什么文件里。
  6. autostart程序是否自动重启
  7. autorestart程序意外退出是否自动重启

还有很多配置项,比如设置日志文件大小、日志等级、环境变量、用户身份等,可以根据自己的需求参考配置文件进行配置。

常用命令
最常用的命令无非是启动,停止,重启等操作了。

supervisorctl reload ;修改完配置后,重新载入配置文件
supervisorctl update ;根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
supervisorctl status ; 查看当前各个应用的状态。
supervisorctl restart <application name> ;重启指定应用
supervisorctl stop <application name> ;停止指定应用
supervisorctl start <application name> ;启动指定应用
supervisorctl restart all ;重启所有应用
supervisorctl stop all ;停止所有应用
supervisorctl start all ;启动所有应用

也可以先在终端输入supervisorctl进入supervisor的命令交互环境后再输入后面的命令。就像下面这样,随君喜好。

image

安装和配置Nginx

Ubuntu16.04自带的有Nginx,版本很低。如果我们要用新版本的
就必须自己安装,各大系统的安装方式大同小异,这里主要介绍源码安装。我们先到nginx.org官网下载我们需要的版本。一般生产环境建议下载稳定版。我自己服务器下载的是nginx-1.16.1.tar.gz

  1. 解压到指定文件夹下
tar zxvf /usr/local/src/nginx-1.16.1.tar.gz -C /usr/local

这样在/usr/local目录下就有个nginx-1.16.1文件夹了。

  1. 安装Nginx
cd nginx-1.16.1
sudo ./configure --prefix=/usr/local/nginx
sudo make
sudo make install
  1. 配置Nginx
    在完成了nginx的安装后,当然是nginx的配置了。下面是我博客网站nginx的配置。

配置https

server {
  listen 443 ssl default_server http2;
  server_name www.immisso.com;
  ssl_certificate /ssl/1_www.immisso.com_bundle.crt;
  ssl_certificate_key /ssl/2_www.immisso.com.key;
  ssl_session_timeout 5m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

  location / {
    proxy_pass http://0.0.0.0:8001;
  }
  gzip on;
  gzip_buffers 32 4k;
  gzip_comp_level 6;
  gzip_min_length 200;
  gzip_types text/css text/xml application/javascript application/json;
  gzip_vary on;

} 

其中有些参数需要重点说明一下。

  • listen监听的端口,开启ssl,开启http2。
  • server_name域名。
  • ssl_certificatehttps证书.crt文件的位置
  • ssl_certificate_keyhttps证书.key文件的位置
  • ssl_session_timeout缓存有效期
  • ssl_ciphers加密算法
  • ssl_protocols加密协议
  • proxy_pass运行的程序监听的端口。参考上面gunicorn监听的端口。

gzip开头的是配置http2的相关配置。具体可以参考React 首页加载慢的问题性能优化

将http重定向到https

server {
  listen 80;
  server_name www.immisso.com;
  return 301 https://www.immisso.com$request_uri;
}
  1. Nginx常用命令
  • nginx启动Nginx
  • nginx -t测试配置文件是否有语法错误
  • nginx -s reload 重新加载Nginx配置文件
  • nginx -s stop强制停止Nginx
  • nginx -s quit优雅地停止Nginx服务(即处理完所有请求后再停止服务)

经过上面的几大步,就把我们生产环境需要的配置搭建好了。然后把代码上传到服务器,根据上面的步骤,就可以成功的部署了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容