flask项目部署到阿里云

前言

上一年在学校做好了一个前后端打通的web应用,但是只是在本地上运行,没有部署到服务器。之前也没有接触过相关知识,于是跟着教程尝试部署了一下。

购买服务器

这里就略过,我选择的是阿里云云服务器ECS上Ubuntu16 64位的系统。购买完之后会有一个实例,就是我们购买好的服务器,然后第一步我们就要重置实例密码(ssh链接密码),作为接下来我们连接服务器的密码。

添加安全组

添加5000端口,添加80端口,5000是我们flask的端口,80是nginx的端口,所以都要设置好。如图:

ssh链接服务器

打开我们的cmd/powershell,输入:

1
ssh root@xx.xx.xx.xx #如:ssh root@23.187.187.12(你刚刚买的服务器的公网ip)

然后输入我们刚刚更改的实例密码,就进入到了我们的服务器。输入密码的时候不会显示字符。

更新apt源

1
sudo apt-get update #把源更新一下,保证我们用的包都是最新可兼容的

安装mongodb

1、安装

1
sudo apt-get install mongodb # apt-get 安装 mongodb

安装好后我们验证一下,如果安装不成功,就百度一下报错,大多可能是版本问题

1
2
3
4
# 默认下载完后自动启动,可以用以下命令进行验证
service mongodb status # 查看mongodb的启动状态
#或者
mongo #进入mongodb数据库验证

2、配置

验证好之后,我们要对mongodb进行配置

1
2
# 修改配置
vim /etc/mongodb.conf

vim命令可以进入到服务器的文件进行修改,这里有几个常用的vim操作

进入编辑模式:在键盘上按下字母i或者a
退出编辑模式:
    方式一:按下esc键,输入“:wq”3个英文字符,然后按下Enter键,表示保存文件并退出。
    方式二:按下esc键,输入“:q”两个英文字符,然后按下Enter键,表示不保存并退出。(如果本次编辑没有修改内容,则可以顺利退出;否则,vim编辑器是不会允许你退出的,这时如果想要不保存退出,就要使用下面的方法三)
    方式三:按下esc键,输入“:q!”3个英文字符,然后按Enter键,表示不保存并强制退出。

参考:vim操作

于是我们进入到文件之后按下a/i,把文件中的配置信息改成如下(注意有的配置项已存在,直接更改不要全部复制粘贴):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
... ...
#dbpath=/home/ctr_temp/data_base_temp/mongodb/data
dbpath=/var/lib/mongodb

#where to log
#logpath=/home/ctr_temp/data_base_temp/mongodb/log/mongodb.log
logpath=/var/log/mongodb/mongodb.log

logappend=true

# bind_ip = 127.0.0.1
bind_ip = 0.0.0.0 #允许外网访问

port = 27017

# Enable journaling, http://www.mongodb.org/display/DOCS/Journaling
journal=true
... ...

参考:mongo配置

然后稍微重启一下mongodb

1
2
3
service mongodb stop #stop
service mongodb start #start
service mongodb status # 查看mongodb的启动状态

3、设置用户信息

这一步其实可以不做数据库就已经可以使用,但不做的话MongoDB只允许本地连接,同时不需要使用任何账号密码就可以直接连接MongoDB。所以还是要稍微配置一下。

首先进入数据库,首次没有配置安全认证的情况下进入无需使用用户名以及密码验证

1
2
3
4
5
mongo
> show dbs # 查看当前已有的数据库
admin 0.000GB
config 0.000GB
local 0.000GB

创建管理员用户

1
2
3
4
> use admin #进入admin这个库
switched to db admin
> db.createUser({user:"xxx_xxxx",pwd:"xxxxxxxx",roles:[{role:"root", db:"admin"}]}) #user和password可以自定义
Successfully added user...

这个管理员是可以掌控整个mongodb的,暂时我们先创建这一个root管理员。有需要的话我们还可以创建多个用户,以实现不同的权限功能,如:

1
2
3
4
5
6
> use admin
> db.createUser({user:"xxx_xxxx",pwd:"xxxxxxxx",roles: [{role:"userAdminAnyDatabase", db: "admin"}]})#授予在所有数据库上管理User的权限

