欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Flask+Gunicorn+Nginx完整部署过程

程序员文章站 2022-06-11 14:36:04
...

描述

flask部署环境包括:centos7,nginx,python,gunicorn,mysql,redis(,mongodb)

准备项目

输出项目库列表

在开发环境开发flask项目后
在cmd或者shell,进入项目根目录运行

pip freeze -r requirements.txt

将项目所需要的库列表输出到文件 requirements.txt

备份数据库

将开发环境的数据库备份成sql,或者是使用数据库迁移也可以
备份数据库可以用的工具有 phpstudy,mysqldump
备份出来的.sql文件后面会用到

准备服务器环境

安装宝塔面板

服务器环境使用 宝塔面板 安装
在这里我使用的系统是centos7
在服务器执行以下shell命令安装 宝塔面板6.9

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && bash install.sh

安装后访问 http://服务器ip:8888 进入宝塔面板 ,有的宝塔版本会要求访问地址后面加上特定的**,具体请看安装后shell界面的提示
宝塔面板需要服务器安全组开放 8888端口,如果进入不了宝塔面板多半是端口没有开
**如果以上命令失效了,去宝塔面板官网安装一个linux免费版
**安装过程出现类似超时或者ssl的问题请自行百度

使用宝塔面板安装nginx,mysql,redis,mongodb

服务器、软件安装

进入宝塔面板-软件管理,点击安装nginx(默认版本),mysql(根据项目使用的版本,或者5.7),redis(默认版本),mongodb(默认版本)
mysql,redis,mongodb三个数据库视你的项目是否有使用到,没使用到则不安装

关系数据库一般使用mysql,pgsql,sqlite,前面2个都可以在宝塔面板进行安装,第三个不用安装

缓存数据库memcache、redis均可在宝塔面板安装
文档数据库mongodb可在宝塔面板安装

作为linux服务器的软件管理工具来说,宝塔面板挺棒的。但作为运维工具的话,还是有很大进步空间的

** 细心的人会发现宝塔面板-软件管理里有个 python 项目管理 ,可以安装python和启动python web项目,但大家不要用,这个功能暂时用不了,遍地是坑,等以后稳定了再做线上测试。如果你想尝试也可以,但在这里安装python的时间极长,而且安装了你也没办法使用,还会影响后面步骤的python安装

nginx 设置

在宝塔面板-文件管理 处,到目录
/www/server/panel/vhost/nginx/
新增文件 project1.conf,这里project1改成你项目的名称,不要用中文
文件内容

server
{
    listen 80;
    server_name domain.com # 这是HOST机器的外部域名,用地址也行

    location / {
        proxy_pass http://127.0.0.1:8080; # 这里是指向 gunicorn host 的服务地址
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

然后保存,在面板重启nginx,这里80是网站外部的服务器端口

mysql数据库设置

在 宝塔面板-数据库 处新建一个数据库,这里只能建立和管理mysql数据库,数据库名和密码改成你的项目的数据库名和密码就行了
这里需要注意的是 数据库管理的界面上方有个root密码,如果你的项目里mysql 使用用户是root的话,需要将这个密码也改成 你的密码
然后 如果在项目准备环节你有备份.sql文件的话, 在这里导入到这个新建的数据库中

其他数据库设置

redis,mongodb 使用默认配置,如果你有使用其他端口的话在配置里改端口然后重启即可,redis默认端口6379,mongodb默认端口27017

这里有一个redis的坑,redis默认持久化方案(将内存数据备份到硬盘中)在网站高并发时会严重拖后腿,秒并发1k以下可以不用管
配置中有两个位置
第一处:

save 900 1
save 300 10
save 60 10000

表示如果
每900秒中有1次数据写入则会将内存数据写入到硬盘中
每300秒中有10次数据写入则会将内存数据写入到硬盘中
每60秒中有10000次数据写入则会将内存数据写入到硬盘中
将后面二个注释掉,保留第一个即可

save 900 1
# save 300 10
# save 60 10000

第二处:
找到类似的代码,改成以下配置,即三选一。第一个是最安全的,但是对性能影响很大,第二个是默认配置,第三个是最高性能但是没有安全性

# appendfsync always
appendfsync everysec
# appendfsync no

python环境搭建

python这里使用的是python3.7
不要使用宝塔面板的python项目管理安装python,原因前面有说。这里推荐使用miniconda进行安装,如果你有在宝塔面板的python项目管理安装python3.7,请删除版本后再进行安装。

miniconda 安装shell 命令:

cd ~ && wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && sh Miniconda3-latest-Linux-x86_64.sh

以上命令如果失效,请到 miniconda 官网自行下载最新版miniconda Linux 64-bit (bash installer),并上传到服务器然后执行
安装后 miniconda的目录应为 /root/miniconda3

执行conda list 检测是否安装成功,如果出现conda 命令不存在的话,是环境变量的设置问题
执行以下shell命令

 export PATH=$PATH:/root/miniconda3/bin

在这里,/root/miniconda3/bin 应替换成你的miniconda3的安装目录,我的目录就是这个所以不用更换。

接着创建 python 环境
执行命令:

conda create -n project1 python=3.7

将project1换成你项目的名称
要进入 创建的python环境 执行

conda activate project1

退出则是

conda deactivate

上传项目

使用 winscp或者其他ftp文件管理软件,将项目上传到服务器目录/www/wwwroot/下
这里需要注意的是,如果你是使用pycharm开发的项目,一般项目目录里有个venv文件夹,不要上传这个,其他的都可以上传,这个是开发环境的容器文件夹,不需要上传。

安装项目所需库

进入 项目目录

cd /www/wwwroot/project1

进入 python环境

conda activate project1

安装requiremens.txt文件中的库依赖

pip install -r requiremens.txt

如果网速太慢,可以换清华的镜像,执行命令

pip install -r requiremens.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

如果有哪个库安装不了,可能是版本问题,编辑requirements.txt,将有问题的库先删了,最后再用pip单独安装那个库

最后单独安装gunicorn库

pip install gunicorn

为什么要在服务器单独安装 gunicorn库呢?因为我的开发环境是windows,gunicorn是多进程库,不支持windows,因此我需要在linux上单独安装gunicorn库。

配置gunicorn项目到系统服务中

设置到系统服务可以使项目像系统服务般 启动和关闭
进入服务器目录 /etc/systemd/system/
新建一个文件叫 project1.service
文件内容:

[Unit]
Description=my project1

[Service]
User=root
Type=forking
WorkingDirectory=/www/wwwroot/project1
ExecStart=/root/miniconda3/envs/project1/bin/gunicorn -w 3 -b 127.0.0.1:8080 manage:app
Restart=on-failure

[Install]
WantedBy=multi-user.target

WorkingDirectory=/www/wwwroot/project1
这句是配置项目的目录
ExecStart=/root/miniconda3/envs/project1/bin/gunicorn -w 3 -b 127.0.0.1:8080
这句是配置gunicorn的启动设置,其中
/root/miniconda3 是miniconda的安装目录
/project1 是创建的环境的名字,一般也是项目的名称
-w 3 是指 同时开启3个进程,进程数设置为 cpu核心数*2+1
127.0.0.1:8080 是指gunicorn的端口为8080,这里应该和nginx中的projec1.conf配置中的端口保持一致
manage:app 是指项目的入口文件,我这个项目的入口文件是manage.py,文件中的flask应用实例是app,如果你的入口文件是app.py的话,这里应改成app:app

启动项目

在服务器shell执行

systemctl start project1.service

在浏览器中输入你的域名或者ip地址,成功访问就算可以了。

停止项目

在服务器shell执行

systemctl stop project1.service