同时在一个服务器上部署多个Flask应用

本文采用nginx+supervisor+uwsgi+ubuntu实现

修改Nginx

部署单个应用的配置文件

/etc/nginx/sites-enabled/default

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80 ;
server_name 115.159.207.151;
location / {
include uwsgi_params;
# uwsgi_param SCRIPT_NAME /app;
uwsgi_pass 127.0.0.1:3031;
uwsgi_param UWSGI_PYHONE /home/ubuntu/manage/venv;
uwsgi_param UWSGI_CHDIR /home/ubuntu/manage;
uwsgi_param UWSGI_SCRIPT manage:app;
uwsgi_read_timeout 100;
}
}

配置多个应用的配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
listen 80 ;
server_name 115.159.207.151;
location /app {
include uwsgi_params;
uwsgi_param SCRIPT_NAME /app;
uwsgi_pass 127.0.0.1:3031;
uwsgi_param UWSGI_PYHONE /home/ubuntu/manage/venv;
uwsgi_param UWSGI_CHDIR /home/ubuntu/manage;
uwsgi_param UWSGI_SCRIPT manage:app;
uwsgi_read_timeout 100;
}

location /phoneManage {
include uwsgi_params;
uwsgi_param SCRIPT_NAME /phoneManage;
uwsgi_pass 127.0.0.1:3032;
uwsgi_param UWSGI_PYHONE /home/ubuntu/phoneManage/venv;
uwsgi_param UWSGI_CHDIR /home/ubuntu/phoneManage;
uwsgi_param UWSGI_SCRIPT manage:app;
uwsgi_read_timeout 100;
}
}

解析

1
2
3
server {
listen 80 ;
server_name 115.159.207.151;

表示nginx监听服务器上的80端口,当有通过80端口,向server_name发送的请求时,Nginx会进行相应的处理(转发等操作)


1
2
3
location /app {
...
}

location /app表示,当有对server_name/app115.159.207.151/app的请求时,按照该大括号内部配置的请求进行相应操作.


1
2
include uwsgi_params;
uwsgi_pass 127.0.0.1:3031;

表示,Nginx会将收到的所有请求,转发到127.0.0.1:3031上,即uwsgi服务器上,负责特定应用的uwsgi会收到相应请求,并进行处理.对于多应用来说,每个应用占用不同的端口.


1
uwsgi_param SCRIPT_NAME /app;

为了实现在一个Nginx上,可以同时运行多个应用,需要添加如上字段,这里我们定义参数SCRIPT_NAME 值为应用的路径(路由)/app,同时需要在uwsgi配置文件中去掉wsgi-file 并加上

1
2
3
4
5
# /home/ubuntu/manage/config.ini
...
...
mount=/app=manage.py
manage-script-name=true

mount参数表示当有对/app的请求时,路由到manage.py(ps:我的理解是,manage.py是应用的启动文件,当有对/app的请求时,uwsgi会将请求传递到manage.py所启动的应用)
manage-script-name=true- 表示启用之前在Nginx上配置的SCRIPT_NAME参数


1
2
3
4
5
uwsgi_param UWSGI_PYHONE /home/ubuntu/manage/venv;
uwsgi_param UWSGI_CHDIR /home/ubuntu/manage;
uwsgi_param UWSGI_SCRIPT manage:app;
uwsgi_read_timeout 100;
}

UWSGI_SCRIPT – 传递定义了一个 application 可调用对象的WSGI脚本名
UWSGI_PYHONE - 用于设置虚拟环境
UWSGI_CHDIR - 设置应用所在路径

为每个应用添加各自的supervisor配置文件

/etc/supervisor/conf.d/目录下,为每个应用添加相应的应用名称_supervisor.conf文件

比如,在我的目录下有如下两个文件

1
2
manage_supervisor.conf
phoneManage_supervisor.conf

各文件配置如下:

1
2
3
4
5
6
7
[program:manage]
command=/home/ubuntu/manage/venv/bin/uwsgi /home/ubuntu/manage/config.ini
directory=/home/ubuntu/manage
user=ubuntu
autostart=true
autorestart=true
stdout_logfile=/home/ubuntu/manage/uwsgi_supervisor.log

1
2
3
4
5
6
7
[program:phoneManage]
command=/home/ubuntu/phoneManage/venv/bin/uwsgi /home/ubuntu/phoneManage/config.ini
directory=/home/ubuntu/phoneManage
user=ubuntu
autostart=true
autorestart=true
stdout_logfile=/home/ubuntu/phoneManage/logs/uwsgi_supervisor.log

解析

配置参数都很简单,就不详细解释,supervisor是进程管理工具,可以通过supervisorctl命令来查看各进程信息
例如:

1
2
3
4
ubuntu@VM-197-173-ubuntu:~$ supervisorctl
manage RUNNING pid 4858, uptime 0:51:32
phoneManage RUNNING pid 4857, uptime 0:51:32
supervisor>

当启动supervisor时,它会执行各自应用目录下的uwsgi config.ini命令 –> 同时启动多个Flask 应用

为每个应用添加各自的uwsgi配置文件

1
2
3
4
5
6
7
8
9
10
11
12
[uwsgi]
socket= 127.0.0.1:3031
master = true
home = venv
# wsgi-file = manage.py
callable = app
processes = 4
threads = 2
buffer-size = 32768
stats = 127.0.0.1:9191
mount=/app=manage.py
manage-script-name=true
1
2
3
4
5
6
7
8
9
10
11
12
[uwsgi]
socket= :3032
master = true
home = venv
# wsgi-file = manage.py
callable = app
processes = 4
threads = 2
buffer-size = 32768
stats = 127.0.0.1:9192
mount=/phoneManage=manage.py
manage-script-name=true

上面两个配置文件,区别在于,每个应用端口不同,仅此而已.

总结

利用supervisor来同时启动多个应用,每个应用所在目录不同,端口不同,Nginx监听来自service_name,80端口的请求,同时将请求转发到相应的应用.

参考链接

本文标题:同时在一个服务器上部署多个Flask应用

文章作者:定。

发布时间:2017年7月25日 - 09时07分

本文字数:3,052字

原始链接:http://cocofe.cn/2017/07/25/同时在一个服务器上部署多个Flask应用/

许可协议: Attribution-NonCommercial 4.0

转载请保留以上信息。