原文:http://www.catonlinepy.tech/
声明:原创不易,未经许可,不得转载
这篇文章,猫姐将讨论如何将 flask 程序部署到 ubuntu 服务器上。其中,部署过程涉及到 Flask,Nginx,Gunicorn,Supervisor 的安装使用。通过学习今天的文章,你将学会部署自己开发的 Flask web 程序,真正让自己开发的应用上线运行。
0. Flask Web 应用处理请求的过程
1. 安装相应的依赖环境
使用 ssh username@ip 进入云主机的 shell 环境,并在云主机上安装需要依赖环境,使用如下命令安装:
sudo apt-get install nginx supervisor python-pip python3-venv
ssh 的使用方法:ssh 命令,加上 @前面是云主机服务器的用户名,@后面是云主机服务器的 ip 地址。
2. 创建虚拟环境
如果云主机中没有创建虚拟环境,那么我们有必要创建一个。虚拟开发环境的主要作用是为了将 web 项目所用的各种库与操作系统自带的 python 库隔离开来,这样做的好处是开发环境与系统环境隔离,环境之间不会相互影响,特别是对于多人协作的大型项目开发,建立虚拟环境是非常有必要的。下面开始创建虚拟环境:
# 使用下面命令,创建一个虚拟开发环境
$ python3 -m venv < 虚拟环境的名字 >
# 激活刚才建立的虚拟开发环境,(这里我们创建一个名为 miao_venv 的虚拟环境)$ python3 -m venv miao_venv
$ source maio_venv/bin/activate
# 安装 flask web 程序所需要的 python 包
$ pip installl -r requirement.txt
激活虚拟环境后,进入 run.py 文件的目录,在终端中输入 python run.py,就可以将程序运行起来了。但是,这样生产环境中将 flask 程序运行起来是不安装的,并且处理用户请求的能力也非常不足。所以,我们应该去使用 gunicorn 这个工具去运行我们的 Flask web 程序。
3. 设置 Gunicorn
Gunicorn(“Green Unicorn”)是一个 unix 上被广泛使用的高性能的 Python WSGI UNIX HTTP Server。和大多数的 web 框架兼容,并具有实现简单,轻量级,自动管理多个 worker 进程,高性能等多个特点。
采用如下命令安装 gunicorn:
pip install gunicorn
gunicorn 运行 Flask web 程序的方法也非常简单,如下命令即可达到目的:
gunicorn filename(run): 变量名 (app) -b localhost: 端口号 &
# 解释:filename 指的是能够将 flask 程序运行起来的 python 文件,如 run.py 的文件名 run。冒号后面的是 flask 实例化的 app 变量。端口号是在网页中输入的 url 的端口号
查看端口服务是否生效,可以使用下面的命令:
# 在命令行中输入:$ ps aux|grep gunicorn
# 下面是效果
(miao_venv) root@vultr:~/flaskblog# ps aux|grep gunicorn
root 4124 0.0 0.0 11020 980 pts/0 S+ 10:35 0:00 grep --color=auto gunicorn
root 11117 0.0 2.1 33308 21400 ? S May28 0:10 /root/blog_venv/bin/python3 /root/blog_venv/bin/gunicorn run:app -b localhost:5006
root 11120 0.0 7.6 160528 77160 ? S May28 0:17 /root/blog_venv/bin/python3 /root/blog_venv/bin/gunicorn run:app -b localhost:5006
这样就能够使用 gunicorn 进程去监听 5006 的端口。现在 gunicorn 进程是工作在后台的,但只有一个 gunicorn 进程会处理 web 请求,当用户访问量过大时,网站的并发处理能力非常弱。最理想的方法是,使用 supervisor 工具去启动并监控多个 gunicorn 进程。
4. 配置、启动 Supervisor
supervisor 工具可以监视并控制类 Unix 操作系统的进程。supervisor 将 gunicorn 进程启动后,会一直监控 gunicorn 进程的运行情况。当 gunicorn 进程出现异常挂掉后,supervisor 会立刻启动 guincorn 进程,确保 web 程序提供的用户服务不受影响。
supervisor 的使用也非常简单,只需要完成一个 conf 文件的编写,在 /etc/supervisor/conf.d/ 目录下创建一个 flaskblog.conf 文件并依据自己的要求去配置它。配置内容如下所示:
# flaskblog.conf 文件内容如下
[program:flaskblog]
# 你的博客程序所在的目录
directory=/root/flaskblog/.
command=/root/flaskblog/miao_venv/bin/gunicorn run:app -b localhost:5006 # 这个地方的端口号要与 nginx.conf 文件中一致
autostart=true
autorestart=true
stderr_logfile=/var/log/flaskblog.err.log
stdout_logfile=/var/log/flaskblog.out.log
为了使以上配置立刻生效,需要运行下面的命令:
$ sudo supervisorctl reread
$ sudo service supervisor restart
#另外一些常用的命令
$ sudo service supervisor stop
$ sudo service supervisor start
这样,我们就可以通常 supervisor 工具来完成对 gunicorn 进程的监控了,使用下面的命令可以看到 flaskblog 是否处于运行状态,及运行进程 ID 和运行时长:
$ sudo supervisorctl status
# 状态显示
(miao_venv) root@vultr:~/flaskblog# sudo supervisorctl status
flaskblog RUNNING pid 11117, uptime 19:18:31
5. 配置、启动 Nginx
Nginx 可以作为 HTTP 服务器和反向代理服务器,它能够实现负载均衡,分担服务器的压力。
现在,为我们的 flask 程序定义一个服务块,如下所示:
# 在 /etc/nginx/nginx.conf 文件中添加如下内容
# server 添加的位置在 http{} 里面
server {
listen 80;
server_name example.org; # 这是 HOST 机器的外部域名,用地址也行。现在还没有域名,可以用 example.org 代替
location / {
proxy_pass http://127.0.0.1:5006; # 这里是指向 gunicorn host 的服务地址
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 注意:proxy_pass 中,代理传递的端口必须与 gunicorn 进程的端口号相同
现在重启 nginx web 服务器,命令如下:
$ sudo nginx -t
$ sudo service nginx restart
此时,你已经可以通过云主机上的公网 IP 来访问你的 Flask web 程序了,猫姐的博客运行起来后的效果如下:
6. 总结
通过布署 flask 程序到 ubuntu 云主机服务器上,我们掌握了以下技能:
1. 学到了 Gunicorn 的使用
2. 学到了 Supervisor 的使用
3. 学到了 Nginx 的使用
今天的 flask 上线布署教程就到这里,喜欢的同学们可以在下面点赞留言,或是访问我的博客地址:http://www.catonlinepy.tech/ 加入我们的 QQ 群进一步交流学习!