Nginx autoindex 在列出文件时阻止 IO

Nginx autoindex 在列出文件时阻止 IO

我最近遇到了这个问题,

  1. 我使用自动索引提供了数据路径,其中有一个包含大量文件的目录(我在 btrfs 上有一个包含 1228240 个文件的目录)。访问单个文件没问题,但列出文件需要 2 分钟。
  2. 当您尝试通过 HTTP 请求直接访问该路径时,nginx 会冻结(是的,完全冻结,所有虚拟主机超时)直到列出完成,也就是 2 分钟的停机时间。

但是,我不能仅仅禁用自动索引,因为其他路径依赖于它的 json 输出。

有办法解决这个问题吗?还是需要向 nginx 报告。

答案1

我也遇到过这个问题。看来 autoindex 不使用异步文件 IO,因此列出文件会阻塞其事件循环。

我玩过航空工业组织指令,但是不会改变列表的阻止行为。

我发现的唯一解决办法是增加工作进程,因此一个工作进程被阻塞不会阻止其他工作进程接受请求。 (理论上,由同一个被阻塞的工作进程处理的任何请求仍可能会超时。)

因此,在你的 nginx.conf 中有类似这样的内容:

worker_processes 4;
# or 16, or 64, more than the number of concurrent listing requests you may receive

答案2

您可能需要使用缓存代理来获得更好的结果,因为列表不会在每次访问时重新创建。

但请记住,在 Web 布局中显示超过 1 Mio 的文件条目通常没有用。(绘制文件夹视图是一种 Web 布局)。这最好是 ftp 服务器的工作,即使在那里,您也应该将文件组织在子文件夹中。完整列表是几 MB 的数据(可能至少 10MB 甚至更多)。

另一个解决方案是通过可以搜索内容的数据库提供索引。这样,就不必在每次请求时传输整个列表。该数据库还可以生成您需要的 JSON 输出。

相关内容