将Flask后端项目部署到云服务器上(部署过程以及踩过的坑)
记录一下我的部署过程,其中包含参考其他博主的内容,仅供大家参考。
服务器
我使用的是阿里云服务器,安全配置组里配置好使用的端口号。
项目准备
项目上传之前记得要修改一下启动ip
部署到服务器上想要开放访问,需要将IP设置为0.0.0.0
if __name__ == "__main__":
# webapp.run(debug = True,port=81)
webapp.run(debug = True,host= '0.0.0.0', port = 81)
还要修改一下数据库的配置,配置为服务器上的数据库。
安装python环境
如果你需要的依赖中也包括mysqlclient,pandas的话,建议先看一下我的这篇记录:
链接: Linux下ModuleNotFoundError: No module named ‘_ctypes’以及ModuleNotFoundError: No module named ‘_bz2‘
-
python官网:https://www.python.org/
下载你所需要得到python版本的Source code -
将下载好的python包传输到服务器上,这里我使用的是Xftp,放在了/usr/local 目录下
进行解压tar -Jxvf Python-3.7.8.tar.xz -C /usr/local
-
解压得到源码后进行安装:
切换至解压后的python主目录
执行命令:cd /usr/local/Python-3.7.8/
-
在python主目录Python-3.7.8下
执行以下命令配置python:
./configure --prefix=/usr/local/Python-3.7.8
(其中–prefix是指定python的安装路径) -
编译安装python
执行命令:
make && make install
-
完成后执行
python -V
,应该显示python: command not found
因为此时还没有配置软连接(类似windows下环境变量)
执行命令配置软连接:
ln -s /usr/local/Python-3.7.8/bin/python3.7 /usr/bin/python
然后再执行python -V
即可成功看到Python 3.7.8
参考文章链接:https://blog.csdn.net/smilehappiness/article/details/117337943
安装python虚拟环境
-
在
usr/local/Python-3.7.8/bin
下安装虚拟环境
执行命令:
pip3 install virtualenv
方便操作添加软连接:
ln -sv /usr/local/Python-3.7.8/bin/virtualenv /usr/bin/virtualenv
-
创建虚拟环境 /opt/project/python
执行命令:
virtualenv -p /usr/local/Python-3.7.8/bin/python3.7 /opt/project/python/oilblending
这里要注意:创建虚拟环境后,其采用的python版本不是系统全局的python而是独立的python,所以要注意在-p后指定你需要的python版本! -
切换到虚拟环境所在的目录
执行命令:cd /opt/project/python/oilblending
-
启用虚拟环境
执行命令:source ./bin/activate
-
更换国内镜像源
使用命令:cd /root/.pip && vim ./pip.conf
## Note, this file is written by cloud-init on first boot of an instance
## modifications made here will not survive a re-bundle.
[global]
index-url=http://mirrors.aliyun.com/pypi/simple/
#index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com
#trusted-host=https://pypi.tuna.tsinghua.edu.cn
更改后ESC退出编辑,并输入:wq
保存。
- 安装依赖清单里的库
执行命令:
pip3 install -r /opt/project/python/oilblending/requirements.txt
这里一定要注意在虚拟环境中安装,不然会安装到外面全局的python库里。 - 列出当前虚拟环境所安装的依赖库
执行命令:pip3 list
- 在指定环境下完成任务后关闭虚拟环境
在虚拟环境下执行命令:deactivate
如果仍有部分包版本不匹配,可以在项目中下载依赖的离线包,然后上传到服务器进行安装。
pip download -r ./requirements.txt -d ./dependencies
把离线包上传到服务器后,使用下列命令安装依赖包:
pip3 install --no-index --find-links=./dependencies -r requirements.txt
其中,–find-links指定的是包文件的存放地址,-r指定的是txt文件的位置。
参考文章链接:https://blog.csdn.net/smilehappiness/article/details/117337943
安装并配置uwsgi
启动方式是flask自带的app.run(host="0.0.0.0", port=81)
只适用于开发模式,因为它是单线程的,生产环境影响性能,替代方案是可以用uWSGI管理。
-
我安装到了虚拟环境中,所以先进入虚拟环境
source activate
(不在activate所在目录的话需要配置软连接)
然后执行命令:pip3 install uwsgi
进行安装 -
之后要对uwsgi进行配置
创建一个配置文件 xxxx.ini
[uwsgi]
socket=0.0.0.0:81
chdir=/usr/flaskapp/productionProcess
wsgi-file=app.py
callable=webapp
processes=4
threads=2
master=True
daemonize=uwsgi.log
pidfile=uwsgi.pid
buffer-size=65536
转一下别的博主的补充
1-通信接口:
socket=:8080 -- socket通信速度比http快
http=:8080 -- 官方不推荐使用
http-socket=:8888 -- 一般使用这个
2-项目目录(启动文件所在位置)
chdir=
3-项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=test.py
4-callable的对象就是一个wsgi接口,如Flask中的app,是flask独有的配置项
(django不需要)
callable = WSGIHandler
5-指定启动的工作进程数
processes=4
6-指定工作进程中的线程数
threads=2
7-启动一个master主进程来管理其他进程,建议启动这个进程,在管理的时候
比较方便;如果kill这个master进程,相当于关闭所有的uwsgi进程。
master=True
8-使进程在后台运行,并将日志打到指定的日志文件或者udp服务器
daemonize = uwsgi.log
9-不记录request日志,只记录错误日志
disable-logging = true
10-保存启动之后主进程的pid(保存在uwsgi.pid文件中),防止运行多余程序
pidfile=uwsgi.pid
11-一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,
并且当前处理这个请求的工作进程会被回收再利用(即重启)
harakiri = 60
12-为每个工作进程设置请求数的上限。当一个工作进程处理的请求数达到这个值,
那么该工作进程就会被回收重用(重启)。
max-requests = 5000
13-这个配置会使在平滑地重启工作子进程中,如果工作进程结束时间超过了
8秒就会被强行结束(忽略之前已经接收到的请求而直接结束)
reload-mercy = 8
14-uwsgi不建议使用root权限去启动uwsgi实例。
可以通过root用户去运行uwsgi文件,当通过uid和gid去修改用户(移除root权限)
uid=1000
gid=1000
15-buffer-size用于uwsgi包解析的内部缓存区大小,默认是4k。这个值可以设置到64k
用于解决报头过大的错误
buffer-size=65536
16-由于GIL的存在,uwsgi默认不支持多线程,不对GIL进行初始化。
但如果希望程序中的线程发挥作用,需要加入
enable-threads=True
原文链接:https://blog.csdn.net/SiShen654/article/details/109103116
- 配置好以后执行以下命令启动:
uwsgi --ini xxxx.ini
注意启动时要移动到该文件所在处,不然会报错。 - 执行下列命令查看进程:
ps -ef | grep uwsgi
- 执行以下命令关闭:
uwsgi --stop uwsgi.pid
访问项目
uwsgi配置好,并且启动好后,访问你的服务器公网IP即可访问项目
http://47.xxx.xxx.210:81/python/hello