Virtualenv + Flask + Gunicorn + Supervisor + Nginx
配置
假设我所在的当前账户名为 tiger 。
准备python环境
1 | $ sudo apt-get udpate |
创建virtualenv虚拟环境
Virtualenv可以为每个Python应用创建独立的开发环境,使他们互不影响,Virtualenv能够做到:
- 在没有权限的情况下安装新套件
- 不同应用可以使用不同的套件版本
- 套件升级不影响其他应用
1 | //安装或通过执行: |
我通常创建一个包含 venv 文件夹的项目文件夹:
1 | $ mkdir myproject |
现在,每次需要使用项目时,必须先激活相应的环境。
1 | $ ls |
你现在进入你的 virtualenv (注意查看你的 shell 提示符已经改变了)。
安装Flask
现在可以开始在你的 virtualenv 中安装 Flask 了:
1 | $ pip install Flask |
几秒钟后就安装好了。
退出虚拟环境
可通过deactivate退出虚拟环境:
1 | (venv)tiger@VirtualBox:~/xbox/myflask$ deactivate |
具体可详见:Flask-安装
启动falsk
在当前目录下新建一个 hello.py 的文件:
1 | (venv) $ vim hello.py |
创建一个简单的Flask程序:
1 | from flask import Flask |
修改hello.py 的权限:
1 | (venv) $ chmod a+x hello.py |
启动 flask:
1 | (venv) $ python hello.py |
此时,用浏览器访问 http://127.0.0.1:5000 就能看到网页显示 hello world。
配置Gunicorn
Gunicorn是用于部署WSGI应用的,任何支持WSGI的都可以,虽说直接执行 python hello.py 这样网站也能跑起来,但那是方便开发而已,在线上环境,还是需要更高效的组件来做。
安装
1 | (venv)$ pip install gunicorn |
然后可以执行:
1 | gunicorn -w 4 -b 127.0.0.1:8000 hello:app |
“hello” is the name of the file (without extension). And “app” is the name of the Flask object.
这里 “hello” 是python文件的名称(不包含扩展名),冒号后面的”app” 是flask程序中app = Flask(__name__)创建的这个Flask对象的名称。
这里我们用了 8000 的端口进行访问,原先的 5000 并没有启用。
-w表示开启多少个 worker,-b 表示 gunicorn 开发的访问地址
想要结束 gunicorn 只需执行 pkill gunicorn :
1 | (venv) $ pkill gunicorn |
我们还可以在一个独立的配置文件中来设置,新增配置文件 gunicorn.conf:
1 | (venv) $ ls |
上面使用pkill gunicorn的方式来停止进程,太过于繁琐,因此出现了另外一个神器—supervisor,一个专门用来管理进程的工具,还可以管理系统的工具进程。
Supervisor
Supervisor 是用Python实现的一款非常实用的进程管理工具。
安装supervisor
1 | (venv) $ pip install supervisor |
常用操作
1 | ## 启动服务 |
生成supervisor默认配置文件
1 | (venv) $ echo_supervisord_conf > supervisor.conf |
修改supervisor配置文件,添加gunicorn进程管理
1 | (venv) $ vim supervisor.conf |
在 supervisor.conf 配置文件底部添加:(假设我的工作目录为: /home/tiger/myflask/myproject/ )
1 | ##文件内容 |
supervisor的基本使用命令
1 | supervisord -c supervisor.conf 通过配置文件启动supervisor |
添加完上面的内容后,保存退出。执行操作:
当前目录:
1 | (venv) $ ls |
通过配置文件 启动 supervisor :
1 | (venv) $ supervisord -c supervisor.conf |
查看 supervisor 的状态:
1 | (venv) $ supervisorctl -c supervisor.conf status |
停止 设置的 服务 hello :
1 | (venv) $ supervisorctl -c supervisor.conf stop hello |
再次查看 服务 hello 的状态 :
1 | (venv) $ supervisorctl -c supervisor.conf status |
自动启动:
那么,如果想开机时自动启动怎么办呢?或者说,如果机器重启了,那WEB服务就断了。
其实呢,也很简单,只要在 /etc/rc.d/rc.local 中加入一句就可以了:
1 | supervisord -c /home/tiger/myflask/myproject/supervisor.conf |
有了Gunicorn、Supervisor,本地的环境的算是搭好了,但是我们需要让VPS上的网站从外网可以访问,这时候需要Nginx。
现在,我们只能在本机上通过http://127.0.0.1:8000 的方式来访问的,但在外网上是无法访问到的。
配置Nginx
在安装Nginx之前,要先退出上面步骤中操作所在的venv环境,执行:
1 | (venv) $ deactivate |
安装nginx
1 | $ sudo apt-get install nginx |
安装完成后访问localhost可以看到 Welcome to nginx on Ubuntu! 的页面。
nginx 的默认网站目录 /usr/share/nginx/html
常用配置命令
1 | ##启动服务 |
或下面的命令:
1 | $ sudo /etc/init.d/nginx start |
Nginx的配置文件和Supervisor类似,不同的程序可以分别配置,然后被总配置文件include:
1 | ## Nginx的主配置文件地址 |
也可以用下面的最简配置:
1 | server { |
配置完成之后,sudo service nginx restart 重启一下服务。
现在,在浏览器中输入 http://127.0.0.1 即可正常访问。
总结
- Flask应用的基本部署依赖包括一个应用容器(比如Gunicorn)和一个反向代理(比如Nginx)。
- Gunicorn应该退居Nginx幕后并监听127.0.0.1(内部请求)而非0.0.0.0(外部请求)。
- 仍有疑问的地方:在虚拟环境下安装的
supervisor并非是全局的,经测试kill掉supervisor进程后也不会自动重启,或如何随系统启动?该问题待进一步测试
相关链接
- virtualenv — virtualenv 1.7.1.2.post1 documentation
- GitHub - defshine/flaskblog: Learn python and flask,just a tony blog system
- Gunicorn - Python WSGI HTTP Server for UNIX
- 安装 Flask 0.10 documentation
- Flask + Gunicorn + Nginx 部署 - Ray Liang - 博客园
- 阿里云ECS上环境搭建(virtualenv+flask+gunicorn+supervisor+nginx) - 菩提本无树 - 博客园
- 阿里云部署 Flask + WSGI + Nginx 详解 - Ray Liang - 博客园
- Supervisor 管理后台守护进程
- python web 部署:nginx + gunicorn + supervisor + flask 部署笔记 - 简书
- VPS环境搭建详解 (Virtualenv+Gunicorn+Supervisor+Nginx) | BeiYuu.com
- 基于 Flask 实现 RESTful API | Ross’s Page
- Ubuntu 14.04 系统基于 Gunicorn 和 Nginx 部署 Flask 应用 | Ross’s Page
- Flask+Nginx+Gunicorn+Redis+Mysql搭建一个小站 | Alex's Blog
- How to Run Flask Applications with Nginx Using Gunicorn – Onur Güzel *
- dnsmasq配置域名重定向和dns缓存 | Alex's Blog
- 在阿里云CentOS7中配置基于Nginx+Supervisor+Gunicorn的Flask项目 - simpleapples
- virtualenv 环境下 Django + Nginx + Gunicorn+ Supervisor 搭建 Python Web
- 部署 | Flask之旅
- CentOS 6 下使用 Nginx,Gunicorn 以及 Supervisor 部署 Flask 应用 - 杜顺帆的个人博客
- 在 Ubuntu 中 Nginx,Gunicorn 部署 Flask | autarch *
- 阿里云Python+Flask环境搭建