Flask部署方案(ubuntu):Virtualenv+Supervisor+Nginx

首先是概念解释

  1. WSGI服务器,负责我们的app与服务器的交互,常用的有Gunicorn。flask自带的不够健壮,不能用在生产服务器上。
  2. Web服务器,是个HTTP服务器,就相当于tomacat于Java,常用的有Nginx,用作反向代理,负载均衡什么的。

Web服务器中,Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。

部署工具:

  1. Virtualenv,用户创建独立的虚拟的Python运行环境,可以解决版本,依赖等问题。
  2. Supervisor,负责管理应用:应用的开启,关闭,以及多应用的管理等

Virtualenv

安装
sudo pip install virtualenv
使用
#创建虚拟环境
virtualenv venv

#启动虚拟环境
source venv/bin/activat

#停止虚拟环境
deactivate

Supervisor

安装
sudo apt-get install supervisor
使用

配置Supervisor的配置文件的路径:/etc/supervisor/conf.d/*conf , centos是 /etc/supervisord.d/*.ini

cd /etc/supervisor/conf.d/*conf

在这里目录下,我们创建我们应用的配置文件,这样Supervisor才能读取到

sudo vim app.conf

里面的内容输入(内容其实就是执行我们的Python文件):

[program:app]
command = python /home/tengfei/api01/test/TestTo/TODO-orm/app.py


//注,这个配置是和后文中Nginx配置好后对象的9000的转发端口执行的操作
[program:todo]
command = /home/tengfei/api01/test/TestTo/TODO-orm/venv/bin/gunicorn -b 127.0.0.1:9000 app:app
directory = /home/tengfei/api01/test/TestTo/TODO-orm

更改配置文件后,要让supervisor的配置文件生效,执行

supervisorctl reload

启动supervisor:

sudo service supervisor start

重启:

sudo service supervisor restart 

查看supervisor程序当前的状态

sudo supervisorctl

这里面可以使用status指令来查看程序的运行状态

app名字:就是刚才配置配置文件中[program:app]的,比如我这里输入 start app就可以了,以后同上:
start app名字 # 启动app
stop app # 停止app

需要注意的是supervisor发生错误的话,需要它的日志中才能看到

supervisor错误日志地址:
/var/log/supervisor/supervisord.log

参考ubuntu安装和使用supervisor

Ubuntu安装Curl的方法

Nginx

安装
    sudo apt-get update
    sudo apt-get install nginx
    
配置

nginx的也是把程序运行需要的配置文件放到指定的目录下即可

cd /etc/nginx

/etc/nginx子目录下,有两个文件要格外关注关注一下:

sites-available  :可用的配置文件
sites-enabled       :生效的配置文件
    

1:先在sites-available 目录下创建配置文件vim api_app

里面写上:

# api_app内容
server {
        listen 81;

        location /static {
                alias /home/tengfei/api01/test/TestTo/TODO-orm/;
        }

        location / {
                proxy_pass http://127.0.0.1:9000;
        }
}

注,listen 81;:意思是nginx监听的是81端口,我开始监听80端口,结果和默认的冲突了;location /static:是把静态文件转发到后文中的目录下;location /:是把动态请求转发到本机(服务器)的9000端口,上面文件的内容的格式可自行百度。我开始

然后创建软连接到sites-enabled

sudo ln -s ../sites-available/api01_app .

然后重新启动nginx

sudo service nginx reload

//这代表nginx重启成功
 * Reloading nginx configuration nginx                                                       [ OK ] 
    
使用

启动

sudo service nginx restart

重启

sudo service nginx reload
    

查看nginx的状态

sudo service nginx status       
    
    

参考:How To Install Nginx on Ubuntu 14.04 LTS

gunicorn

安装

apt-get install gunicorn

使用

gunicorn -b 0.0.0.0:8080 run:app

尝试在虚拟环境中运行一下程序,看看是否可以成功
//注意下面语句前面的run是指运行的python文件的的名字为run.py的话,执行run:app,如果为app.py那就是app:app

参考文档

Ubuntu 安装mysql和简单操作

“error: command ‘x86_64-linux-gnu-gcc’ failed with exit status 1” in virtualenv

ubuntu下mysql-python模块的安装

how to install the SQLALchemy on the ubuntu?

另外可以用fabric来管理构建和部署。