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环境搭建