使用三个服务器实现PHP Web应用程序的负载平衡

4
我有两个Web服务器和一个服务器,用作反向代理或负载均衡器。2个Web服务器都有真实/公共IP地址,负载均衡器也是如此。负载均衡器服务器尚未配置,因为我还没有确定哪种选项最适合我的Web应用程序。我知道单个负载均衡器存在风险,因为"单点故障",但我想使用它。
2个Web服务器包含多个具有相同域名和不同子域的PHP应用程序/vhost(Apache + fastcgi)。它们都使用会话、cookie,其中一些需要SSL。我的主要目标是将传入的连接平均分配到两个Web节点,并且如果一个Web节点离线,另一个节点应该接受所有连接。如果需要,我们可以使用memcache进行会话共享。
我阅读了关于Nginx、HaProxy和其他任何我能在网络上找到的应用程序的资料。但我无法决定,因为:
1)我只有1个可用作负载均衡器的服务器,但我在网络上找到的所有配置都需要2个负载均衡器节点。
2)我不确定SSL证书应该安装在哪里(负载均衡器或Web节点),以及在使用HTTPS连接时哪种解决方案最好。
需要任何帮助/想法,非常感谢。

还要考虑一下lighty - http://www.lighttpd.net/ - Brian
4个回答

4
我曾在类似的设置中使用过HAProxy,并强烈推荐使用它。它可以在单个服务器上运行得非常好,而且如果您需要高可用性的负载均衡,只需要两台服务器即可。
有许多教程,例如这个,提供了如何在您所需的配置中设置它的详细说明。

1

我昨天刚刚创建了一个配置,其中NGINX服务器作为负载均衡器,其后面有2个PHP-FPM服务器、1个Memcache服务器和1个MySQL服务器。使用Upstreaming功能配置了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负载均衡器上-我从未亲自尝试过。一旦客户端请求被传递到应用程序服务器,它将处理它,获取请求并将其发送回NGINX。在将响应转发给客户端之前,NGINX会加密内容。当然这是一种理论。但我百分之百确定NGINX可以轻松处理SSL。它是最快和最强大的代理/负载均衡器,并且与各种CLIs的FASTCGI功能结合使用时是一个很好的Web服务器。

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


0
在任何需要将HTTPS传输到多个Web服务器的情况下,您的理想解决方案是在Web服务器前安装Nginx。它也可以用于负载均衡,但如果您需要更复杂的配置选项,则最好将Nginx请求转发到您的HAProxy实例。这两个服务都使用最少的资源,所以不用担心同时运行两个服务。
我熟悉只有3台服务器并且不想要冗余负载均衡器的想法。实际上,我写了一本关于扩展架构的电子书,其中包括一些具有2-3-4台服务器和仅1个负载均衡器的示例。也许它可以提供更多信息并帮助您入门。

0

你只需要一个HAProxy节点就可以完成你所需的操作(尽管这仍然会让你面临单点故障的风险)。

我已经写了一篇在Rackspace Cloud上安装HAProxy的教程,它可以适用于任何Ubuntu设置。通过使用cookie选项,您还可以强制执行会话持久性,因此无需在多个服务器之间共享会话,用户只有在他们正在使用的服务器崩溃时才会失去他们的会话。

一旦您通过HAProxy平衡了标准的HTTP流量,您就可以使用mode tcp选项将SSL流量发送出去。这不能插入请求中的cookie,因此请使用sourcebalance模式。这基于用户的IP进行负载均衡,因此除非您添加其他节点,否则不会在会话期间更改。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接