将 Flask 应用部署到 CentOS

本文将带你一起将一个 Flask 项目部署到服务器上。本文使用《大型应用结构》所示的项目结构,入口模块是 flasky.py,应用对象为该模块的 app 对象。

服务器环境:CentOS 7、nginx、Python 3.6、 PostgreSQL 10、uwsgi

准备工作

为了确保能顺利完成部署,尤其是能实现增量部署,我们从零开始创建一个项目。本部分在你自己电脑上操作。

项目

本文以大型应用结构flasky项目作为演示。为节约篇幅,本文不再将完整的项目结构进行展示,项目结构在《大型应用结构》一文中有完整的展示和说明。

第一步:创建并切换到项目目录

mkdir flasky
cd flasky

第二步:创建 .gitignore 文件

vim .gitingore
# notepad .gitingore # windows

输入以下内容并保存:

.idea
__pycache__
venv

第三步:初始化 git 仓库

git init

第四步:创建其它文件和目录

按《大型应用结构》所示的结构创建其它文件和目录

第五步:提交 git

git add .
git commit -am '第一次提交'

第六步:添加并推送到远程 git 仓库

假设在 github 上创建了一个 flasky 仓库,我们需要把项目推送到该仓库

git remote add origin https://github.com/wrdll/flasky.git # 换成你自己的仓库地址
git push -u origin master

环境

对于开发环境而言,需要安装 Python 3.6。如果你使用了数据库,还要安装数据库服务器和对应的数据库驱动。

第一步:创建虚拟环境

python3.6 -m venv venv
# python -m venv venv # 如果你电脑上只有一个 python 3.6 直接用这个命令,通常windows就是如此

第二步:激活虚拟环境

source venv/bin/activate
# venv\Scripts\activate # windows

第三步:安装所需的包

pip install flask flask-sqlalchemy flask-wtf flask-login flask-migrate psycopg2-binary

第四步:导出所有安装的包

pip freeze > requirements.txt

第五步:提交到git

git add .
git commit -am '环境'
git push origin master

开发

根据项目需求进行开发。别忘了提交并推送到远程 git 仓库。

部署

开发完毕后,就可以部署到服务器上了。本部分在远程服务器上操作。

环境搭建

请确保服务器上已经安装好了 Python 3.6、nginx 和数据库服务(比如 PostgreSQL)。你可以使用 lnpp 一键安装包来快速安装。

项目目录

我们把项目放在 /var/www/flasky 目录下:

cd /var/www

git 拉取代码

git pull https://github.com/wrdll/flasky.git # 换成你自己的仓库地址
cd /var/www/flasky

虚拟环境

python3.6m -m venv venv
source venv/bin/activate

安装包

pip install -r requirments.txt

环境变量

Flask 需要设置 FLASK_APP 环境变量:

export FLASK_APP=flasky.py

Flask 1.0 还可以设置 FLASK_ENV 环境变量,由于我们的项目依照的《大型应用结构》是在 Flask 0.12 开发的,所以我们沿用该文来设置 FLASK_CONFIG 环境变量:

export FLASK_CONFIG=production

数据库迁移

如果涉及数据库操作,我们需要对数据库进行迁移:

flask db upgrade

注意,在此之前,你需要在数据库服务中创建该项目对应的数据库和用户。

部署时的数据库迁移,只需要运行 flask db upgrade

警告!不要在部署时运行 flask db initflask db migrate

uwsgi

安装 uwsgi

我们的 Flask 应用运行在 uwsgi 上,需要进行安装:

pip install uwsgi

配置 uwsgi

vi uwsgi.ini

输入以下内容:

