通过Gunicorn部署flask应用(阿里云服务器:Ubuntu 16.04)

5,335 阅读3分钟

有用 Python 编写的流行服务器来容纳 WSGI 应用并提供 HTTP 服务。这些服务器在运行时是独立的:你可以从你的 web 服务器设置到它的代理。 Gunicorn ‘Green Unicorn’ 是一个给 UNIX 用的 WSGI HTTP 服务器。

1. 安装pip、virtualenv

sudo apt-get install python-pip python-virtualenv

2. 安装nginx

sudo apt-get install nginx

3. 新建测试项目

在 '/var/www/' 下新建测试项目文件夹:

cd /var/www
sudo mkdir test

使用scp上传本地项目文件至远程服务器:

scp -r test.py root@your.ip.address:/var/www/test  //@后填服务器的公网IP

这里,我们用一个最小项目来测试,test.py:

# file_name='test.py'
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    from werkzeug.contrib.fixers import ProxyFix
    app.wsgi_app = ProxyFix(app.wsgi_app)
    app.run(host='0.0.0.0',port=5000)   # 设置外部访问限制,本例表示所有ip均可访问,端口为5000

4. 配置项目环境

这里推荐使用virtualenv和pip工具来配置我们项目的环境,pip可以方便的安装Python有关的工具、框架等,virtualenv可以为我们每个项目都配置一个独立的工作环境,使不同项目的依赖相互隔离,更方便管理,互相不影响。

在项目路径 '/var/www/test' 下创建virtualenv环境:

virtualenv -p /usr/bin/python3.6 venv   //这里我使用了python3.6的版本,如果使用的是系统默认的python版本,则只需输入:virtualenv venv

然后激活环境:

source venv/bin/activate

如果命令行前面多出来一个: '(venv)' 则表示环境激活成功。

然后,以下安装的所有框架、工具都是只针对这个项目,与其他项目无关。

  • 安装flask:
pip install flask
  • 安装Gunicorn
pip install gunicorn
  • 根据requirements.txt安装项目依赖
pip install -r requirements.txt

5. 启动项目

  • 简单快速启动:
gunicorn test:app

这里的test是我们的入口模块名,app是flask实例名称。

  • 参数启动:
gunicorn -w 4 -b 127.0.0.1:5000 test:app
  • 后台启动
nohup gunicorn -w 4 -b 127.0.0.1:5000 test:app&     //关闭远程连接时程序在后台继续运行

用四个 worker 进程来运行一个 Flask 应用( -w 4 ),绑定到 localhost 的5000 端口( -b 127.0.0.1:5000 )

注意: 如果是部署在服务器上,除了需要设置相关端口(如5000)的安全组,还需要将上面的启动代码中的地址:'127.0.0.1' 改为你的服务器的私有IP,或者'0.0.0.0',否则外部无法访问到项目!

6. 配置

有时我们需要nginx代理请求,接下来我们配置nginx以实现通过请求80端口获取flask项目的服务:

首先备份nginx的配置文件:

sudo cp /etc/nginx/sites-available/default default.bak

然后修改nginx的配置文件:

sudo nano /etc/nginx/sites-available/default

将其改为:

# file_name=default
server {
    listen 80;
    server_name example.org; # 这是HOST机器的外部域名,用地址也行

    location / {
        proxy_pass http://your.私有IP:5000; # 指向 gunicorn host 的服务地址,注意,这里填我们服务器的私有IP
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }

其中的location块代码表示将80端口的请求传送到proxy_pass表示的地址,这里我们要填入我们的私有IP和项目所在的端口!

现在,我们对公网IP的http请求就可以映射到我们的部署在Gunicorn的flask项目上了。

完成

退出虚拟环境:

deactivate

关闭gunicorn:

pkill gunicorn  //关闭gunicorn

查看gunicorn进程:

pstree -ap|grep gunicorn