uvicorn 在 AWS Fargate 上 1-2 分钟后关闭

2024-02-04

我在 AWS Fargate 上使用 Python 3.10.1 和应用程序负载均衡器部署了 FastAPI 0.81.0 + uvicorn 0.18.3。服务器在我的本地 Docker 中无限期地运行(如预期),但是在 AWS 上,应用程序总是在 1-2 分钟后关闭。

这是 Docker 中的 uvicorn 调用:

CMD ["uvicorn", "--host", "0.0.0.0", "--port", "8000", "--log-level", "trace", "app.main:app"]

我的 FastAPI 应用程序如下所示:

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

app = FastAPI()
origins = [
    "*"
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.get("/")
async def root():
    return {"Hello": "World"}

这可能与负载均衡器有关,因为我的 Fargate 服务的 RAM 使用率并不太高:

通常的嫌疑人似乎是通过 TCP 而不是 HTTP 进行健康检查 https://stackoverflow.com/questions/70611806/fastapi-server-running-on-aws-app-runner-fails-after-24-hours,但是据我所知,Fargate 任务定义或 EC2 目标组中默认情况下已分别通过 HTTP 进行运行状况检查。

以下是我的 Fargate 任务的日志:

2022-09-22 18:43:46 INFO: Finished server process [1]
2022-09-22 18:43:46 INFO: Waiting for application shutdown.
2022-09-22 18:43:46 TRACE: ASGI [1] Receive {'type': 'lifespan.shutdown'}
2022-09-22 18:43:46 TRACE: ASGI [1] Send {'type': 'lifespan.shutdown.complete'}
2022-09-22 18:43:46 TRACE: ASGI [1] Completed
2022-09-22 18:43:46 INFO: Application shutdown complete.
2022-09-22 18:43:45 INFO: Shutting down
2022-09-22 18:43:39 TRACE: 172.31.21.3:16662 - ASGI [7] Send {'type': 'http.response.body', 'body': '<17 bytes>'}
2022-09-22 18:43:39 TRACE: 172.31.21.3:16662 - ASGI [7] Completed
2022-09-22 18:43:39 TRACE: 172.31.21.3:16662 - HTTP connection lost
2022-09-22 18:43:39 INFO: 172.31.21.3:16662 - "GET / HTTP/1.1" 200 OK
2022-09-22 18:43:39 TRACE: 172.31.21.3:16662 - HTTP connection made
2022-09-22 18:43:39 TRACE: 172.31.21.3:16662 - ASGI [7] Started scope={'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.31.30.157', 8000), 'client': ('172.31.21.3', 16662), 'scheme': 'http', 'method': 'GET', 'root_path': '', 'path': '/', 'raw_path': b'/', 'query_string': b'', 'headers': '<...>'}
2022-09-22 18:43:39 TRACE: 172.31.21.3:16662 - ASGI [7] Send {'type': 'http.response.start', 'status': 200, 'headers': '<...>'}
2022-09-22 18:43:39 INFO: 172.31.47.71:3856 - "GET / HTTP/1.1" 200 OK
2022-09-22 18:43:39 TRACE: 172.31.47.71:3856 - ASGI [6] Send {'type': 'http.response.body', 'body': '<17 bytes>'}
2022-09-22 18:43:39 TRACE: 172.31.47.71:3856 - ASGI [6] Completed
2022-09-22 18:43:39 TRACE: 172.31.47.71:3856 - HTTP connection lost
2022-09-22 18:43:39 TRACE: 172.31.47.71:3856 - HTTP connection made
2022-09-22 18:43:39 TRACE: 172.31.47.71:3856 - ASGI [6] Started scope={'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.31.30.157', 8000), 'client': ('172.31.47.71', 3856), 'scheme': 'http', 'method': 'GET', 'root_path': '', 'path': '/', 'raw_path': b'/', 'query_string': b'', 'headers': '<...>'}
2022-09-22 18:43:39 TRACE: 172.31.47.71:3856 - ASGI [6] Send {'type': 'http.response.start', 'status': 200, 'headers': '<...>'}
2022-09-22 18:43:09 TRACE: 172.31.21.3:39448 - ASGI [5] Completed
2022-09-22 18:43:09 TRACE: 172.31.21.3:39448 - HTTP connection lost
2022-09-22 18:43:09 TRACE: 172.31.21.3:39448 - ASGI [5] Send {'type': 'http.response.body', 'body': '<17 bytes>'}
2022-09-22 18:43:09 TRACE: 172.31.21.3:39448 - HTTP connection made
2022-09-22 18:43:09 TRACE: 172.31.21.3:39448 - ASGI [5] Started scope={'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.31.30.157', 8000), 'client': ('172.31.21.3', 39448), 'scheme': 'http', 'method': 'GET', 'root_path': '', 'path': '/', 'raw_path': b'/', 'query_string': b'', 'headers': '<...>'}
2022-09-22 18:43:09 TRACE: 172.31.21.3:39448 - ASGI [5] Send {'type': 'http.response.start', 'status': 200, 'headers': '<...>'}
2022-09-22 18:43:09 INFO: 172.31.21.3:39448 - "GET / HTTP/1.1" 200 OK
2022-09-22 18:43:09 TRACE: 172.31.47.71:50778 - ASGI [4] Completed
2022-09-22 18:43:09 TRACE: 172.31.47.71:50778 - HTTP connection lost
2022-09-22 18:43:09 TRACE: 172.31.47.71:50778 - ASGI [4] Send {'type': 'http.response.start', 'status': 200, 'headers': '<...>'}
2022-09-22 18:43:09 INFO: 172.31.47.71:50778 - "GET / HTTP/1.1" 200 OK
2022-09-22 18:43:09 TRACE: 172.31.47.71:50778 - ASGI [4] Send {'type': 'http.response.body', 'body': '<17 bytes>'}
2022-09-22 18:43:09 TRACE: 172.31.47.71:50778 - HTTP connection made
2022-09-22 18:43:09 TRACE: 172.31.47.71:50778 - ASGI [4] Started scope={'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.31.30.157', 8000), 'client': ('172.31.47.71', 50778), 'scheme': 'http', 'method': 'GET', 'root_path': '', 'path': '/', 'raw_path': b'/', 'query_string': b'', 'headers': '<...>'}
2022-09-22 18:42:39 INFO: 172.31.47.71:55984 - "GET / HTTP/1.1" 200 OK
2022-09-22 18:42:39 TRACE: 172.31.47.71:55984 - ASGI [3] Send {'type': 'http.response.start', 'status': 200, 'headers': '<...>'}
2022-09-22 18:42:39 TRACE: 172.31.47.71:55984 - ASGI [3] Send {'type': 'http.response.body', 'body': '<17 bytes>'}
2022-09-22 18:42:39 TRACE: 172.31.47.71:55984 - ASGI [3] Completed
2022-09-22 18:42:39 TRACE: 172.31.47.71:55984 - HTTP connection lost
2022-09-22 18:42:39 TRACE: 172.31.21.3:59240 - HTTP connection lost
2022-09-22 18:42:39 TRACE: 172.31.47.71:55984 - ASGI [3] Started scope={'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.31.30.157', 8000), 'client': ('172.31.47.71', 55984), 'scheme': 'http', 'method': 'GET', 'root_path': '', 'path': '/', 'raw_path': b'/', 'query_string': b'', 'headers': '<...>'}
2022-09-22 18:42:39 TRACE: 172.31.21.3:59240 - ASGI [2] Completed
2022-09-22 18:42:39 TRACE: 172.31.47.71:55984 - HTTP connection made
2022-09-22 18:42:39 INFO: 172.31.21.3:59240 - "GET / HTTP/1.1" 200 OK
2022-09-22 18:42:39 TRACE: 172.31.21.3:59240 - ASGI [2] Send {'type': 'http.response.body', 'body': '<17 bytes>'}
2022-09-22 18:42:39 TRACE: 172.31.21.3:59240 - ASGI [2] Started scope={'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.31.30.157', 8000), 'client': ('172.31.21.3', 59240), 'scheme': 'http', 'method': 'GET', 'root_path': '', 'path': '/', 'raw_path': b'/', 'query_string': b'', 'headers': '<...>'}
2022-09-22 18:42:39 TRACE: 172.31.21.3:59240 - ASGI [2] Send {'type': 'http.response.start', 'status': 200, 'headers': '<...>'}
2022-09-22 18:42:39 TRACE: 172.31.21.3:59240 - HTTP connection made
2022-09-22 18:42:30 INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
2022-09-22 18:42:30 INFO: Waiting for application startup.
2022-09-22 18:42:30 TRACE: ASGI [1] Started scope={'type': 'lifespan', 'asgi': {'version': '3.0', 'spec_version': '2.0'}}
2022-09-22 18:42:30 TRACE: ASGI [1] Receive {'type': 'lifespan.startup'}
2022-09-22 18:42:30 TRACE: ASGI [1] Send {'type': 'lifespan.startup.complete'}
2022-09-22 18:42:30 INFO: Application startup complete.
2022-09-22 18:42:30 INFO: Started server process [1]

