在我们开发好项目,测试完成后,要部署上线。许多用户可能在用宝塔面板作为服务器运维工具,那么在宝塔上该如何部署Flask项目呢?
一、项目准备
进入你项目的根目录,使用 pip freeze >requirements.txt
导出项目依赖,并对项目进行打包,上传至你的服务器目录。
二、宝塔环境准备
在宝塔应用商店中搜索 Python项目管理器 并安装:
三、线上部署
安装完毕后点击设置:
在设置界面,点击版本管理,安装项目所需要的Python版本:
点击项目管理——>添加项目:
如图所示:
注:至于启动方式,会在后边的文章中进行详解。
点击确定直到添加完毕,初始部署完毕。
四、域名映射
我们需要为我们的项目添加一个域名,服务于我们的Flask项目,在宝塔中添加网站:
注意:在PHP版本中选择纯静态
回到项目列表,在相应项目中点击映射,输入我们刚才添加的域名即可!
五、Nginx反向代理
Gunicorn这类WSGI服务服务器内置了web服务器,所以我们不需要web服务器也能与客户端进行交互,处理请求与响应。但是内置的web服务器依然不够强健,因此我们需要为我们的项目穿上一件棉袄,让它能够抵御更烈的严寒。而流行的开源web服务器Nginx就是不二之选。
在这种模式下,Nginx作为代理服务器,监听来自外部80端口的请求;而Gunicorn负责监听本地8000端口的请求(Gunicorn默认端口8000)。Nginx会把来自外部的请求转发给Gunicorn处理,接收到响应后再转发给客户端。这样做的好处有:
- 提高静态文件的处理效率。Nginx处理静态文件的速度非常快,而且可以对静态文件设置缓存。
- 提高安全系数。避免WSGI服务器直接暴露出来,且可以作为防火墙来抵御攻击。
- 提高程序处理能力。设置反向代理可以缓冲请求,对请求进行预处理,交给WSGI一个完整的HTTP请求,还可以设置负载均衡,优化效率。
Nginx配置:
server
{
listen 80;
server_name api.3xittec.cn;# 映射域名写在这里
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/api.3xittec.cn;
access_log /www/wwwlogs/api.3xittec.cn.log;
server
{
listen 80;
server_name api.3xittec.cn;# 映射域名写在这里
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/api.3xittec.cn;
location /static {
alias ;#静态文件地址
expires 30d;缓存过期时间
error_log off;
}
location / {
proxy_pass http://localhost:8000;#转发的地址,即Gunicorn运行的地址
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 5M;
}
access_log /www/wwwlogs/api.3xittec.cn.log;
error_log /www/wwwlogs/api.3xittec.cn.error.log;
}
更新完配置后,重启Nginx即可生效。
六、Supervisor护花使者
在前边我们已经用Gunicorn来运行项目,但这并不靠谱。我们需要一个工具来自动在后台运行它,同时监控它的运行状况,并在系统出错或重启时自动重启程序。那么Supervisor这个护花使者,充当这个角色,来呵护我们的项目。最终部署架构图:
那么这个护花使者该在哪安装呢,还是在宝塔应用商店搜索Python即可安装。成功后即可点击设置>添加进程:
配置项解释:
- 名称:用户自己定义的名称,做到顾名思义。
- 启动用户:设置启动该程序的用户,默认为root即可。
- 运行目录:当前项目的根目录。
- 启动命令:项目虚拟环境bin文件夹下的gunicorn文件+-w 4 wsgi:app
最后点击确定即可!至此宝塔面板部署教程结束!
本人菜鸟想问下,我的 flask 项目 中没有使用 处理并发的相关代码,部署到 宝塔后使用 gunicorn 启动,能提高 并发吗?
@三六九 可以的,但是实际到Flask的时候也是排队处理的
那如果 启动 flask 时在app.run中 设置 thread=True 代码需要改动吗?是不是直接可以就提高并发了呢?
宝塔这么方便? 收费不
测试