我正在设置一个新的 Web 服务器并想知道以下内容是否是有效的堆栈:
前面的 Varnish 用来缓存和分割 nginx(用于静态内容)和 Apache(用于动态内容)之间的流量。
我还将运行 APC 作为 PHP 的操作码缓存,运行 memcached 作为数据缓存。
这是有效配置吗?如果我的某些 PHP 已被 Varnish 缓存,我是否需要运行 APC?
答案1
我发现您的方法存在一些冗余。nginx 作为 Web 服务器和负载均衡器已经非常高效,在其之上添加第二个负载均衡器似乎毫无意义。
我个人更喜欢有一个前端 nginx,它可以提供静态内容并将请求负载平衡到 apache+php
对于缓存,您可能需要研究 redis,我认为它比 memcached 更强大。除了负载平衡之外,拥有操作码缓存肯定更好。您可能需要考虑将 xcache 作为 php 的操作码缓存。
答案2
这是一个有效的设置,虽然我猜测它可能对于大多数用途来说太大了,而且需要大量的 RAM 才能按预期运行。
有几个地方可以减少层数...例如,nginx/静态 Web 服务器可能可以通过巧妙的缓存策略替换,并且只使用 apache 和 varnish(更长时间地缓存静态内容,如果更改内容,则使用缓存失效技术)。但这取决于您的特殊应用和需求。
根据您的数据和使用情况,memcached 可能不会给您的设置增加太多内容。
“如果我的某些 PHP 代码已经被 Varnish 缓存,我还需要运行 APC 吗?”它们缓存的内容完全不同。APC 缓存已编译的 PHP 代码,而 Varnish 或任何其他 webcache 缓存内容(可能由该代码生成)。所以这是一个有效的设置。没什么好担心的。
答案3
我会尽可能简化你的架构:
首先,我会放弃使用 apache,并使用带有 php-fpm 的 nginx 来处理动态内容。然后,如果您不使用边缘端包含或某些高级缓存失效,我会使用 nginx 而不是 varnish 来缓存动态内容。应在 nginx 配置中为静态内容指定较长的过期时间,并在文件名中使用版本控制,以避免提供过时的内容。
APC(或 xcache)是一个守护者,它避免在每次执行时将 php 源代码重新编译为操作码。此外,如果您在一台机器上运行所有程序,您可以使用 APC 进行数据缓存,并在以后扩展到 memcached(如果您从一开始就编写了良好的抽象)。