部署 Flask + Gunicorn + Nginx

3,334 阅读3分钟

前言

本文记录我AWS上部署Flask服务器的过程~ 希望能帮到有需要的人, 由于本人水平有限,难免有错误与遗漏的地方~ 还请大家多多指正~ (๑•ᴗ•๑)

框架简介

Gunicorn

这里就要先说到WSGI,它是一个协议,定义与协调Python程序与请求之间的接口,常用的WSGI容器有Gunicorn和uWSGI,Gunicorn更加快捷,所以选择Gunicorn

Flask

Flask是一个基于Python的Web开发微框架,借助Web框架,我们就不用关心请求,响应这些底层的实现,而专注于业务的实现~ 而Flask相比于其他框架更加轻量,自由度更高,所以这里我选择了Flask

Nginx

Nginx 是一个异步框架的Web服务器,我将它部署在Gunicorn前面,通过反向代理连接. 其实不加Nginx也是可以的,但是加上Nginx有更多好处, 例如 静态文件支持,负载均衡等等,以后我会再研究研究,单独写一篇博文的~

架构预览

如图~

部署过程

部署的服务器是 AWS 上的 CentOS 服务器, 使用的是Python3.7.0,而AWS上是默认Python2.7的,所以第一步是 安装Python3 环境

安装Python3环境

下载,解压安装包

wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz

tar -zxvf Python-3.7.0.tgz

编译,安装Python3

在Linux上我们需要先安装 gcc 编译器

sudo yum -y install gcc gcc-c++ 
sudo yum -y install zlib zlib-devel
sudo yum -y install libffi-devel 

然后cd当解压目录中进行 编译安装

cd Python-3.7.0/

make

make install

修改软链接

#移除原有软链接
rm -f /usr/bin/{python,python3} 

#创建新的软连接
ln -s /usr/local/python3.7.0/bin/python3.7 /usr/bin/python 
ln -s /usr/local/python3.7.0/bin/python3.7 /usr/bin/python3

修改 yum

将 首行 的配置修改为Python3.7

vim /usr/bin/yum

将 "#!/usr/bin/python" 修改为 "#!/usr/bin/python2.7"

结果

这是我们查看Python版本 就如下~

pip3的安装

使用Python3自然要使用pip3了,下面是pip3的安装方法

安装解压 pip3

$ wget --no-check-certificate https://github.com/pypa/pip/archive/9.0.1.tar.gz

$ tar -zvxf 9.0.1 -C pip-9.0.1   

$ cd pip-9.0.1

# 使用 Python 3 安装
$ python3 setup.py install

创建软连接与更新

sudo ln -s /usr/local/python3/bin/pip /usr/bin/pip3 

pip install --upgrade pip

此时,可能会报错误 /usr/bin/pip: No such file or directory 此时是因为pip升级后位置更改为**/usr/local/bin/pip**,所以要更新缓存

hash -r

配置虚拟环境

接下来就是要配置Python3的虚拟环境,避免相互影响

pip install --upgrade virtualenv

#在需要的目录下创建
virtualenv -p python3 venv

# 激活
source venv/bin/activate

配置Flask 和 Git

这里就是用pip安装自己需要的Web框架了,这里我就先只安装了一个Flask,然后用Git部署代码,因为现阶段代码比较简单,所以没用fabric,后续有时间我会研究研究~

pip install flask

Nginx配置

Nginx的安装很简单,只需要一条命令~

sudo yum install nginx

然后修改Nginx的配置文件 路径在 /etc/nginx/nginx.conf,主要是修改监听端口和root路径,

我是这样改的~ 监听5000端口, root指向我存放代码的Git仓库

这样基本就可以了,然后是配置Gunicorn

Gunicorn

这里也很简单,名利如下~

# 安装
 pip install gunicorn
 
 #启动
 gunicorn -w4 -b 0.0.0.0:5000 app:app

若出现无法启动Gunicorn服务的情况,有可能设置的端口已经被占用了~ 比如我 上次连接断开前没中止,就出现了 无法启动的情况~

如果一切正常的,访问ip就能正常展示了~~ 如果不能访问,建议排除是不是网关设置的问题~

结果