繁体   English   中英

负载均衡 PHP web 应用与三台服务器

[英]Load balancing PHP web application with three servers

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

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

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

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

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

我在类似的设置中使用了 HAProxy,我强烈推荐它。 它可以在单台服务器上很好地运行,如果你想要高可用性,你只需要两台服务器来进行负载平衡。

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

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

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 功能结合使用时,它是最快、最强大的代理/平衡器和良好的网络服务器。

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

In any situation where you want HTTPS to more than 1 web server, your ideal solution would be to have Nginx installed in front of your web servers. 它也可以用于负载平衡,但如果您需要更复杂的配置选项,那么最好将 Nginx 请求转发到您的 HAProxy 实例。 两种服务都使用最少的资源,因此不必担心同时运行这两种服务。

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

您可以只使用一个 HAProxy 节点来完成您需要的操作(尽管这仍然会给您留下单点故障)。

我写了一个在 Rackspace Cloud 上安装 HAProxy 的教程,它可以适应任何 Ubuntu 设置。 通过使用cookie选项,您还可以强制执行 session 持久性,因此无需在盒子之间共享会话,如果用户所在的盒子在 Z21D6F40CFB511982E4424E0E2 中途停机,用户只会丢失他们的 session。

一旦您通过 HAProxy 平衡了标准 HTTP 流量,您就可以使用mode tcp选项发送您的 SSL。 这无法将 cookies 插入请求中,因此请使用sourcebalance模式。 此余额基于用户的 IP,因此不会在会话中更改,除非您添加其他节点。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM