有用 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 [email protected]:/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
复制代码