centos下通过gunicorn+nginx+supervisor部署Flask项目

centos下通过gunicorn+nginx+supervisor部署Flask项目

之前用Flask写了个解析Tumblr博客(为Tumblr默哀)的网站,然后直接放在DigitalOcean上运行:
python run.py
结果感觉怎么那么不稳定!!!然后就以为是服务器不行

后来才知道原来Flask的app.run()只是用来本地调试用的,如果真正放到服务器上运行的话,是完全不行的!需要配合gunicorn/uWsgi和Nginx才行。

然后就在网上找到这篇文章jianshu.com/p/be9dd421f。文章看起来不错,但是尼玛写文章能不能用点心!!你根本就没有说完整个部署过程好吗!!Nginx的配置都没有说完好吗!!!对于没有接触过Nginx的小白来说,这是致命的好吗!!!

结果就搭配着gunicorn把Flask半部署,直接运行

gunicorn -w4 -b 0.0.0.0:80 run:app

把网站运行起来了!

ok,以上属于吐槽部分,接下来讲整个的部署过程!

首先说明搭建环境:

  • DigitalOcean服务器
  • CentOS 64位系统

通过链接m.do.co/c/dbd97068223d注册,可以获得10刀!可以相当于免费用两个月哦!

1首先安装Flask、gunicorn、Nginx

DO的CentOS是没有安装pip和setuptools的,所以如果需要安装Python库的话,需要自己先安装setuptools。我比较懒,所以只安装了setuptools,用easy_install来安装Python库。

安装setuptools过程:
(1)下载setuptools包
# wget http://pypi.python.org/packages/source/s/setuptools/setuptools-2.0.tar.gz
(2)解压setuptools包
# tar zxvf setuptools-2.0.tar.gz
# cd setuptools-2.0
(3)编译setuptools
# python setup.py build
(4)开始执行setuptools安装
# python setup.py install

咳咳!!DO的CentOS好像连wget也没有安装,所以需要提前安装wget:
yum install wget

安装好setuptools后,就可以通过easy_install 安装各种Python库了:

easy_install flask
easy_install gunicorn

Flask和gunicorn安装好之后就安装Nginx,CentOS不能直接安装Nginx,还需要添加rpm(其实我根本不知道这是什么鬼,可能就是一个源吧)

1、CentOS 6,先执行:
[root@server ~]# rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
2,安装nignx
[root@server ~]# yum install nginx

嗯,Nginx安装好了!

2、添加Flask项目

这里就创建一个最简单的Flask项目,项目目录是/home/flask,在该目录下创建一个run.py的Python文件。

#run.py
from flask import Flask

app = Flask(__name__)

@app.route('/') 
def index():
    return '<h1>Hello World!</h1>'

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

然后运行gunicorn

[root@server ~]# gunicorn -w 4 -b 0.0.0.0:5000 run:app
[2016-05-28 12:35:26 +0000] [1541] [INFO] Starting gunicorn 19.6.0
[2016-05-28 12:35:26 +0000] [1541] [INFO] Listening at: http://0.0.0.0:5000 (1541)
[2016-05-28 12:35:26 +0000] [1541] [INFO] Using worker: sync
[2016-05-28 12:35:26 +0000] [1546] [INFO] Booting worker with pid: 1546
[2016-05-28 12:35:26 +0000] [1551] [INFO] Booting worker with pid: 1551
[2016-05-28 12:35:26 +0000] [1552] [INFO] Booting worker with pid: 1552
[2016-05-28 12:35:26 +0000] [1553] [INFO] Booting worker with pid: 1553


这个时候打开浏览器,输入http://你的服务器ip:5000就可以看到运行结果


然后配置Nginx,刚才安装了Nginx之后,我们打开/etc/nginx/conf.d/default.conf,然后修改默认的default.conf为:

server {
    listen       80;
    server_name  localhost;
    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_redirect off;
        proxy_set_header Host $host:80;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

其中server_name就是你的域名,这里用localhost代表通过ip访问

配置好default.conf之后就启动Nginx吧!

[root@server ~]# service nginx start
Starting nginx:                                            [  OK  ]
[root@server ~]# nginx -s reload

ok!到这一步,整个部署过程就搞定了!打开浏览器输入http://你的服务器ip 看是否运行?

整个部署过程可以总结为:

安装Flask、gunicorn、Nginx -->

添加Flask项目 -->

运行Gunicorn -->

修改Nginx配置文件 -->

运行Nginx

----------------------------------------------------------------------------

以上步骤不能保证开机运行网站,因此需要通过supervisor对网站进行开机启动,步骤如下:

1、首先安装supervisor

pip install supervisor

2、在项目目录添加supervisor的配置文件,在本例中是/home/flask

echo_supervisord_conf > supervisord.conf

3、配置

vi supervisord.conf

添加如下信息

[program:myapp]
directory = /home/flask
command = gunicorn -w4 -b 0.0.0.0:5000 run:app

同时可以开启supervisor的web管理页面

[inet_http_server]
port = 0.0.0.0:9001

4、最后,我不清楚怎么通过supervisor开启启动这个配置文件,因此通过开机任务启动

vi /etc/rc.d/rc.local

并在最后添加

supervisord -c /home/flask/supervisord.conf

尾声:通过以上步骤,那么基本上就可以开启启动网站了!reboot试一试~~

编辑于 2016-07-23