Apache2 服务器和 Superset,502 代理错误,加载仪表板时从远程服务器读取错误
Apache2 server and Superset, 502 Proxy Error, error reading from remote server while dashboards loading
简短介绍
我的 Apache Superset 和 Apache2 服务器位于同一个 EC2 实例上。 Apache2 充当代理服务器。它接受 HTTPS 请求并将它们传输到 Apache Superset。 Apache Superset 是 运行 使用 gunicorn
.
问题
向 Apache Dremio 数据引擎发出请求可能需要一些时间(< 60 秒)。当访问 Superset 上的仪表板时,使用带有 SSL 的 DNS 名称和代理设置,某些仪表板部分(请求)失败并出现以下错误:
Proxy Error
The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request
Reason: Error reading from remote server
奇怪的是,尽管 ProxyTimeout
的默认值相当高,但这些错误可能会在几秒钟内出现。
如果通过IP地址访问Superset,则不会出现该问题。
apache2/error.log
中的错误消息:
(20014) Internal error (specific information not available): [client 10.4.26.3:6969] AH01102: error reading status line from remote server localhost:8088, referer: ...
尝试解决问题的方法
问题可能出在代理服务器超时或 Superset 网络服务器断开某些连接。我的 Apache2 配置:
<VirtualHost *:443>
ProxyPreserveHost On
ProxyRequests Off
ServerName dash.domain.com
ServerAlias dash.domain.com
SSLEngine on
SSLCertificateFile /etc/ssl/private/cert.crt
SSLCertificateChainFile /etc/ssl/certs/cert2.crt
SSLCertificateKeyFile /etc/ssl/private/key.key
ProxyPass / http://localhost:8088/ connectiontimeout=3600 timeout=3600
ProxyPassReverse / http://localhost:8088/
# things tried
# SetEnv force-proxy-request-1.0 1
# SetEnv proxy-nokeepalive 1
# SetEnv proxy-initial-not-pooled 1
# ProxyTimeout 3600
# TimeOut 3600
</VirtualHost>
经过测试的东西(但不工作):
Timeout
和 ProxyTimeout
connectiontimeout
和 timeout
(如上所示)
Keepalive=On
用于 ProxyPass
- 不同的 SetEnv
superset_config.py
-> ENABLE_PROXY_FIX, SUPERSET_WEBSERVER_TIMEOUT
此外,使用 nginx
构建了类似的代理设置,错误与此处描述的类似。
如有任何帮助或想法,我们将不胜感激。非常感谢!
有用信息
Apache 超集版本:0.37.2
Apache Dremio 版本:4.1.0
Apache2 服务器版本:2.4.29
EC2实例类型:t3.medium
OS版本:Ubuntu18.04
问题出在垂死的 gunicorn async worker 中。来自图表的请求太多,工作人员无法处理它们。将 worker 类型从 async 更改为 sync(默认 gunicorn 类型)解决了代理问题。
我仍然不知道为什么通过 IP 直接访问没有产生 502 代理错误。
抱歉,问题中没有包含有关 gunicorn
的信息。
P.S 从他们的文档中推荐的 Apache Superset worker 类型是 async,但是,对于我来说,sync是更好的解决方案。理论上,同步工作者比异步(在超集上下文中)慢。
关注这篇详细文章:https://www.tessian.com/blog/how-to-fix-http-502-errors/
我们已经尝试了建议的修复(基于 AWS ALB 默认连接空闲超时 = 60 秒设置):
Gunicorn (Python)
As command line arguments:
--keep-alive 65
很有魅力!
并解释“为什么通过 IP 直接访问没有产生 502 代理错误”,查看这个 Gunicorn 设置文档:
https://docs.gunicorn.org/en/stable/settings.html#keepalive
Generally set in the 1-5 seconds range for servers with direct connection to the client (e.g. when you don’t have separate load balancer).
由于默认的keepalive设置为2秒,因此在通过IP直接访问时效果很好。
简短介绍
我的 Apache Superset 和 Apache2 服务器位于同一个 EC2 实例上。 Apache2 充当代理服务器。它接受 HTTPS 请求并将它们传输到 Apache Superset。 Apache Superset 是 运行 使用 gunicorn
.
问题
向 Apache Dremio 数据引擎发出请求可能需要一些时间(< 60 秒)。当访问 Superset 上的仪表板时,使用带有 SSL 的 DNS 名称和代理设置,某些仪表板部分(请求)失败并出现以下错误:
Proxy Error
The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request
Reason: Error reading from remote server
奇怪的是,尽管 ProxyTimeout
的默认值相当高,但这些错误可能会在几秒钟内出现。
如果通过IP地址访问Superset,则不会出现该问题。
apache2/error.log
中的错误消息:
(20014) Internal error (specific information not available): [client 10.4.26.3:6969] AH01102: error reading status line from remote server localhost:8088, referer: ...
尝试解决问题的方法
问题可能出在代理服务器超时或 Superset 网络服务器断开某些连接。我的 Apache2 配置:
<VirtualHost *:443>
ProxyPreserveHost On
ProxyRequests Off
ServerName dash.domain.com
ServerAlias dash.domain.com
SSLEngine on
SSLCertificateFile /etc/ssl/private/cert.crt
SSLCertificateChainFile /etc/ssl/certs/cert2.crt
SSLCertificateKeyFile /etc/ssl/private/key.key
ProxyPass / http://localhost:8088/ connectiontimeout=3600 timeout=3600
ProxyPassReverse / http://localhost:8088/
# things tried
# SetEnv force-proxy-request-1.0 1
# SetEnv proxy-nokeepalive 1
# SetEnv proxy-initial-not-pooled 1
# ProxyTimeout 3600
# TimeOut 3600
</VirtualHost>
经过测试的东西(但不工作):
Timeout
和ProxyTimeout
connectiontimeout
和timeout
(如上所示)Keepalive=On
用于 ProxyPass- 不同的 SetEnv
superset_config.py
-> ENABLE_PROXY_FIX, SUPERSET_WEBSERVER_TIMEOUT
此外,使用 nginx
构建了类似的代理设置,错误与此处描述的类似。
如有任何帮助或想法,我们将不胜感激。非常感谢!
有用信息
Apache 超集版本:0.37.2
Apache Dremio 版本:4.1.0
Apache2 服务器版本:2.4.29
EC2实例类型:t3.medium
OS版本:Ubuntu18.04
问题出在垂死的 gunicorn async worker 中。来自图表的请求太多,工作人员无法处理它们。将 worker 类型从 async 更改为 sync(默认 gunicorn 类型)解决了代理问题。
我仍然不知道为什么通过 IP 直接访问没有产生 502 代理错误。
抱歉,问题中没有包含有关 gunicorn
的信息。
P.S 从他们的文档中推荐的 Apache Superset worker 类型是 async,但是,对于我来说,sync是更好的解决方案。理论上,同步工作者比异步(在超集上下文中)慢。
关注这篇详细文章:https://www.tessian.com/blog/how-to-fix-http-502-errors/
我们已经尝试了建议的修复(基于 AWS ALB 默认连接空闲超时 = 60 秒设置):
Gunicorn (Python)
As command line arguments:
--keep-alive 65
很有魅力!
并解释“为什么通过 IP 直接访问没有产生 502 代理错误”,查看这个 Gunicorn 设置文档: https://docs.gunicorn.org/en/stable/settings.html#keepalive
Generally set in the 1-5 seconds range for servers with direct connection to the client (e.g. when you don’t have separate load balancer).
由于默认的keepalive设置为2秒,因此在通过IP直接访问时效果很好。