You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Asyncio/Aiohttp是否有NGINX client_header_timeout等效配置?

在Python Asyncio/Aiohttp中实现类似NGINX client_header_timeout的功能

aiohttp本身没有直接对应NGINX client_header_timeout的内置指令,但可以通过自定义中间件结合异步超时机制实现等效效果,用来强制客户端在指定时长内完成HTTP请求头的发送,缓解Slowloris攻击。以下是具体实现方式:

1. 自定义中间件,在请求头读取阶段设置超时

通过asyncio.wait_for包裹请求头的读取操作,超时则直接返回408状态并断开连接:

from aiohttp import web
import asyncio

async def header_timeout_middleware(app, handler):
    async def middleware_handler(request):
        try:
            # 等待请求头读取完成,设置超时时间(示例为5秒)
            await asyncio.wait_for(request.read(), timeout=5.0)
        except asyncio.TimeoutError:
            return web.Response(status=408, text="Request header timeout")
        return await handler(request)
    return middleware_handler

# 应用中间件
app = web.Application(middlewares=[header_timeout_middleware])

# 示例路由
async def hello(request):
    return web.Response(text="Hello, world")

app.add_routes([web.get('/', hello)])

if __name__ == '__main__':
    web.run_app(app)

说明:request.read()会触发aiohttp完成请求头的解析,超时后直接终止请求,和NGINX client_header_timeout的核心逻辑一致。

2. 结合套接字级别超时辅助强化防护

配合aiohttp服务器端的套接字读取超时设置,进一步限制客户端不发送数据的空闲时间:

app = web.Application(
    middlewares=[header_timeout_middleware],
    client_timeout=web.ClientTimeout(sock_read=2.0)
)

这个设置属于套接字级别的读取超时,会在客户端长时间不发送任何数据时触发,和自定义中间件的请求头超时形成互补,更好地抵御Slowloris攻击。

3. 额外缓解Slowloris攻击的手段

  • 限制单个客户端的并发连接数,可通过自定义计数器或第三方限流库实现;
  • 启用操作系统层面的TCP同步队列(如Linux开启tcp_syncookies),防止半连接队列被占满。

内容的提问来源于stack exchange,提问作者user2464424

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:00:04