Azure 应用程序服务上的 GRPC python 服务器部署不起作用

问题描述 投票:0回答:1

过去几天我一直被这个问题困扰,所以希望我是否能得到某人的见解...... 我在 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 是因为应用程序在预热请求未根据日志流返回其响应后停止。 我不确定为什么预热请求没有返回响应。有谁知道我该如何解决/解决这个问题?任何帮助将不胜感激!

我尝试了这个部署步骤:

  1. 启用HTTP版本 您需要配置的第一个设置是 HTTP 版本

导航至 Web 应用程序左侧窗格中“设置”下的“配置” 单击常规设置选项卡并向下滚动到平台设置 转到 HTTP 版本下拉列表并选择 2.0 点击保存 这将重新启动您的应用程序并配置前端以允许客户端进行 HTTP/2 调用。

  1. 启用 HTTP 2.0 代理 接下来,您需要配置 HTTP 2.0 代理:

在同一平台设置部分下,找到 HTTP 2.0 代理设置并将其切换为打开。 点击保存 启用后,此设置会将您的站点配置为转发 HTTP/2 请求。

  1. 添加HTTP20_ONLY_PORT应用程序设置 之前,我们将应用程序配置为侦听特定的仅 HTTP/2 端口。在这里,我们将添加一个应用程序设置 HTTP20_ONLY_PORT 并将该值作为我们之前使用的端口号。

导航至 Web 应用程序左侧窗格中“设置”下的“配置”。 在“应用程序设置”下,单击“新应用程序设置” 将以下应用程序设置添加到您的应用程序 名称 = HTTP20_ONLY_PORT 值 = 50051 此设置将与您的 Web 应用程序通信,指定哪个端口仅通过 HTTP/2 侦听。

  1. 添加SCM_DO_BUILD_DURING_DEPLOYMENT应用程序设置 为了确保我们的应用程序运行 pip install 来解析 requests.txt 中指定的所有依赖项,我们需要设置以下应用程序设置。

导航至 Web 应用程序左侧窗格中“设置”下的“配置”。 在“应用程序设置”下,单击“新应用程序设置” 将以下应用程序设置添加到您的应用程序 名称 = SCM_DO_BUILD_DURING_DEPLOYMENT 值=真 6.添加自定义启动命令(我没有按照这一步,因为我是用docker部署的,docker有启动命令) 为了确保您的应用程序正常启动,我们需要设置一个自定义启动命令来启动 grpc 和 Flask 服务器。

导航至 Web 应用程序左侧窗格中“设置”下的“配置”。 在常规设置下,添加以下启动命令 python app.py 7. 保存您的应用程序配置 单击配置页面顶部的保存按钮。这将重新启动您的应用程序并应用所有更新的应用程序设置。

python docker azure-web-app-service grpc grpc-python
1个回答
0
投票

我也遇到了同样的问题。我相信这是因为在启动过程中,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。

问题就解决了。应用程序服务能够成功启动。

© www.soinside.com 2019 - 2024. All rights reserved.