前言
之前我在部署vue+express的前后端、数据库到服务器上的时候,用的宝塔图形化界面,非常方便,也没什么出问题(除了部署express的一点小问题)。但是我有个服务是要基于机器学习的,所以用到了简单便捷基于python的flask框架,部署这个的时候问题出现了,也是本文讨论的重点。关于
1.Vue2+Nodejs(express)+Mysql部署到服务器的全过程可以参考此链接
2.基于上链接,部署后端express时,遇到pm2 command not fonund可参考此链接
部署flask后端的问题和具体步骤(如果框架引用了机器学习算法模型也可以参考下文)
问题说明:
为了图方便,我一开始是,直接把本地的flask项目文件通过宝塔页面的文件界面拖拽上去解压,然后用如下的图形化界面进行部署的,有不少文章告诉你只要本地通过pip freeze > requirement.txt把依赖包导出来,放到如下界面的安装依赖包,它就可以自动下载,但是这么做会有个问题,就是很多包的版本不存在,下不到,但是你又不知道服务器的报错位置在哪,你以为包依赖都装了,其实没有,因此你看到的都是错误码500。所以可以按照图形化界面和终端命令结合的方式部署flask后端(python的项目大多需要这么做,环境配置相对复杂)
具体步骤:
1.本地操作(自己电脑环境)
1.1 flask解决跨域问题(若已配置跨域或非前后端分离可忽略)
若你是前后端分离的,需要注意跨域,任选其中之一的方法或者都用,都可以解决跨域
(1)方法一
(2)方法二
1.2 flask中启动服务地址的更改
我一开始用的是app.run(host=127.0.0.1, port=自己设置的端口号),将127.0.0.1改为0.0.0.0,让外网访问。如果你想在服务器上用pywsgi启动flask服务可以如下操作(没有用可忽略),注意的是地址也要改为0.0.0.0
(1)本地下载gevent:命令如下(pip用不了就用pip3):
pip install -i https://mirrors.aliyun.com/pypi/simple/ gevent
(2)在你的app.py即后端启动文件中,引入包,并输入下图框中的命令
主函数下,用pywsgi启动服务
1.3 使用pipreqs库,导出本地python项目的依赖包
(1)这里推荐下载pipreqs,这个库不同于pip freeze > requirement.txt是导出本地环境的所有包的txt文档,这样其实是浪费空间的。用pipreqs可以根据当前项目根目录导出所有用到的库。在本地终端(我是anaconda prompt)使用如下命令下载:(那个https是镜像链接,加速下载用的,pip用不了就用pip3)
pip install -i https://mirrors.aliyun.com/pypi/simple/ pipreqs
(2)在本地打开根目录的终端,输入如下命令,导出本地python项目(我这里是flask后端加上机器学习算法)用到的所有包
pipreqs ./ --encoding=utf8
我的python项目结构如下所示,可以进行参考
生成的包依赖文档
1.4 压缩项目文件备用(项目根目录下),你可以通过ftp或者宝塔界面上传到服务器
2.服务器操作(你购买的云服务器等等)
2.1 将本地项目的压缩文件上传到服务器的文件中
(1)按如下步骤上传1.4的本地项目压缩文件
(2)解压文件,该项目文件待用
2.2 服务器上安装基本的python和pip
(1)查看本地的python版本:在你本地的项目终端,输入python -V
(2)借助宝塔图形化界面,安装python指定版本(应该会附带pip,如果你是python3的版本,附带的是pip3,你在服务器如果用pip install 包名提示no command,可以用pip3 install 包名)
(3)进入终端检查是否有python和pip(或pip3)
命令行:find / -name 文件名 查找目录中包含该文件名的所有路径
命令行:python -V 查看python版本号
注意,你在这里使用python -V看到的python版本是服务器系统自带的,不用管它,因为我们是在虚拟环境中建立的flask,下载的python为指定版本的
上述内容如果无法解决python和pip下载相关问题,可以自行在csdn搜索:xxx服务器(如centos)下载python包pip包的方式即可
2.3 清除之前图形化界面部署的flask(若你从未在该服务器上部署过flask,此步可忽略)
若你之前用的是图形化界面部署过flask就是如下图所示的方式,则首先要把该项目删除(因为大概率跑不起来),在图形化界面点击python项目,点击删除即可;然后进入服务器的终端,查看进程号并删除进程(否则你后面在终端命令行重新部署会出现进程被占用,所以要把你后端服务对应端口的进程杀死)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0f9b9758718d4fe58498a75f61dc349f.png
命令行:lsof -i:端口号 查看你部署的后端服务对应的进程号(端口号就是你自己设置的后端服务端口,我得是3002,就lsof -i:3002)
命令行:kill 进程号 杀死你原先在图形化界面开启的flask服务进程
2.4 服务器上正式部署
(1)服务器终端下载python虚拟环境包(后面的部署都是在虚拟环境中完成的)
若果你使用的ubuntu服务器,可以用sudo apt install python3-venv
若你用的centos 服务器用 sudo yum install python3-venv 其他服务器不同可以上网查linux指令即可
(2)通过终端进入你的网站根目录,该目录包含前端后端的n个目录文件:用命令:cd /你的网站根目录路径即可进入,如下图所示为我的网站根目录路径/www/wwwroot/IChing20240509(为什么这里都用命令行,因为创建的是虚拟环境,flask提供的服务也是运行在服务器上的虚拟环境中的
(3)进入你的网站根目录后 ,用命令:python3 -m venv 虚拟环境的文件名,会生成相应的虚拟文件目录,如我这里就是生成了test11(这个根据你自己的python版本来,如果你是python2就用python -m venv 虚拟环境的文件名;pip也是同理,python3版本你就用pip3 install 包名,python2版本就用pip install 包名,要灵活)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/031e81bfa5904bb186c53408285c7578.png
(4)终端进入到你刚刚创建的虚拟环境目录中,cd 虚拟文件名/,我这里是cd test11/,如果你在其他的目录层级,请找到你的虚拟文件名的目录,然后cd进去。接着输入指令source bin/activate,完成虚拟环境的激活,此时你会进入到如下图划线处的状态,表示你已经完成了虚拟环境的激活
(5)将你于2.1步骤上传到网站根目录下的flask项目目录下的所有文件(我这里就是I_Ching_algorithm),复制到你刚刚创建的
虚拟环境目录中(我这里是test11),这里有个小提示,你最好是右击文件通过新标签页打开,不然终端命令行会重新进入初始界面,你又要重新cd 进入文件目录,这样你打开两个网页,一个是终端命令行,一个是基于图形化操作文件,方便一些。
(6)在终端的激活的虚拟环境目录下,我这里是test11,此时你的虚拟环境应该有一开始本地导入的那个requirement.txt,我们要在服务器上的flask虚拟环境下,安装同样的包,即环境的安装,用命令:pip3 install -r requirement.txt,此时即有可能报错,比如某个包提示没有版本,那你只能老老实实的pip3 install 包名,这个过程需要你注意,保证所有包都安装。
(7)最后一步,启动项目文件,你本地pycharm可以直接右击app.py,点运行,而服务器上你就是cd /你的启动文件目录(我的是app.py所在的目录下),然后执行指令nohup python app.py &,这里不仅仅是python app.py是因为如果不使用nohup,你的终端一关,服务就中断了,而nohup &就是保证该指令的进程持续运行,你只能通过kill 进程号把进程杀死。
(8)最后,你可以使用诸如postman等软件,测试你的后端接口是否能正常返回值,你也可以在服务器的终端看到你的flask或者其他框架的报错信息,根据报错信息调整代码即可。
总结
不要害怕指令化界面,这里几个常用指令一定要记住:
(1)下面三个方便里找文件
find / -name 文件名 ———— >查找目录中包含该文件名的所有路径
ls ———— > 查看当前目录下的所有文件
cd /目录名 ———— > 进入指定目录
(2)下面防止进程冲突
lsof -i:端口号 查看该端口号对应的进程
kill 进程号 杀死指定进程