504-仅在 django 函数中网关超时

504- Gateway timeout only in django function

我有一个非常令人难以置信的问题,我的团队一直在努力解决它。我们确实缩小了范围,但不是 100%。

简介

我们正在尝试使用 Vue 前端在 Django 应用程序中实施 LTI。要从 URL 获取令牌,后端会向 URL 发出一个带有数据的 POST 请求,如果它已过期或无效,则应该收到一个令牌或错误。

设计


浏览器 ---- POST REQUEST --> 在 Server (Django) 上查看功能 --- POST REQUEST --> Auth URL

问题


Django 视图发出的 post 请求超时 504 Gateway Timeout。如果服务器花费大量时间,这可能是正常的。但是,增加时间并没有帮助并使用 POSTMAN 检查 Auth URL 它工作正常并且没有关闭。

我试过的


我们决定调试或诊断此问题,即为什么代码块在通过 shell 调用时在函数中起作用,但在通过 POST 请求调用时却不起作用。

  1. 取消前端并使用 POSTMAN 向我的 Django 服务器发送 POST 请求 -- Auth 超时 URL
  2. 使用 Django shell 调用了相同的函数 -- 有效
  3. 将代码复制到 Django 之外的一个单独的 python 文件中 -- 有效
  4. 以上所有使用相同的虚拟环境

看起来是什么


当调用 POST 函数并在其中发出另一个 post 请求时,它会超时。请注意:如果我在相同情况下使用无效数据(比如缺少 grant_type)发出 POST 请求,则它不会超时。


代码块


auth_request = {
    "grant_type": "client_credentials",
    "client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
    "client_assertion": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlJVbzNJWWlSR0ZDYUhNNEg0S2lid095enAtRU9KWlAweXkwd0g3bk5VOEEifQ.eyJpc3MiOiI2NjkxNmZmYy03YjE5LTQ0MWEtYjE5Zi0yOGQxMzVmYjZjOWYiLCJzdWIiOiI2NjkxNmZmYy03YjE5LTQ0MWEtYjE5Zi0yOGQxMzVmYjZjOWYiLCJhdWQiOiJodHRwczovL2RldmVsb3Blci5ibGFja2JvYXJkLmNvbS9hcGkvdjEvZ2F0ZXdheS9vYXV0aDIvand0dG9rZW4iLCJpYXQiOjE2NTMyODcyNzMsImV4cCI6MTY1MzI4NzMzOCwianRpIjoibHRpLXNlcnZpY2UtdG9rZW4tMDQyZTZhNjctNDA2My00YmQ1LWI2NmQtNTM4YjU2ZTllM2Q1In0.8Jaou965cPTCFv-7yP9iIlH8mMgQjAi0AR2li0KwCcRuHsRZ_1OpbE83bZ06RMXhbjA4crRqTI4zMi8aNfq16Mkg4lXoPj8JiJW7q8b_ZQ1rLZvIojmabehYjpyscHRitFPLibfTYF2mCjUyHqwPgnFRLNrHIVuSvM0BiK56PuYK6SiiSjxu2U3bmJqOHNW2mqx2YYfkaXx2u7ru6CKTiL3KBGzFPYjCUwwWNBdbz4R0g0aHK_l-hhA3oi_pCDZOyqdnyCmGAj5SpZbuZOqrZbQBrqPoEFtXdNDPpHGGwW7IUbbmCtsmE2NqQiYt6snmK-1pbxsLxE0mXrpDqASh4A",
    "scope": "https://purl.imsglobal.org/spec/lti-nrps/scope/contextmembership.readonly",
}
response = requests.post(
    "https://developer.blackboard.com/api/v1/gateway/oauth2/jwttoken",
    data=auth_request,
)
response = response.json()
print(response)

经过数天的摸索,我们使用 Production 设置部署了项目并且成功了。在调查为什么它不能进行分期时,我们发现以下内容:

  1. 前端向后端发送POST请求
  2. 后端然后使用私钥对数据进行编码并将其发送到第 3 方服务器
  3. 因为第 3 方服务器需要验证我们的 jwks 消息,它向我们的暂存服务器上的 URL 发送了另一个请求。
  4. 第三个请求没有得到处理,因为服务器只有一个线程。将线程参数添加到 gunicorn 就成功了

gunicorn ripple.wsgi --reload --log-level debug --threads 4