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
请求调用时却不起作用。
- 取消前端并使用
POSTMAN
向我的 Django 服务器发送 POST
请求 -- Auth 超时 URL
- 使用
Django
shell
调用了相同的函数 -- 有效
- 将代码复制到 Django 之外的一个单独的 python 文件中 -- 有效
- 以上所有使用相同的虚拟环境
看起来是什么
当调用 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
设置部署了项目并且成功了。在调查为什么它不能进行分期时,我们发现以下内容:
- 前端向后端发送POST请求
- 后端然后使用私钥对数据进行编码并将其发送到第 3 方服务器
- 因为第 3 方服务器需要验证我们的
jwks
消息,它向我们的暂存服务器上的 URL 发送了另一个请求。
- 第三个请求没有得到处理,因为服务器只有一个线程。将线程参数添加到
gunicorn
就成功了
gunicorn ripple.wsgi --reload --log-level debug --threads 4
我有一个非常令人难以置信的问题,我的团队一直在努力解决它。我们确实缩小了范围,但不是 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
请求调用时却不起作用。
- 取消前端并使用
POSTMAN
向我的 Django 服务器发送POST
请求 -- Auth 超时 URL - 使用
Django
shell
调用了相同的函数 -- 有效 - 将代码复制到 Django 之外的一个单独的 python 文件中 -- 有效
- 以上所有使用相同的虚拟环境
看起来是什么
当调用 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
设置部署了项目并且成功了。在调查为什么它不能进行分期时,我们发现以下内容:
- 前端向后端发送POST请求
- 后端然后使用私钥对数据进行编码并将其发送到第 3 方服务器
- 因为第 3 方服务器需要验证我们的
jwks
消息,它向我们的暂存服务器上的 URL 发送了另一个请求。 - 第三个请求没有得到处理,因为服务器只有一个线程。将线程参数添加到
gunicorn
就成功了
gunicorn ripple.wsgi --reload --log-level debug --threads 4