我只是好奇从一台服务器提供静态文件的服务器配置。
是否可以构建一个仅用于静态文件并支持数百万并发连接的服务器。最好的 HTTPD 服务是什么?
该服务器将仅提供目录中的静态文件,并且不会使用除 HTTPD 之外的任何其他服务,当然也不会使用 PHP。
答案1
数百万个并发连接?除非您托管视频流或其他大型文件,否则 http 请求通常会在很短的时间内完成,即使在较繁忙的网站上,您也不会收到那么多同时连接。如果这样做,您肯定不会只有一台服务器。此外,在这种流量下,您的网络流量会非常高,因此我认为一台服务器不是您的最佳选择。
但是,让我们假设您真正运行的服务只有一台服务器和数百万个并发连接:那么 nginx 或 lighttpd 将是您的最佳选择。接下来您可能需要调整许多内核参数,例如fs.open
。此外,您可能还需要编译自己的内核。
以下是关于 HEANET 如何将其 Apache 2.x 扩展到 20 0000+ 个并发会话的幻灯片. 请注意,即使那需要进行大量的修补。
答案2
我猜你对流量的估计有点乐观,但对于大规模静态资产服务来说,最好的选择是 nginx。请注意,对于如此多的并发连接,你必须调整一些内核参数。
答案3
“数百万”个并发连接可能有点难以实现,但大多数 Web 服务器都属于以下架构类型:预分叉(1 个进程/1 个线程,1 个连接)、线程化(1 个进程/多个线程,每个连接 1 个线程)、事件驱动(1 个进程/1 个线程,多个连接)。当然,也有这些类型的混合体,例如 apache mpm_worker,它是预分叉和线程化的混合体。
一般来说,pre-fork 处理的连接数最少,因为为每个连接创建一个新进程成本高昂,而且会消耗大量资源。Threaded 稍好一些,但数千或数百万个线程也会产生大量开销。事件驱动系统通常为 1 个进程/1 个线程,并使用异步/非阻塞 IO 以最小的资源开销实现非常高的并发性。
您可能希望坚持使用事件驱动系列,以接近“数百万并发”目标。一些事件驱动应用程序仅限于 1 个 CPU。如果您使用的是多 CPU 计算机,则需要每个 CPU 运行 1 个实例(一些 Web 服务器可能会为您处理此问题,而其他 Web 服务器则需要您编写脚本并自行管理。)