> use test_db #新建一个数据库
> db.createUser({user:"db_owner", pwd:"xxxxxxxx", roles:[{role:"dbOwner", db:"test_db"}]})#在当前DB中执行任意操作
> db.createUser({user:"db_user", pwd:"xxxxxxxx", roles:[{role:"readWrite", db:"test_db"}]})#授予User读写数据的权限

具体mongodb可以创建的用户类型(role)大概有这几种:

数据库用户角色(Database User Roles)
    read:授予User只读数据的权限
    readWrite:授予User读写数据的权限

数据库管理角色(Database Administration Roles):
    dbAdmin:在当前dB中执行管理操作
    dbOwner:在当前DB中执行任意操作
    userAdmin:在当前DB中管理User

备份和还原角色(Backup and Restoration Roles):
    backup
    restore

跨库角色(All-Database Roles):
    readAnyDatabase:授予在所有数据库上读取数据的权限
    readWriteAnyDatabase:授予在所有数据库上读写数据的权限
    userAdminAnyDatabase:授予在所有数据库上管理User的权限
    dbAdminAnyDatabase:授予管理所有数据库的权限

集群管理角色(Cluster Administration Roles):
    clusterAdmin:授予管理集群的最高权限
    clusterManager:授予管理和监控集群的权限,A user with this role can access the config and local databases, which are used in sharding and replication, respectively.
    clusterMonitor:授予监控集群的权限,对监控工具具有readonly的权限
    hostManager:管理Server

创建完后我们可以验证一下是否创建成功:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> use admin
switched to db admin
> show users
{
"_id" : "admin.xxx_xxxx",
"userId" : UUID("xxxxxxxxxxxxxxxxxxxx"),
"user" : "xxx_xxxx",
"db" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}

4、启用用户认证

1
vim /etc/mongodb.conf #进入文件进行配置

将auth项的值置为true

1
2
3
4
5
6
7
8
9
10
11
... ...
# Enables periodic logging of CPU utilization and I/O wait
#cpu = true

# Turn on/off security. Off is currently the default
#noauth = true
auth = true

# Verbose logging output.
#verbose = true
... ...

重启一下数据库

1
2
3
> exit #退出mongo
bye
service mongodb restart #重启

5、测试

我们直接不用账户登录,会显示没有权限

1
2
3
4
5
6
7
8
9
mongo
> show dbs
2022-08-27T14:50:30.755+0800 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "there are no users authenticated",
"code" : 13,
"codeName" : "Unauthorized"
} :
... ...

用我们的管理员账户登录试试看

1
mongo -u xxxxxx -p xxxxxxxx --authenticationDatabase admin # xxxx为你的用户名和密码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mongo -u xxx_xxxx -p xxxxxxxx --authenticationDatabase admin 
MongoDB shell version v3.6.8
connecting to: mongodb://127.0.0.1:27017
Implicit session: session { "id" : UUID("xxxxxxxxxxxxxxxxxxxxx") }
MongoDB server version: 3.6.8
Server has startup warnings:
... ...
> show dbs #查看系统各个数据库情况
admin 0.000GB
config 0.000GB
local 0.000GB
# 如果没有向一个数据库填入任何信息的话,默认不显示
> use admin #查看一个库
switched to db admin
> show users #查看用户
{
"_id" : "admin.xxx_xxxx",
"userId" : UUID("xxxxxxxxxxxxxxxxx"),
"user" : "xxx_xxxx",
"db" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}

至此mongo数据库就搞定了

虚拟环境

1、安装虚拟环境

在~/目录下(链接到服务器的最开始目录)创建.virtualenvs文件夹

1
mkdir .virtualenvs

下载pip包

1
2
pip install virtualenv
pip install virtualenvwrapper

配置环境变量

1
vim ~/.bashrc

将如下代码添加到文件的最后

1
2
3
4
5
6
7
# 指定虚拟环境目录
export WORKON_HOME=$HOME/.virtualenvs
# 指定python版本
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
# 指定virtualenv的路径
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
source /usr/local/bin/virtualenvwrapper.sh

激活设置

1
source ~/.bashrc

2、创建虚拟环境

