部署在 Cloud Foundry 中的 Slack Bot returns 502 Bad Gateway 错误

Slack Bot deployed in Cloud Foundry returns 502 Bad Gateway errors

在 Slack 中,我设置了一个带有斜杠命令的应用程序。当我使用本地 ngrok 服务器时,该应用程序运行良好。

但是,当我将应用服务器部署到 PCF 时,它返回 502 错误:

[CELL/0] [OUT] Downloading droplet...
[CELL/SSHD/0] [OUT] Exit status 0
[APP/PROC/WEB/0] [OUT] Exit status 143
[CELL/0] [OUT] Cell e6cf018d-0bdd-41ca-8b70-bdc57f3080f1 destroying container for instance 28d594ba-c681-40dd-4514-99b6
[PROXY/0] [OUT] Exit status 137
[CELL/0] [OUT] Downloaded droplet (81.1M)
[CELL/0] [OUT] Cell e6cf018d-0bdd-41ca-8b70-bdc57f3080f1 successfully destroyed container for instance 28d594ba-c681-40dd-4514-99b6
[APP/PROC/WEB/0] [OUT] ⚡️ Bolt app is running! (development server)
[OUT] [APP ROUTE] - [2021-12-23T20:35:11.460507625Z] "POST /slack/events HTTP/1.1" 502 464 67 "-" "Slackbot 1.0 (+https://api.slack.com/robots)" "10.0.1.28:56002" "10.0.6.79:61006" x_forwarded_for:"3.91.15.163, 10.0.1.28" x_forwarded_proto:"https" vcap_request_id:"7fe6cea6-180a-4405-5e5e-6ba9d7b58a8f" response_time:0.003282 gorouter_time:0.000111 app_id:"f1ea0480-9c6c-42ac-a4b8-a5a4e8efe5f3" app_index:"0" instance_id:"f46918db-0b45-417c-7aac-bbf2" x_cf_routererror:"endpoint_failure (use of closed network connection)" x_b3_traceid:"31bf5c74ec6f92a20f0ecfca00e59007" x_b3_spanid:"31bf5c74ec6f92a20f0ecfca00e59007" x_b3_parentspanid:"-" b3:"31bf5c74ec6f92a20f0ecfca00e59007-31bf5c74ec6f92a20f0ecfca00e59007"

除了endpoint_failure (use of closed network connection),我还看到:

在 PCF 中,我为应用程序创建了一个 https:// 路由。这是 URL 我放入 Slack 应用程序的“重定向 URLs” 部分以及我的 Slash 命令 URL.

在 Slack 中,URL 以 /slack/events

结尾

这个配置在本地运行良好,所以我想我错过了 PCF 中的一个配置点。

Manifest.yml:

applications:
- name: kafbot
  buildpacks:
    - https://github.com/starkandwayne/librdkafka-buildpack/releases/download/v1.8.2/librdkafka_buildpack-cached-cflinuxfs3-v1.8.2.zip
    - https://github.com/cloudfoundry/python-buildpack/releases/download/v1.7.48/python-buildpack-cflinuxfs3-v1.7.48.zip
  instances: 1
  disk_quota: 2G
#  health-check-type: process
  memory: 4G
  routes:
    - route: "kafbot.apps.prod.fake_org.cloud"
  env:
    KAFKA_BROKER: 10.32.17.182:9092,10.32.17.183:9092,10.32.17.184:9092,10.32.17.185:9092
    SLACK_BOT_TOKEN: ((slack_bot_token))
    SLACK_SIGNING_SECRET: ((slack_signing_key))
  command: python app.py

x_cf_routererrorendpoint_failure时,这意味着应用程序由于某种原因没有处理Gorouter发送给它的请求。

从那里,您想查看 response_time。如果响应时间很长(通常与超时值相同,几乎正好是 60 秒),则意味着您的应用程序响应速度不够快。如果该值较低,则可能意味着存在连接问题,例如 Gorouter 尝试建立 TCP 连接但无法建立连接。

这通常不应该发生。系统有适当的健康检查,确保应用程序已启动并正在侦听请求。否则,应用程序将无法正常启动。

在这种特殊情况下,清单具有 health-check-type: process,它禁用了标准的基于端口的健康检查并使用了基于进程的健康检查。这允许应用程序启动,即使它不在正确的端口上。因此,当 Gorouter 在预期端口上向应用程序发送请求时,它无法连接到应用程序的端口。旁注:通常,如果您的应用程序未侦听传入请求,您只会使用基于进程的健康检查。

平台将传入一个 $PORT 环境变量,其中包含一个值(它始终为 8080,但将来可能会更改)。您需要确保您的应用正在侦听该端口。此外,您想在 0.0.0.0 上收听,而不是本地主机或 127.0.0.1。

这应该确保 Gorouter 可以在约定的端口上向您的应用程序发送请求。