文章目录
- 前言
- 1. 在云服务器上安装mysql数据库
- 2. 准备云上的flask环境
- 3. 将项目部署到 gunicorn 上
- 4. 部署到Nginx
- 参考资料
前言
本文是一篇flask项目部署的入门教程,记录了在阿里云上从数据库的安装到最终项目的部署的全过程以及过程中遇到的一些问题。参考的资料在本文的最下面,在过程中有使用到也会把链接附在旁边。内容相对独立可以跳看需要的部分。
1. 在云服务器上安装mysql数据库
在云服务器上mysql的使用和本地的区别只在于要提供外部访问的账号和接口
安装的方法一般有两种一种是去官网上下载tar.gz压缩包来安装,一种是通过包管理工具,ubuntu用的包管理工具是apt 压缩包是手动配置更加灵活但是步骤繁琐一些,而包管理工具则更加简便并且在安装中能解决包依赖的问题,这里以apt工具为例子
- 使用apt-get进行更新
这个更新操作主要是更新软件包列表中包的版本也就是确保能下到最新的软件包
apt-get update
- 安装mysql
apt-get install mysql-server
- 安装完之后会自动启动mysql服务,检查下是否正常启动
systemctl status mysql
systemctl 是linux系统管理服务的一种方式,systemctl命令的格式是systemctl [command] [unit],这里status 是查看状态的命令 mysql是相应的我们要操作的unit。一些常见的命令可以参考systemctl 详细解释 显示running就是成功了
- 设置mysql的根密码
mysql_secure_installation
一开始会让你选择是否设置密码验证,就是要求你的密码达到一定的安全等级不然不让你设置建议不要
密码输入完成后它会有很多选项,处理询问是否禁止远程root登录选择n其他无特别要求都选择y即可。
- 创建一个用来外部访问的用户
用根账号进入mysql
输入以下指令
创建用户
Create user 用户名
授权
GRANT ALL PRIVILEGES ON *.* TO 用户@”%” IDENTIFIED BY ‘密码’
Note:这里用户后面的“”里百分号表示 全部ip可以访问,可以指定特定的也可以用localhost仅本机可以访问
刷新使权限生效
flush privileges
- 开放3306端口使得外部可以访问mysql服务器
刚才只是创建了一个拥有被任何ip远程登录的用户而我们服务器的ip端口此时还未对外开放。
可以输入相应的命令查看
ss -tlnp
3306是mysql的默认端口可以看到这个端口只对本机开放,如果不改掉就会出现2003的错误。修改mysql的配置文件来开放这个端口(我的配置文件是mysql/mysql.conf.d/mysqld.cnf,我看网上的教程很多说的都是my.cnf 大家如果没找到可以在mysql目录下的cnf文件里都找找)
打开 配置文件,将 bind-address =127.0.0.1 改为 0.0.0.0
vi /etc/mysql/mysql.conf.d/ mysqld.cnf
Note:还要去云服务器的防火墙那里开始端口
- 使用相应的工具测试下mysql的连接
我用的是navicat来作为操作数据库的工具,创建一个mysql连接输入ip 端口以及账号密码并且点击连接测试,查看连接情况。
2. 准备云上的flask环境
- 吧flask项目从本机拷贝到云服务器
接着把自己的flask项目文件拷贝到云服务器上,注意如果本机不是linux系统的请把虚拟环境的文件夹删除再传,传文件可以用winscp或者别的ftp服务器。这个网上教程很多这里就不多赘述了。 - 安装项目的虚拟环境,安装包
安装虚拟环境的方法有挺多可以用第三方的virtualenv也可以用py3自带的venv
这里使用的是venv,具体命令如下:
Python3 -m venv 虚拟环境地址
虚拟环境地址下:
Source 虚拟环境/bin/activate
3. 将项目部署到 gunicorn 上
由于 flask自带的web server Werkzeug 太弱了不适合生产环境所以一般会使用第三方的webserver gunican就是这样的一个web应用服务器相类似的还有uswgi 相比之下gunican的配置会更加容易一些
- 安装 gunicorn
在虚拟环境下执行以下命令
Pip install gunicorn
- 在app入口文件所在目录下输入以下指令,开启 gunicorn
gunicorn -D -w 4 -b 0.0.0.0:8000 main:app
-D 是后台运行 -w worker的数目,
–bind 为主机地址和端口
0.0.0.0 是广播地址 指定这个地址任意ip都能访问到项目
127.0.0.1 是本机地址 只能本机访问
main 是 flask项目启动入口的.py文件的名字 app是里面的flask实例对象
以我自己的一个项目demo的文件为例
指令为 gunicorn -w 4 -b 0.0.0.0:8000 manage:app
Note:和mysql一样要开启防火墙端口 外部才能访问,我这里的端口是8000
4. 部署到Nginx
光gunicorn一个后端服务器即可实现flask项目的部署了,但是后端服务器不太擅长处理请求,为了提高请求能力可以再添加一个nginx,nginx服务器一般负责请求分发(负载均衡)和处理静态文件的请求
- 安装nginx
sudo apt-get install nginx
安装完成后 nginx的文件默认安装在 etc下(阿里云服务器用apt的默认安装目录都是etc下
2. 配置
Nginx有好几个配置文件,最后内容都会汇总填充在nginx.conf
让我们打开nginx.conf看下都有哪些配置
- 执行打开命令
Sudo vi nginx.conf
其中 virtual Host configs 就是我们想要配置的分发服务器相关的信息
其中 conf.d/ 下的config是用户指定的目录,我们可以吧我们的配置添加在这个目录下
- 添加配置文件
看完之后接下来我们需要添加我们要分发的配置,在cong.d目录下创建一个config文件,这里我创建了一个叫default的文件
cd /etc/nginx/cong.d
sudo vi default.config
Note:如果出现吧配置内容写好输入保存的时候报错can’t writing 是因为这个文件夹都还没有就直接创建文件导致得
- 在配置文件中添加server块
server {
listen 8082;
server_name 47.100.77.195; #可以用服务器的ip当名字
location / {
proxy_pass http://0.0.0.0:8000;
}
}
Listen: 表示监听的端口
Server_name:表示服务器的名称
Location 表示 分发相关的配置,proxy_pass 后面的地址就是我们之前配置的gunicorn()
3. 启动 nginx 服务器
systemctl start nginx
同样需要在防火墙那里开启云服务器的端口,nginx默认使用的是80端口
查看启动情况
在本机输入服务器的ip
当看到这个页面的时候说明nginx服务器已经可以访问了
接着直接 ip+指定的nginx的端口+url后缀就可以访问自己的项目
比如上面我指定的地址
就是47.100.77.195:8082/
Note:
1.可能会遇到用指定的端口出现502网关错误而用80端口访问正常说明nginx服务器正常,而问题出在转发的时候这个url不对。在这里这个502是由于该url下没有对应视图函数产生的相当于你在本机使用服务器出现url找不到一样
参考资料
- gunicorn的安装
- nginx安装的详解
- systemctl 详细解释