我们每一个项目最好都有一个独立的虚拟环境,以保证我们的整个系统不会因为杂乱的各种环境设置搞得乱七八糟

在python3中,创建虚拟环境

1
mkvirtualenv -p python3 虚拟环境名称 #如:mkvirtualenv -p python3 venv(一个叫venv的虚拟环境)

3、进入虚拟环境

1
workon 对应虚拟环境名 #workon venv

如果不知道虚拟环境名,可以输完workon 点击两下tab键既可以提示你的虚拟环境名

安装配置Nginx

1、安装

在我们刚刚建好的虚拟环境下安装nginx

1
sudo apt-get install nginx

我们要知道的nginx的启动停止指令(先别输入)

1
2
/etc/init.d/nginx start #启动
/etc/init.d/nginx stop #停止

2、配置

1
vim /etc/nginx/sites-available/default

进入上述文件后改成如下配置(不要直接复制,有一些配置项只是注释了,我们要看好每一项进行配置):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 如果是多台服务器的话,则在此配置,并修改 location 节点下面的 proxy_pass 
upstream flask {
server 127.0.0.1:5000;
server 127.0.0.1:5001;
}
server {
# 监听80端口
listen 80 default_server;
listen [::]:80 default_server;

root /var/www/html;

index index.html index.htm index.nginx-debian.html;

server_name _;

location / {
# 请求转发到gunicorn服务器
proxy_pass http://127.0.0.1:5000;
# 请求转发到多个gunicorn服务器
# proxy_pass http://flask;
# 设置请求头,并将头信息传递给服务器端
proxy_set_header Host $host;
# 设置请求头,传递原始请求ip给 gunicorn 服务器
proxy_set_header X-Real-IP $remote_addr;
}
}

3、测试

1
/etc/init.d/nginx start #启动nginx

打开浏览器,网址栏输入你的公网地址,可以看到以下界面,或者是一个 welcome to nginx 的界面

安装gunicorn

在虚拟环境下安装gunicorn

1
pip install gunicorn

还没安装flask的也要安装

1
2
pip list #查询已安装的包
pip install flask

测试一下,新建一个py文件

1
vim test.py #新建
1
2
3
4
5
6
7
8
9
10
11
#文件内容
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
return "只因你太美"

if __name__ == "__main__":
app.run()

运行test.py文件,在文件所在目录下运行一下命令:

1
2
3
4
5
#gunicorn 语法格式如下
# -w: 表示进程(worker) -b:表示绑定ip地址和端口号(bind)
#gunicorn -w 2 -b 127.0.0.1:5000 运行文件名称:Flask程序实例名

gunicorn -w 2 -b 127.0.0.1:5000 test:app

打开浏览器,刷新网页,就可以看到我们期待已久的鸡哥了

项目上传

1、导出环境

把在本地用到的包导出到一个requirements.txt的文件

1
pip freeze > requirements.txt

导出之后放在项目文件夹中等会一起上传到服务器

2、项目上传至github

本人是将项目上传到github再转到服务器上,然后我们要用到git这个代码管理工具,所以要先下载git,再在GitHub上创建一个仓库,然后通过git把项目上传到GitHub仓库再转存到服务器上。

上传到github可参考这篇文章

3、服务器拉取GitHub项目

1
2
sudo apt-get install git #安装git
git clone https://github.com/xxxxx/xxxxx.git #把项目复制到服务器

4、安装所需pip包

1
2
cd 你的仓库名 #进入项目文件夹
pip install -r requirements.txt #安装pip包

项目运行

项目运行前要确保项目已经更改为生产下的代码,而非本地调试开发运行的代码。如前端请求函数的ip地址端口要设置好为服务器的ip地址,连接mongodb时要加上数据库用户名和密码获得权限等,具体问题不会就度娘==

1
2
3
#启动应用
gunicorn -w 2 -b 0.0.0.0:5000 xxx:app #0.0.0.0监听发送到本服务器的请求
gunicorn -w 2 -b 0.0.0.0:5000 xxx:app -D #后台运行,关闭链接服务器将继续运行flask应用

如果要结束运行,则杀死flask进程

1
2
netstat -tulpn #查看系统网络进程
kill -9 xxxxx #杀死xxxx号进程

至此我们的项目就跑起来了!