Flask框架部署:阿里云CentOS操作系统
写在前面一. 部署前的准备1. 一个已在开发环境中完成的Flask项目1)关于依赖包2)关于环境变量2. 阿里云CentOS操作系统云服务器1)关于安全组2)基本操作二. 正式开始部署Step 1 进入宝塔面板Step 2 导入项目并运行三. 一些遇到的问题1. 基于Flask-Mail用163邮箱发邮件问题2. 退出控制台项目自动停止问题四. 说明写在前面
我使用的Flask框架结构与米格尔·格林贝格所著《Flask Web开发》(即狗书)一书中讲解一致;项目使用的数据库也是书中使用的SQLite,因此在后续配置中不需安装mySQL;个人认为上述书籍是Flask框架极好的入门教材,全书带领读者完成一个博客项目实例,讲解清晰,有趣味性,并且可以从github上跟随书中讲解进度检出各个版本的源代码。特此推荐~一. 部署前的准备
1. 一个已在开发环境中完成的Flask项目
1)关于依赖包
项目文件夹的顶级应当有requirements.txt文件(固定命名),其中记录了项目的所有依赖包及其精确的版本号。后面部署的时候系统会根据这一文件自动按照依赖包;
requirements.txt文件可以在开发环境中自动生成,使用命令:
(venv)$ pip freeze >requirements.txt
上图可以看到,该命令需要激活虚拟环境后执行。具体激活方法:
a)命令行进入你项目使用的虚拟环境文件夹(一般是venv)的父文件夹
b)Linux或macOS操作系统运行
bash$ source venv/bin/activate
Windows系统运行
bash$ venv\Scripts\activate
2)关于环境变量
项目中会用到一些类似“管理员邮箱”、“为用户发送确认信息的邮箱”、“为用户发送确认信息邮箱的密码”等私人的、需要高度保密的信息。这些信息在程序中通常利用os.environ.get('环境变量名')
方法从环境变量中读取。我们在部署前可以将所有需要写入的环境变量准备好,方便后续操作。
2. 阿里云CentOS操作系统云服务器
1)关于安全组
运行了云服务器实例之后,在云服务器管理控制台可以修改安全组配置规则(上图中红色方框),进入后选择“添加安全组规则”(用来指定开放端口),出现如下界面:
图中红色方框指示的内容是需要我们填写的。如果你想打开服务器的465端口,需要在端口范围处填写“465/465”,授权对象都填“0.0.0.0/0”即可。
一定要打开的端口有:
80、443、22、465、8888.
2)基本操作
点击上图标注的实例名,进入如下界面:
这里选择“远程连接”,连接到服务器的CentOS终端操作界面:
进入终端后的第一件事是进行系统升级。执行如下命令:
[root@你的云服务器实例名称 ~]# yum update
开始自动升级,期间要输入一次’y’,确认升级。
二. 正式开始部署
Step 1 进入宝塔面板
请读者前往如下网址:
/download/linux.html
找到下图部分,并复制下图指出的命令,前往刚刚打开的服务器CentOS终端操作界面运行。
只需选择一次’y’,即可开始自动化安装
到这里安装成功,会获得上述图片展示的四项基本信息,注意保留好!
浏览器访问上面拿到的“外网面板地址”,输入username、password完成登录。
进入后会看到下图(作者已经做过了推荐环节,系统不会再为我弹出这个对话框,这里我去网上找了一张图来说明)
我们的程序使用Python开发,所以选择LNMP一侧的内容安装。前面提到,我使用SQLite数据库,而SQLite在CentOS中自带,因此不需额外安装。注意安装方式要选择“编译安装”!
之后,去“软件商店”搜索、下载Python项目管理器,如下图所示:
Step 2 导入项目并运行
进入宝塔Linix面板
进入“文件”,找一个位置,建立一个专门用于存放项目的文件夹(这里可以随意存放,只要自己找得到就可以)。
如下图所示,我在根目录下建立了XXX_PROJECTS文件夹,用于存放上传到服务器中的所有项目。
从面板进入服务器中刚刚建立的文件夹,从本地上传项目文件夹,操作界面如下图所示:
之后去“软件商店”找到刚刚下载好的Python项目管理器,选择设置。
tip: 为了之后操作方便,可以选择“首页显示”,这样可以在首页显示快速入口。
选择“设置”后,进入添加项目界面,选择“添加项目”,出现如下设置界面:
项目名称可以随便起(英文),路径选择刚才项目文件夹在服务器中的位置,Python版本选择项目开发时使用的即可。框架选择flask,配套地,启动方式要选择gunicorn。启动文件为项目的入口文件,一般是运行app.run()
语句的文件。
说明:最好在入口文件的末尾写如下启动程序的语句,方便后续操作:
if __name__ == '__main__':app.run()
我们继续填写设置。端口一定要写!!!
Flask框架的程序默认本地运行在5000端口,因此如果在app.run()
方法中没有特殊配置,这里的端口就填5000.
下面的两个勾选项一定都要选!!!
点击确认,会自动安装项目所需的依赖包,前提是之前在项目文件中加入了requirements.txt这一顶层文件。再次强调:文件名是固定的!
经过一小段时间的安装,项目的虚拟环境会自动建立,自动命名为项目名_venv并且装好了全部依赖包。
这时,在Python项目管理器中可以看到刚刚添加的项目,点击“映射”,填写你申请的域名(如有)。如果没有申请域名也没有关系,阿里云提供的公网IP也是支持的,只是之后访问网站的时候需要直接通过IP地址访问。
此时,可以在“网站”栏中看到Python项目管理器为我们建立的映射。但我们发现,其中显示的项目根目录与我们刚刚设置的不同。
这里显示的根目录是默认值,我们需要把它改成我们项目所在的位置(与刚才添加项目时选择的项目路径相同)。
具体方法为点击“设置”,进入如下界面,在“网站目录”中把网站目录改为项目所在位置,运行目录选择’/'即可。
改完项目路径,再一次进入Python项目管理器,开启项目(“状态”栏应显示“运行中”)。
现在,距离部署结束只剩最后一步:
在服务器终端中cd
进入项目所在路径,用bash$ source 项目名_venv/bin/activate
命令激活虚拟环境。
首先进行一些常规的配置,例如写入环境变量、创建数据表,等。这些配置你应当在开发时就比较熟悉。
最后,执行(test_deploy_venv) [root@你的云服务器实例名称 项目名]# nohup python3 入口文件.py >> /XXX_PROJECTS/log/flask.log 2>&1 &
说明:入口文件的名称需要改成你自己的、XXX_PROJECTS是我创建在系统根目录下的文件夹,用于存放所有项目代码、在XXX_PROJECTS中需要新建一个名为log的文件夹,这一操作在宝塔面板-文件中就可以可视化地完成。flask.log不需要自己创建。这是将会自动创建的日志文件。
这一命令会让程序在后台运行,且不会受远程连接窗口退出的影响。
如果你需要重新运行项目,就必须先把原来后台的进程停止。
可以使用ps aux
命令查看全部后台进程与对应的ID。flask项目的进程很好辨认,例如我的项目运行后的进程为:
root372355 0.1 1.1 149592 44676 pts/2 S 12:32 0:00 python3 flasky.py
372355就是这一进程的ID,可以使用kill 372355
来停止这一进程,之后就可以重新运行程序了。
部署步骤到这里已经全部结束,在浏览器中输入你绑定的域名或公网IP地址,即可成功访问!
三. 一些遇到的问题
1. 基于Flask-Mail用163邮箱发邮件问题
使用163邮箱为用户发送邮件需要在163邮箱的网页端打开POP3/SMTP服务,并拿到授权密码,如下图所示:
授权密码不同于登录密码。注意Flask-Mail库中发邮件需要用户提供的密码是授权密码。
163邮箱支持的端口为25、465,其中25端口的邮件传输不加密,465端口加密。
由于阿里云服务器不支持25端口,所以如果想发邮件必须用465端口,配置文件中需要加入如下设置。
MAIL_PORT = int(os.environ.get('MAIL_PORT', 465))MAIL_USE_SSL = True
2. 退出控制台项目自动停止问题
如果在配置的最后一步执行flask run
或python 入口文件.py
,项目也可以成功运行起来,使用服务器公网IP或你的域名同样可以访问到。但一旦你退出了到服务器的远程连接,进程就会终止。
解决方案就是按照上面步骤中的命令,在启动命令前后分别加nohup
与&
,这可以让程序运行在后台,且不受终端退出的影响。
四. 说明
本文一定程度上参考了b站的视频【Python】如何用Python搭建网站,并根据实际操作情况对其内容做了补充。这里特别鸣谢,并给出视频链接如下:
/video/BV1Wz4y1f7qV?t=4761
如有侵权请告知,我会立即删除博文。