[uwsgi]
chdir=/var/www/flasky
home=%(chdir)/venv
module=flasky
callable=app
master=true
processes=2
socket=%(chdir)/flasky.sock
chmod-socket=666
logfile-chmod=644
daemonize=%(chdir)/flasky.log
uid=nginx
gid=nginx
procname-prefix-spaced=flasky
参数 说明
chdir 工作目录,即 Flask 项目所在的目录。本例为 /var/www/flasky
home Python 虚拟环境目录。本例为 /var/www/flasky/venv。由于我们的虚拟目录位于工作目录里,可以用 %(chdir)(工作目录) 变量简化
module 入口模块。本例为 flasky,对应 /var/www/flasky/flasky.py
callable 对于 Flask 而言,就是 Flask 的应用对象,本例为 app
socket 指定本项目的 unix socket,以便于和其它进程(如 nginx)进行通讯
uid, gid 指定运行 uwsgi 的用户和用户组

modulecallable 共同指向了 Flask 应用对象:/var/www/flasky/flasky.py 里的 app 对象。

改变目录所有者

chown -R nginx:nginx /var/www/flasky

运行 uwsgi

uwsgi -c uwsgi.ini

使用 nginx 进行反向代理

nginx 主配置文件

vi /etc/nginx/nginx.conf

在该文件的 http 中加入:

include /etc/nginx/server/*.conf;

创建虚拟主机配置文件目录

mkdir -p /etc/nginx/server

创建本项目的配置文件

vi /etc/nginx/server/flasky.conf

输入以下内容:

server {
    listen 80;
    server_name flasky.wrdll.com; # 改成你自己的域名

    location / {
                try_files $uri @flasky;
        }
        location @flasky {
                include /etc/nginx/uwsgi_params;
                uwsgi_pass unix:/var/www/flaksy/flasky.sock; # 指向 uwsgi.ini 里的 `socket` 配置项
        }
}

测试并重启 nginx

nginx -t
nginx -s reload

更新

有两种更新方式:全量更新和增量更新。本部分在远程服务器上操作。

全量更新

首先,不推荐使用该方法!这种方法很简单粗暴:将 /var/www/flasky 删除:

rm -rf /var/www/flasky

然后重复【部署】一节所述的过程。

注意:全量更新将可能导致用户上传的文件(头像、图片、附件等)丢失——如果你的上传文件保存在 Flask 的 static 目录下或项目目录的其它子目录下。进行全量更新之前,请先备份。

增量更新

利用 git 可以很容易实现增量更新

cd /var/www/flasky

第一步:从 git 拉取 最新代码

git pull

第二步:激活虚拟环境

source venv/venv/activate

第三步:安装新增的包

如果没有新增的 Python 包,跳过此步骤

pip install -r requirements.txt

第四步:设置环境变量

export FLASK_APP=flasky.py
export FLASK_CONFIG=production

第五步:数据库迁移

如果数据表没有改变,跳过此步骤。

flask db upgrade

第六步:修改目录所有者

chown -R nginx:nginx /var/www/flasky

第七步:重启 uwsgi

我们需要通过 kill -HUP 来重启 uwsgi

7.1 找到该项目的 uwsgi 的主进程id

ps aux|grep flasky|grep master

注意:命令中的 flaskyuwsgi.ini 中配置的:procname-prefix-spaced=flasky,不同的项目需要用不同的名字。

结果:

[[email protected] ~]# ps aux|grep wrdll|grep master
nginx      2970  0.0  4.0 294816 41492 ?        S    Mar18   4:09 wrdll uWSGI master

注意:此命令的结果在不同机器上、不同时间是不同的。

结果中的 2970 就是该项目 uwsgi 的主进程 ID

7.2 重启 uwsgi

找到主进程id之后,通过 kill 命令对其进行重启:

kill -HUP 2970

第八步:重启 nginx

此步骤可选。如果重启 uwsgi 之后,flask 应用没有更新,可尝试此步骤。

nginx -s reload

注意:增量更新成功的关键在于 .gitignore 的配置是否正确。如果该文件配置错误,很可能发生 git 冲突,导致增量更新失败。如果你很不幸遇到这种情况,只能全量更新,并修改你的 .gitignore 文件。

flask CentOS CentOS 7 uwsgi nginx PostgreSQL 2018-06-18 14:50 10109641