Airflow UI 请求排队卡顿:如何在 Nginx 反向代理上启用 HTTP/2
【免费下载链接】airflowApache Airflow - A platform to programmatically author, schedule, and monitor workflows项目地址: https://gitcode.com/GitHub_Trending/ai/airflow
打开 Airflow 的 Grid 这类页面时,视图会同时发起大量 API 请求;如果你感到请求在排队、页面加载卡住,performance.rst 官方性能调优文档给出的解释是:浏览器把 HTTP/1.1 的并发连接数限制为每源 6 个,繁忙的 UI 视图只能等待连接槽释放。这篇文章讲如何为 Airflow 前面的 Nginx 反向代理启用 HTTP/2 来消除这个瓶颈。按文档说明,Airflow 本身不需要任何改动,配置全部在代理层完成。
先判断 UI 卡顿是否属于连接排队
performance.rst 给出的现象判断依据有三条:
- 浏览器限制每个源(origin)最多 6 个并发 HTTP/1.1 连接;
- Grid 页等视图会一次性发起许多 API 请求;
- 并发请求数超过连接槽后,部分请求会排队(queue)并停住(stall),直到有空闲连接槽。
如果你的 Airflow 通过 Nginx 访问,卡顿集中在同时发起大量请求的视图上,就属于这类问题。文档说明 HTTP/2 通过单一 TCP 连接复用多条流(stream multiplexing)来承载多个请求,直接移除 6 连接限制,同时借助头部压缩降低延迟。
在 Nginx 中启用 HTTP/2
HTTP/2 配置在位于 Airflow API server 之前的反向代理上。Nginx 的做法是在listen行加上http2指令。文档原文示例:
server { listen 443 ssl http2; # ... existing Airflow proxy configuration ... }两点说明:
http2加在 HTTPS 监听(443 ssl)的listen指令上,也就是你转发 Airflow 流量所用的 server 块;- 示例中的
# ... existing Airflow proxy configuration ...表示你现有的 Airflow 代理配置,启用 HTTP/2 只需要在既有配置基础上补上http2这一个指令。
同步核对 Airflow 反向代理配置
Nginx 这一段配置完成后,反向代理的其余部分应按官方文档 run-behind-proxy.rst 执行。该文档给出的原则是:反向代理把 URL 和 HTTP 头原样(without any rewrite)传给 Airflow webserver,并给出了完整的 server 块示例:
server { listen 80; server_name lab.mycompany.com; location /myorg/airflow/ { proxy_pass http://localhost:8080; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_redirect off; proxy_http_version 1.1; } }注意示例里 Nginx 到 Airflow 这一段用的是proxy_http_version 1.1,HTTP/2 只作用于浏览器与 Nginx 之间,这正是文档呈现的组合形态,两处配置都要保留。
如果你的部署通过子路径访问(如文档示例https://lab.mycompany.com/myorg/airflow/),需要在airflow.cfg中把对应地址写入base_url,文档示例值:
base_url = http://my_host/myorg/airflow此外文档列出了几项配套检查:
- 启动 API server 时加
--proxy-headers参数(airflow api-server --proxy-headers),让应用服务器信任代理转发的头; - 若反向代理与 Airflow 不在同一台主机(或同一个 Docker 容器)上,需设置
FORWARDED_ALLOW_IPS环境变量,让应用服务器知道该信任哪些代理来源; - UI 有部分在 iframe 内渲染(例如 Auth managers 的安全链接),CSP 不要设置成限制 iframe 的
frame-ancestors 'none'; - 代理不要强制给 Set-Cookie 加 http-only 标记,Airflow 前端需要通过 JavaScript 访问 cookie,http-only 会破坏该功能。
结果确认与限制
文档没有给出独立的 HTTP/2 校验命令,它描述的效果是:启用 HTTP/2 后每源 6 连接的限制被移除,原先因连接槽不足而排队停住的请求改为在同一条 TCP 连接上复用。因此启用后,直接观察之前出现排队、卡顿的视图(如 Grid 页)是否还出现文档所述的 queue/stall 现象,就是文档对应给出的判断点。
两个限制需要明确:
- HTTP/2 只配置在代理层,只有真正经过这台 Nginx 的流量才享受该配置;Airflow 侧不需要改动;
- 若你使用 Helm chart 部署,代理相关配置的入口不同(API server 参数与 ingress 注解),可参见 run-behind-proxy.rst 中的 Helm Chart Configuration 一节。
【免费下载链接】airflowApache Airflow - A platform to programmatically author, schedule, and monitor workflows项目地址: https://gitcode.com/GitHub_Trending/ai/airflow
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考