过去几天我一直被这个问题困扰,所以希望我是否能得到某人的见解...... 我在 docker 中有一个 python grpc 服务器,它在本地运行良好。问题是,一旦部署到 Azure App Service 上,请求总是返回 503 服务不可用。我看到的日志流如下:
023-09-06T17:57:27.440709740Z Server started, listening on 50051
2023-09-06T18:07:31.176838969Z Server started, listening on 50051
2023-09-06T18:17:30.829370909Z Server started, listening on 50051
2023-09-06T18:27:31.834088285Z Server started, listening on 50051
2023-09-06T18:37:32.414292994Z Server started, listening on 50051
/home/LogFiles/2023_09_06_ln1sdlwk0000CQ_docker.log (https://mysite.scm.azurewebsites.net/api/vfs/LogFiles/2023_09_06_ln1sdlwk0000CQ_docker.log)
2023-09-06T18:39:38.365Z INFO - Waiting for response to warmup request for container mysite_0_ce82c4e3. Elapsed time = 127.1765748 sec
2023-09-06T18:39:55.833Z INFO - Waiting for response to warmup request for container mysite_0_ce82c4e3**. Elapsed time = 144.6447916 sec**
2023-09-06T18:40:10.908Z INFO - Waiting for response to warmup request for container mysite_0_ce82c4e3**. Elapsed time = 159.7197992 sec**
2023-09-06T18:40:25.989Z INFO - Waiting for response to warmup request for container mysite_0_ce82c4e3**. Elapsed time = 174.8003644 sec**
2023-09-06T18:40:42.860Z INFO - Waiting for response to warmup request for container mysite_0_ce82c4e3**. Elapsed time = 191.6716851 sec**
2023-09-06T18:40:58.381Z INFO - Waiting for response to warmup request for container mysite_0_ce82c4e3**. Elapsed time = 207.1929065 sec**
2023-09-06T18:41:13.464Z INFO - Waiting for response to warmup request for container mysite_0_ce82c4e3**. Elapsed time = 222.2752554 sec**
2023-09-06T18:41:21.372Z ERROR - Container mysite_0_ce82c4e3****for site mysite did not start within expected time limit. Elapsed time = 230.1834844 sec
2023-09-06T18:41:21.381Z ERROR - Container mysite_0_ce82c4e3****didn't respond to HTTP pings on port: 50051, failing site start. See container logs for debugging.
2023-09-06T18:41:21.388Z INFO - Stopping site mysite because it failed during startup.
我按照这个文档并配置了每个设置,因为它说要更改。 https://github.com/Azure/app-service-linux-docs/blob/master/HowTo/gRPC/Python/Flask/README.md 但是对已部署端点的 grpc 调用返回 503。我相信 503 是因为应用程序在预热请求未根据日志流返回其响应后停止。 我不确定为什么预热请求没有返回响应。有谁知道我该如何解决/解决这个问题?任何帮助将不胜感激!
我尝试了这个部署步骤:
导航至 Web 应用程序左侧窗格中“设置”下的“配置” 单击常规设置选项卡并向下滚动到平台设置 转到 HTTP 版本下拉列表并选择 2.0 点击保存 这将重新启动您的应用程序并配置前端以允许客户端进行 HTTP/2 调用。
在同一平台设置部分下,找到 HTTP 2.0 代理设置并将其切换为打开。 点击保存 启用后,此设置会将您的站点配置为转发 HTTP/2 请求。
导航至 Web 应用程序左侧窗格中“设置”下的“配置”。 在“应用程序设置”下,单击“新应用程序设置” 将以下应用程序设置添加到您的应用程序 名称 = HTTP20_ONLY_PORT 值 = 50051 此设置将与您的 Web 应用程序通信,指定哪个端口仅通过 HTTP/2 侦听。
导航至 Web 应用程序左侧窗格中“设置”下的“配置”。 在“应用程序设置”下,单击“新应用程序设置” 将以下应用程序设置添加到您的应用程序 名称 = SCM_DO_BUILD_DURING_DEPLOYMENT 值=真 6.添加自定义启动命令(我没有按照这一步,因为我是用docker部署的,docker有启动命令) 为了确保您的应用程序正常启动,我们需要设置一个自定义启动命令来启动 grpc 和 Flask 服务器。
导航至 Web 应用程序左侧窗格中“设置”下的“配置”。 在常规设置下,添加以下启动命令 python app.py 7. 保存您的应用程序配置 单击配置页面顶部的保存按钮。这将重新启动您的应用程序并应用所有更新的应用程序设置。
我也遇到了同样的问题。我相信这是因为在启动过程中,Azure 应用服务向服务器发送 HTTP 1.1 ping 并期望得到响应。但是,gRPC 服务正在侦听 HTTP 2 请求。因此,Azure 应用服务没有得到响应并停止容器。
为了解决这个问题,我添加了一个非常简单的 Flask 服务器:
from flask import Flask
app = Flask(__name__)
## Required for HTTP 1.1 pings by Azure App Service
@app.route('/')
def func():
return "Hello!"
然后我并行运行 Flask 服务器和 gRPC 服务器:
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
support_pb2_grpc.add_SupportServiceServicer_to_server(SupportService(), server)
port = os.environ.get('PORT', '50051')
server.add_insecure_port(f'[::]:{port}')
server.start()
return server
if __name__ == '__main__':
## Run Flask (HTTP 1.1) and gRPC (HTTP 2) servers in parallel
grpc_server = serve()
app.run(host="0.0.0.0", port=8000)
(请注意,这还不是生产就绪的,只是概念验证)。
然后在我的 Azure 应用服务配置中,我设置 HTTP20_ONLY_PORT=50051 和 WEBSITES_PORT=8000。
问题就解决了。应用程序服务能够成功启动。