负载平衡:Nginx、Varnish 和 HTTP 会话

负载平衡:Nginx、Varnish 和 HTTP 会话

我必须设置一个负载平衡系统。目前我有两台机器运行 Nginx 0.8.52、PHP-FPM(在 unix 套接字上)和一个基于 PHP Symfony 1.4.11 的应用程序。

在第三台机器上,我必须选择要安装哪个平衡器。

我已经使用 Varnish 进行静态文件缓存,但我不知道 Varnish 负载平衡是否可以处理 Symfony PHP 会话。另一个选择是使用 ip_hash 进行 Nginx 负载平衡。

哪一个是最好的?

提前致谢

答案1

为什么不两者兼而有之呢?将 NginX 放在前端来处理 gzip 压缩和 SSL,将 Varnish 放在后端来处理缓存和负载平衡。后端应用程序将需要一些会话在 DB 或 Memcache 上共享,正如 Kristaps 所建议的那样,Varnish 不会缓存任何通过 Cookies 或身份验证提供的动态内容,但其余一切都没问题。

建议您创建一个单独的静态主机名(如static.example.com并从那里提供所有静态内容,没有任何 cookies(由于没有 cookie,Varnish 会很好地缓存它),另一个用于动态内容,可以通过 NginX 或 Varnish 进行负载平衡,使用 cookie 进行会话处理,并且所有后端共享会话信息,如上所述。

答案2

我不是 symfony 框架专家,但出于负载平衡的目的,建议将会话从默认的基于文件的存储移动到memcache 会话处理程序,以允许会话部分应用程序的规模超过单个应用程序。

您可以通过 VCL magic(对客户端 IP 地址的十进制表示进行一些简单的算术运算,例如模数)在 varnish 中存档粘性会话。

Varnish 的设计目的是缓存服务器,而不是负载均衡器。另外,Varnish 不支持 SSL,这意味着需要单独的 SSL 终止器(最常见的是带有 ssl 模块的 nginx)。

我建议您使用不是为缓存而设计的负载均衡器,而是为完全动态的 Web 应用程序部分而设计的负载均衡器,例如 haproxy 或 nginx,它们都支持粘性会话。

答案3

我认为最好找到一种方法来共享未来节点的会话数据,例如 NAS 存储或让负载平衡器共享 php 会话。其他选项是重写您的应用程序,以便它可以使用 mysql 数据库进行会话,并再次在节点上共享该数据。

相关内容