Cloud Foundry 中部署的 Slack Bot 返回 502 Bad Gateway 错误

Sim*_*wer 1 cloud-foundry pcf slack-api slack slack-commands

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

\n

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

\n
[CELL/0] [OUT] Downloading droplet...\n[CELL/SSHD/0] [OUT] Exit status 0\n[APP/PROC/WEB/0] [OUT] Exit status 143\n[CELL/0] [OUT] Cell e6cf018d-0bdd-41ca-8b70-bdc57f3080f1 destroying container for instance 28d594ba-c681-40dd-4514-99b6\n[PROXY/0] [OUT] Exit status 137\n[CELL/0] [OUT] Downloaded droplet (81.1M)\n[CELL/0] [OUT] Cell e6cf018d-0bdd-41ca-8b70-bdc57f3080f1 successfully destroyed container for instance 28d594ba-c681-40dd-4514-99b6\n[APP/PROC/WEB/0] [OUT] \xe2\x9a\xa1\xef\xb8\x8f Bolt app is running! (development server)\n[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"\n
Run Code Online (Sandbox Code Playgroud)\n

除此之外endpoint_failure (use of closed network connection),我还看到:

\n
    \n
  • x_cf_routererror:"endpoint_failure (EOF (via idempotent request))"
  • \n
  • x_cf_routererror:"endpoint_failure (EOF)"
  • \n
\n

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

\n

在 Slack 中,URL 结尾为/slack/events

\n

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

\n

清单.yml:

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

Dan*_*usa 5

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

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

通常情况下,这种情况不应该发生。系统具有适当的运行状况检查,以确保应用程序正常运行并侦听请求。如果不是,应用程序将无法正确启动。

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

平台将传递一个$PORT带有值的环境变量(它始终是 8080,但将来可能会改变)。您需要确保您的应用程序正在侦听该端口。另外,您想在 0.0.0.0 上监听,而不是 localhost 或 127.0.0.1。

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