使用三台服务器负载平衡PHP Web应用程序

时间:2011-06-30 11:10:50

标签: php nginx load-balancing fastcgi haproxy

我有2个Web服务器和1个服务器,可用作反向代理或负载均衡器。 2个Web服务器具有实际/公共IP以及负载均衡器。负载均衡器服务器尚未配置,因为我没有确定哪个选项最适合我的Web应用程序。我知道有一个负载均衡器存在风险,因为“单点故障”,但我想继续使用它。

2个Web服务器包含多个具有相同域和不同子域的PHP应用程序/ vhost(Apache + fastcgi)。他们都使用会话,cookie,其中一些需要SSL。我的主要目标是将传入的连接分成两半,并将它们转发到2个Web节点。如果一个Web节点脱机,另一个Web节点应该接受所有连接。我认为如果需要,我们可以与memcache进行会话共享。

我读到了关于Nginx,HaProxy以及我在网上可以找到的任何其他应用程序。但我无法决定因为:

1)我有1台服务器可以用作负载均衡器,但我在网上找到的所有配置都需要2个负载均衡器节点。 2)我不确定在何处安装SSL证书(在负载均衡器或Web节点上)以及使用HTTPS连接时哪种解决方案最佳。

需要任何帮助/想法,非常感谢。

4 个答案:

答案 0 :(得分:4)

我在类似的设置中使用了HAProxy,我强烈推荐它。它可以在单个服务器上运行良好,只需要两个服务器进行负载平衡,以防您需要高可用性。

有许多教程,例如this,提供了有关如何在您寻求的配置中进行设置的详细说明。

答案 1 :(得分:1)

我昨天刚创建了一个配置,其中NGINX服务器作为负载均衡器,其后有2个PHP-FPM服务器,1个Memcache服务器和1个MySQL服务器。 NGINX使用上游功能进行配置,相关配置行如下所示:

html {

    ...

    # loadbalancing        
    upstream myLoadBalancer {
        ip_hash; # makes sure same user uses the same server, not 100% effective - application
                 # should handle this; in my case 1 Memcached and 1 MySQL servers commonly used
                 # by all App-servers work just fine. I store sessions in Memcache, so Session 
                 # management isn't a problem at all. Its shared across all App-servers.
        server 192.168.1.10:9000; # location of my first php-fpm server
        server 192.168.1.11:9000; # second php-fpm server
        # server aaa.bbb.ccc.ddd:80; # let's say, an Apache server
    }

    #vhost
    server {
        listen 80;
        server_name mydomain.com;
        index index.php;

        location ~* \.php$ {
            gzip on;
            try_files $uri =404;
            include fastcgi_params;
            fastcgi_pass myLoadBalancer;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /path/to/webdir$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_script_name;
        }
    }
}

HTTPS:如果我没有弄错的话,应该在NGINX负载均衡器上安装它们 - 从不尝试过自己。一旦客户端请求传递给App-server,它就会处理它,获取请求并将其发送回NGINX。在将响应转发给客户端之前,NGINX将对内容进行加密。它当然是一种理论。但我100%肯定NGINX可以很容易地处理SSL。当与各种CLI的FASTCGI功能结合使用时,它是速度最快,最强大的代理/平衡器和良好的Web服务器。

注意:这不是生产环境的配置,而是测试用例场景。生产环境需要很多安全设置。以下资源可能有用:

答案 2 :(得分:0)

在任何需要HTTPS到多个Web服务器的情况下,理想的解决方案是在Web服务器前安装Nginx。它也可以用于负载平衡,但是如果您需要更复杂的配置选项,那么将Nginx请求转发到您的HAProxy实例是个好主意。这两种服务都使用最少的资源,因此不必担心同时运行它们。

我熟悉只有3台服务器且不需要冗余负载均衡器的想法。我实际上写了一本用于扩展体系结构的电子书,它包括一些2-3-4服务器和1个负载均衡器的例子。也许它可以提供更多信息并帮助您入门。

答案 3 :(得分:0)

只需一个HAProxy节点即可完成所需的操作(尽管这仍然会让您遇到单点故障)。

我写了tutorial for installing HAProxy on Rackspace Cloud,可以适应任何Ubuntu设置。通过使用cookie选项,您还可以强制执行会话持久性,因此无需在框之间共享会话,用户只有在会话期间关闭时才会丢失会话。

通过HAProxy平衡标准HTTP流量后,您可以使用mode tcp选项发送SSL。这不能将Cookie插入请求中,因此请使用balance source模式。这取决于用户的IP,因此除非您添加其他节点,否则不会在会话中更改。

然后,您的SSL证书将安装在两个Web节点上,因为HAProxy只是在平衡TCP流量。顺便提一下,您可以将此平衡模式与TCP上的任何内容一起使用,包括用于某些真正高可用性解决方案的MySQL连接。