我有一个 fast-cgi 应用程序,它可以做一些工作http://myapp.com/do?arg=x。这项工作可能需要几分钟。因此,我想继续将用户重定向到相同的 URL(使用 307)直到工作完成,并以 200 OK 提供结果。我想降低响应速度,以便客户端需要 30 秒(例如)才能收到 307。显然,我不想在后端执行此操作,因为我需要处理其他工作。是否可以告诉 nginx 插入延迟或限制特定 URL 的响应速率?
我查看过 limit_req,但我不认为它可以用来限制唯一的 URL(http://myapp.com/do?arg=x相对http://myapp.com/do?arg=y) 而是唯一的 IP 地址。
答案1
您可能需要重新构建应用程序以更好地处理这种情况。我会有两个脚本:一个是用户访问的网页。第二个是完成工作的后端脚本。
脚本二可以是守护进程,或者,如果你的环境支持脚本一,你也可以使用非阻塞分叉。脚本一应该在脚本二中启动作业,然后使用类似下面的命令将数据推送给用户事件流(或者 WebSockets,虽然这里用 WebSockets 有点过头了)更新它们的状态。完成后,您可以发送 200 或其他指示。
答案2
我已经接受了这个解决方案:
- 发送带有以下标头的 307:
- 传输编码:分块
- 内容长度:X
- 缓存控制:无缓存
- 指令:无缓存
- 每秒写入 1 字节块,持续 X 秒
- 200 结果确认