我想建立一个高性能网站。它有数千个静态 HTML 页面,这些页面是根据表单提交而专门呈现的。我有一个 ruby 脚本可以生成这些静态 HTML 页面并将它们存储在服务器上。
现在我正在查看网站上的 1000 多个并发用户。哪种方式最快可以为这些用户提供服务。我相信 Nginx + Varnish 可以很好地完成这种情况。我还可以做进一步的优化吗?
有没有办法让 NGinx + Varnish 不将 HTML 页面加载到磁盘,而是加载到 RAM 中。不知怎么的,使用 Memcached。
我已经在考虑将其他静态资产(如图片/样式表)移出到 CDN。请告诉我最好的解决方法是什么。
谢谢!
[转自 StackExchange:https://stackoverflow.com/questions/6439484/building-a-high-performance-static-website]
答案1
虽然 varnish 的灵活 VCL 非常出色,但它实际上更适合缓存动态网站。似乎普遍认为 nginx 的性能优于 varnish(至少在小型静态对象上)。
您可以使用 proxy_cache、fastcgi_cache 或直接使用 nginx 从磁盘提供服务。我知道它支持 memcached,但 memcached 的唯一好处是如果您有多个服务器共享同一个缓存 - 除此之外,我只能看到额外的开销。
您可以让文件系统(希望是 raid 控制器)缓存(最常用的)数据,或者将其放入 ramdisk!
我相信,一台具有几 GB RAM 的相当廉价的 xeon 服务器每秒可以轻松处理几千个请求,因为您实际上只提供静态内容。我还认为可以预压缩所有静态内容,这样您就不会为每个请求增加额外的开销。
答案2
没有什么比直接将文件推送到客户端更好的了。如果你能做到这一点,我会尽力继续这样做,因为它很容易扩展,不需要花哨的缓存,而只需将准备好的东西传送到客户端。而 Nginx 特别擅长这项任务。由于它基于事件的处理模型,它将使用更少的资源,当你有许多同时连接时,它可能会比基于线程的 varnish 快得多。
此外,基本文件系统非常擅长缓存文件以供重复读取。因此,我认为您只需一台简单的服务器,不需要太多的 CPU 能力,但有足够的内存来缓存文件系统和良好的 I/O 子系统,就足够了。最佳系统能够将所有需要的对象缓存在 RAM 中,因此,一个大小大致为 (工作集大小 + 1GB) 的系统就足够了。根据对象的大小,我还强烈建议至少使用 SSD 作为旋转锈蚀的中间缓存层,以便可以快速检索尚未在 RAM 中的对象。您将观察到的 I/O 模式可能相当随机,这是 SSD 可以轻松实现的,但旋转磁盘在这方面相当糟糕。
一般来说,重要的衡量标准不是浏览您网站的用户数量,而是实际并发到您服务器的 TCP 连接数和所需的吞吐量。通过一些调整,您可以轻松用一个成本约为 3000 美元的系统填充千兆管道。
答案3
更标准的方法是动态生成结果,然后从某种缓存中满足后续请求。
您可以使用 redis 或 memcached 之类的代码来实现这一点(请参阅以下基本的 python memcached 示例https://stackoverflow.com/questions/868690/good-examples-of-python-memcache-memcached-being-used-in-python)。您也可以使用像 nginx 这样的缓存代理来尝试自动执行此操作。
答案4
(低质量的答案来了,其他人比我更了解这个东西):
我非常确信,nginx 与超强的 I/O(RAM+SSD)相结合,可以轻松为 1000 个客户端提供纯静态 html 内容。