Flask+Gunicorn+Nginx完整部署过程
Flask+Gunicorn+Nginx完整部署过程
描述
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
推荐阅读
-
微信小程序之侧边栏滑动实现过程解析(附完整源码)
-
Python实现字符型图片验证码识别完整过程详解
-
[oracle部署实施]基于centos7.5、oracle11g r2手工建库过程
-
.Net Core 之 Ubuntu 14.04 部署过程(图文详解)
-
.net 4.5部署到docker容器的完整步骤
-
在虚拟机Linux上部署DB2pureScale实践过程
-
docker部署Asp.net core应用的完整步骤
-
Azkaban3.81.x部署过程及遇到的坑
-
解析Mac OS下部署Pyhton的Django框架项目的过程
-
Qt最新版5.12.2在Win10环境静态编译安装和部署的完整过程(VS2017)