关于如何解决这个问题有什么建议吗?谢谢!


我们之前遇到过这个问题,需要为任务添加更多 RAM。更多的 CPU 也没有坏处。尝试为您的任务提供更多内存,看看问题是否仍然存在。如果它再次工作,则只要它仍然工作,就缩小内存。

EDIT我问了我团队的一个开发人员,他说有一个空闲时间,你可以配置,如果应用程序空闲一段时间就会关闭,你可以设置这个属性--timeout.

gunicorn \
    --log-config 'logging.conf'
    --timeout 6000
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uvicorn 在 AWS Fargate 上 1-2 分钟后关闭 的相关文章

  • 由于 play-services-base-17.1.0.aar 转换错误,无法构建项目

    所以基本上我已经快一年没有打开我的 Android Studio 项目了 这次是打开和构建它的时候了 更新 Android Studio 和项目的所有插件后 我终于遇到了这个错误 Execution failed for task app
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是
  • 如何从 Magento One Page Checkout 获取发布数据?

    为了在 Magento Checkout 中添加客户评论字段 我在相应的模板文件中添加了一个文本字段 并使用如下观察器将评论添加到订单中 comment strip tags Mage app gt getRequest gt getPar
  • 如何在 iOS 中注册自定义文件类型

    我目前正在创建一个应用程序 我想让用户在其中备份他们的文件 plist m4a 我压缩文件并将扩展名更改为自定义扩展名 专门针对我的应用程序 例如 MyBackup 然后 用户可以通过电子邮件或 iTunes 文件共享进行导出 我已经阅读过
  • 多边形内的 SQL 地理点在 STIntersect 上不返回 true(但使用 Geometry 返回 true)

    我不想仅仅为了在 STIntersect 中返回 true 而将地理数据转换为几何图形 下面是 SQL 中的代码 DECLARE point GEOGRAPHY GEOGRAPHY Point 1 1 4326 DECLARE polygo
  • 如何更改 aptana studio 的背景颜色?

    如何将 Aptana IDE 或整个主题 的黑色背景更改为其他背景 例如蓝色 正如 gyozo 在评论中提到的 对于蓝色主题 请使用 窗口 gt 首选项 gt Aptana Studio gt 主题 并选择 Eclipse 主题
  • 如何获得 JavaScript 阶乘程序的循环来显示所使用的工作?

    你好 我面临着用 JavaScript 编写一个程序的挑战 尽管我对它不太了解 但它要求用户输入一个数字 然后计算该数字的阶乘 我使用了已经提出的问题并设法使计算正常工作 但无法获得所需的输出 我必须在以下输出中获取它 而不使用任何花哨的库
  • 用javascript调用外部网页(跨域)

    我正在尝试使用以下网络服务来验证提要这个问题 https stackoverflow com questions 11996430 check if a url is a valid feed 但浏览器不允许我向另一台服务器发送 ajax
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str
  • 在Python中停止ThreadPool中的进程

    我一直在尝试为控制某些硬件的库编写一个交互式包装器 用于 ipython 有些调用对 IO 的影响很大 因此并行执行任务是有意义的 使用 ThreadPool 几乎 效果很好 from multiprocessing pool import
  • Swagger/Openapi-Annotations:如何使用 $ref 生成 allOf?

    我正在生成 Rest 端点 包括添加OpenAPI Swagger对生成的代码进行注释 虽然它对于基本类型运行得很好 但我在自定义类方面遇到了一些问题 现在我有很多自定义类的重复架构条目 使用 Schema 实现 MyClass class
  • 我可以将 MongoDB 与实体框架一起使用吗?

    实体框架有可能支持MongoDB数据库吗 有人写过实体框架MongoDB Provider吗 简短的回答 不 这肯定是可能的 但不合理 MongoDB 是文档数据库 不支持集合之间的任何物理关系 EF 非常适合 SQL MySQL 等关系数
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string
  • Biopython 可以执行 Seq.find() 来解释歧义代码吗

    我希望能够在 Seq 对象中搜索考虑歧义代码的子序列 Seq 对象 例如 以下内容应该是正确的 from Bio Seq import Seq from Bio Alphabet IUPAC import IUPACAmbiguousDNA
  • 使用 VBA 通过 Access 导航网页/操作 IE

    你好 StackOverflow 社区 我有一个关于使用 Access VBA 操作 IE 的问题 本质上 我正在尝试编写代码 使用 IE 打开特定网页 在该页面中搜索特定链接 目标链接的名称将取决于用户的情况 通过以编程方式单击该链接导航
  • 我可以让 swagger-php 在查询字符串上使用数组吗?

    我使用 Swagger php 当我定义查询字符串上的参数时 它可以是一个数组 但据我所知 它不支持这种查询字符串 https api domain tld v1 objects q 1 q 5 q 12 我相信这会被设定in the co
  • 使用适用于 Android 和 ios 的 Angular NativeScript 的透明选项卡栏和操作栏

    我想让标签栏透明 操作栏在滑动布局或页面上透明 操作栏或选项卡栏必须位于页面顶部 就像两层一样 我尝试过使用 css 使其透明 但它在页面上并没有变得透明
  • JQuery 删除和内存泄漏

    我正在开发一个游戏 我看到了很多内存消耗 我使用jquery animate 动画完成后 我 remove 元素 我的问题是 从 dom 树中删除一个元素后 对象还存在记忆中吗 Javascript 是一种垃圾收集语言 这意味着当没有代码保
  • 在 Google 地图上绘制线条/路径

    我很长一段时间都在忙于寻找如何在 HelloMapView 中的地图上的两个 GPS 点之间画一条线 但没有运气 谁能告诉我该怎么做 假设我使用扩展 MapView 的 HelloMapView 我需要使用叠加层吗 如果是这样 我是否必须重
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • HTML/CSS 显示/隐藏多个元素?

    我正在寻找一个 HTML CSS 解决方案来应对这一挑战 我有多个具有相同类或相同 id 的元素 并且我想使用按钮或切换开关同时显示 隐藏它们 然后我有一个单击事件 当我单击代表所有这些元素的类或 ID 时 它们都会隐藏 当我再次单击时 它
  • Laravel 存储文件的公共 url

    我想检索使用存储的所有文件的公共网址 存储 putFile 公共 备件 所以 这是我正在使用的问题 存储 文件 公共 备件 但它提供了 laravel 存储目录的输出 public spares image1 jpg public spar
  • 应用程序退出后未设置剪贴板?

    以这个例子为例如何使用 Python 将字符串复制到 Windows 上的剪贴板 https stackoverflow com questions 579687 how do i copy a string to the clipboar
  • 我可以使用 Linux/Mono 部署 aspnet web 应用程序吗?

    我有一个 C ASP NET 应用程序 可以在带有 IIS 的 Windows 上运行 但最近我很想切换到 Linux Mono 它提出了一些问题 我可以在 Mono 中正确运行我的 Visual Studio 项目和源代码吗 我的客户使用
  • 无法运行growl通知并且gemgrowl_notify抛出错误

    当我运行 guard 时 我无法收到咆哮通知 我需要growl notify 的任何特定版本吗 咆哮版本 1 2 这是我的宝石文件 gem rails 3 1 3 gem sqlite3 group development test do
  • 如何按值对计数器进行排序? - Python

    除了进行反向列表理解的列表理解之外 是否有一种Pythonic方法可以按值对Counter进行排序 如果是这样 它比这个更快 gt gt gt from collections import Counter gt gt gt x Count
  • 如何加载和解析 SVG 文档

    背景 有许多与读取和解析 SVG 路径相关的未解答问题 用Java读取svg路径数据的最简单方法 https stackoverflow com questions 21973777 回复 使用 batik svg 解析器解析 svg 文件
  • 如何获取 Invoke-AzureRmVMRunCommand 命令的输出流?

    我正在尝试运行以下命令 Invoke AzVMRunCommand ResourceGroupName instance ResourceGroupName Name instance Name CommandId RunPowerShel
  • Sequelize 设置时区进行查询

    我目前正在使用续集 with postgres在我的项目中 我需要更改查询 因此它返回带有时区偏移量的created at列 var sequelize new Sequelize connStr dialectOptions useUTC
  • DynamoDB query() 与 getItem() 基于索引进行单项检索

    如果我根据索引哈希键从表中检索单个项目 两者之间是否存在性能差异query or getItem getItem会更快 getItem通过哈希和范围键检索是 1 1 匹配 检索它所需的时间 因此性能 受到内部哈希和分片的限制 查询结果是对
  • 如何将 AJAX 成功变量存储为 AJAX 之外的变量?

    我使用 AJAX 来获取我命名为变量 myPubscore 的数据 现在我尝试将 myPubscore 发送到另一个 js 文件 myPubscore 在 Ajax 中打印得很好 但是当我在 sendResponse 之前打印时 我收到 事
  • 如何从数组中获取最多代表的对象

    我有一个包含一些对象的数组 并且有几个相似的对象 例如 水果 苹果 橙子 苹果 香蕉 香蕉 橙子 苹果 苹果 从该数组中获取最多代表的对象的最有效方法是什么 在这种情况下 它将是 apple 但是您将如何有效地计算它呢 不要重新发明轮子 在
  • google.load 导致 dom/screen 为空

    我正在尝试异步添加谷歌可视化 但遇到了问题 我已将范围缩小到导致问题的 google load 当 google load 部分 js 运行时 我得到一个空的屏幕 dom 任何人都知道我做错了什么 我也尝试过使用 google setOnL
  • 推送秘密变更集

    这可能看起来很矛盾 我知道秘密变更集应该是私有的 但是如果我想备份这些秘密变更集怎么办 我并行处理一些分支 有时我想推送一个分支 但不想推送其他分支 为了实现这一目标 我在不同的克隆中工作 但我讨厌那样 所以现在 Mercurial 有阶段
  • 全局授权过滤器不适用于 Swagger UI Asp.net Web Api

    我正在实施招摇的用户界面 https swagger io tools swagger ui 对于我的 Asp net WEB Api 项目 我使用默认值System Web Http AuthorizeAttribute 我已将其注册到我
  • 同一虚拟机中已存在另一个未命名的 CacheManager (ehCache 2.5)

    这就是我运行 junit 测试时发生的情况 Another CacheManager with same name cacheManager already exists in the same VM Please provide uniq
  • 让 foreach() 和 ggplot2 和谐相处

    我有一组调查数据 我想生成按受访者所在国家 地区分组的特定变量的图 到目前为止 我编写的生成绘图的代码是 countries lt isplit drones drones v3 foreach country countries dopa
  • 将 MapKit 用户坐标转换为屏幕坐标时遇到问题

    好吧 这实际上是一个线程中的三个不同的问题 1 我正在使用 void viewDidLoad super viewDidLoad mapView setFrame CGRectMake 100 100 520 520 mapView set
  • 在不知道 Clojure 中的键的情况下,如何将映射解构为键值对?

    假设我有一张这样的地图 a 1 b 2 c 3 我想像这样映射它 注意 非工作伪代码 mapcat fn key key a value value a println key key a n value value a 如果不先获取函数的
  • uvicorn 在 AWS Fargate 上 1-2 分钟后关闭

    我在 AWS Fargate 上使用 Python 3 10 1 和应用程序负载均衡器部署了 FastAPI 0 81 0 uvicorn 0 18 3 服务器在我的本地 Docker 中无限期地运行 如预期 但是在 AWS 上 应用程序总