type
Post
status
Published
date
Mar 30, 2020 15:16
slug
summary
从源码打包到集群部署的完整实战指南:涵盖 setup.py 配置与 Wheel 打包、手动/文件服务器/PyPI 三种分发方式、Gunicorn 单机部署,以及 Nginx 负载均衡集群方案与 SELinux 踩坑排查。
tags
Superset
Data Warehouse
category
DevOps
icon
password
wordCount
2063
前言: 当你的 Superset 从"实验室玩具"进化到"生产力工具",就不可避免地要面对三件事——打包、分发、集群部署。本文将带你走完这条从源码到多节点负载均衡的完整路径。无论你是想把魔改后的 Superset 发给同事,还是想让它在 Nginx 背后优雅地扛住并发,这篇都能帮到你。
实验环境
开始之前,先确认你的工具箱里有这些家伙:
组件 | 版本 | 备注 |
操作系统 | CentOS 7 Minimal | 生产环境常客 |
Python | 3.6.8+ | Superset 的母语 |
Node.js | 12.16.1+ | 前端编译必备 |
setuptools / pip | 最新即可 | Python 打包基础设施 |
Superset 打包
Python 模块本质上就是文件——直接复制到目标目录就能用。但如果你想优雅地复用和分享,就得把它打成正经的安装包。就像把散装零食装进密封袋,方便携带也方便投喂。
修改 setup.py
- 进入 Superset 根目录
- 编辑
setup.py文件
找到
setup() 函数,重点关注以下字段:需要修改的地方:
- name:改成你的二次开发项目名称(如
zjft-superset)。如果要上传到 PyPI,先去官网搜一下确保不重名。
- version:按需修改版本号。
- install_requires:追加二次开发中引入的依赖包。
修改后大致长这样:
保存退出(
:wq)。编译前端

- 进入 assets 目录
- 安装依赖并编译
开始打包
- 回到 Superset 根目录
- 选择打包方式:
方式 | 命令 | 产物 | 推荐度 |
Wheel(推荐) | .whl 文件 | ⭐⭐⭐ 安装更快,无需编译 | |
Source Tarball | .tar.gz 文件 | ⭐⭐ 兼容性好,但安装稍慢 |
打包完成后,产物会出现在自动生成的
dist/ 目录下:Superset 分发
包打好了,接下来就是"快递"环节——怎么把它送到目标服务器上。
方式一:手动分发
最朴素的方法:
scp 或其他文件传输工具直接上传到服务器。简单粗暴,适合内网少量机器。方式二:自建文件服务器

把
.whl 或 .tar.gz 丢到内部文件服务器上,团队成员通过 URL 直接 pip install。适合不想暴露到公网的团队。方式三:上传到 PyPI
注意: 上传到 PyPI 的包全世界都能下载,确保不包含敏感信息。
- 前往 PyPI 官网 注册账号
- 安装上传工具
- 上传(会提示输入 PyPI 的用户名和密码)
Superset 安装
创建 Python 虚拟环境
用虚拟环境隔离系统 Python 是个好习惯——就像做实验要穿白大褂,防止把日常衣服弄脏。
- 创建虚拟环境(
myven为自定义名称)
- 激活虚拟环境
激活后终端提示符前会出现
(myven),表示你已进入隔离空间。安装方式对照
分发方式 | 安装命令 |
手动上传 .whl | pip install superset-0.35.2-py3-none-any.whl |
手动上传 .tar.gz | |
自建文件服务器 | |
PyPI | pip install zjft-superset |
验证安装
安装无报错后,运行以下命令启动开发服务器:
如果终端没有飘红——恭喜,安装成功 🎉
部署 Superset 单机服务
开发服务器只适合调试,生产环境需要一个靠谱的 WSGI 服务器。Gunicorn(独角兽🦄)就是 Python 社区最受欢迎的选择之一——轻量、高性能、配置简单。
- 安装依赖
- 启动服务
参数说明:
-w 2:启动 2 个 worker 进程
-k gevent:使用 gevent 异步工作模式
--timeout 60:请求超时 60 秒
-b 0.0.0.0:9000:监听所有网卡的 9000 端口
--limit-request-line 0:不限制 HTTP 请求行大小(0 = 不限制,默认 4094,可防 DDOS)
--limit-request-field-size 0:不限制请求头大小(默认 8190)
启动成功后,浏览器打开
http://ip:9000 即可访问。部署 Superset 集群服务
单机扛不住?上集群。核心思路很简单:启动多个 Gunicorn 实例,前面用 Nginx 做负载均衡。
安装 Nginx
如果提示"没有可用软件包 nginx",需要先添加 Nginx 官方源:
然后重新执行安装命令。
验证 Nginx 安装
常用 Nginx 命令速查:
systemctl enable nginx— 开机自启
service nginx start— 启动
service nginx stop— 停止
service nginx restart— 重启
service nginx reload— 重新加载配置(修改配置后用这个)
启动 Nginx
确保 80 端口未被占用,然后启动:
浏览器访问
http://ip,看到 Nginx 的欢迎页就说明一切正常。修改 Nginx 配置
编辑配置文件:
替换为以下内容:
配置解读:
weight=2和weight=1表示轮询权重——每 3 次请求中,2 次打到 9000 端口,1 次打到 9001 端口。
add_header backendIP/backendCode会在响应头中暴露实际后端地址,仅用于调试验证,生产环境必须删除。
重新加载配置使其生效:
验证负载均衡
打开浏览器,按
F12 进入开发者工具,访问 http://你的IP/。连续按
Ctrl + F5(强制刷新)三次,观察响应头中的 backendIP:- 前两次应指向 9000 端口:

- 第三次应指向 9001 端口:

如果三次都指向同一个端口,说明负载均衡没生效,按以下顺序排查:
- 确认所有 Superset 实例都在运行
- 确认配置文件语法正确且已 reload
- 查看 Nginx 错误日志:
常见问题:SELinux 权限拦截
如果日志中出现类似错误:
这是 SELinux 在捣乱。两种解决方案:
方案一:临时关闭 SELinux(不用重启)
方案二:永久关闭 SELinux(需重启)
编辑
/etc/selinux/config,将 SELINUX=enforcing 改为 SELINUX=disabled,然后重启机器。方案三:精准放行(推荐)
不想关闭 SELinux?执行以下命令单独放行 HTTP 网络连接:
推荐方案三——既解决了问题,又保留了 SELinux 的安全防护能力。关闭 SELinux 虽然省事,但在生产环境中会增加安全风险。
总结
恭喜你走完了从源码到集群的完整旅程 🚀 回顾一下关键节点:
阶段 | 核心动作 | 产出 |
打包 | 修改 setup.py • 编译前端 + bdist_wheel | .whl 安装包 |
分发 | 手动 / 文件服务器 / PyPI | 团队可获取的安装源 |
单机部署 | Gunicorn + gevent | 生产级单节点服务 |
集群部署 | 多 Gunicorn 实例 + Nginx 负载均衡 | 高可用多节点服务 |
当 Superset 从单兵作战走向集群协同,你的 BI 平台也就完成了从"能用"到"好用"的进化。下一步可以考虑加入 Redis 做缓存层、Celery 处理异步查询,甚至接入 Kubernetes 实现弹性伸缩——但那都是后话了,先把眼前的集群稳稳跑起来吧 💪
