最近碰到一个需求, 要求Superset部署到 Kubernetes , 并且网站要配置HTTPS安全设置. 在查阅了Superset的官方文档和一些社区讨论之后, 需要对Superset进行两步配置.
1. HTTP代理服务配置
首先Superset在K8S环境中, 使用了load balancer, 同时使用了X-Forwarded-For/X-Forwarded-Proto headers, 因此需要设置ENABLE_PROXY_FIX = True
, 来获取和使用这些headers.
If the load balancer is inserting X-Forwarded-For/X-Forwarded-Proto headers, you
should set
ENABLE_PROXY_FIX = True
in the superset config file to extract and use
the headers.
查看源码会发现, ENABLE_PROXY_FIX = True
实际上是添加了ProxyFix
中间件
if app.config.get('ENABLE_PROXY_FIX'):
app.wsgi_app = ProxyFix(app.wsgi_app)
查看ProxyFix源码的描述不难发现, 它是通过提取X-forworded
headers 来设置REMOTE_ADDR
和 HTTP_HOST
这两个环境变量, 使得application可以直接获得WSGI 环境变量.
配置好上面这一步后, 还碰到一个问题, 输入https的superset主页, 结果总是把我的请求redirect成http的地址, 导致无法正常使用. 仔细研究, 发现superset启动的时候使用gunicorn来作为 WSGI HTTP Server. 因此还要对gunicorn的参数进行设置.
2. 设置gunicorn forwarded-allow-ips
当superset是运行在load balancer(nginx 或者ELB)中, 需要告诉gunicorn有哪些 X-Forwarded-* headers是可以信任的. 通过设置--forwarded-allow-ips
来设置一系列的可靠IP地址.
forwarded-allow-ips 设置为 * 说明信任全部的IP地址, 也可以通过逗号分隔的方式列出指定的IP.
最后添加一个superset的启动脚本, 因为superset runserver
命令中不支持对--forwarded-allow-ips
的指定
gunicorn --workers 16 \
--timeout 60 \
--bind 0.0.0.0:8080 \
--limit-request-line 0 \
--limit-request-field_size 0 \
--forwarded-allow-ips="*" superset:app
Reference:
https://github.com/apache/incubator-superset/issues/978