如何实现WordPress后端和前端的七层负载均衡?

时间:2016-09-01 作者:Michael Ecklund

我已经使用WordPress Multisite的HAProxy设置了第7层负载平衡器。

我希望有任何与WordPress后端相关的东西可以从一组特定的服务器上得到服务(可以是/wp-admin/) 同时从另一组服务器为WordPress网站的前端提供服务。

我需要调整一下吗wp-config.php 要更改cookie名称以使其包含服务器ID吗?或者在WordPress cookie中检查服务器ID?我觉得问题#1和#2与cookie有关。我不知道为什么会发生#3。我的服务器一点也不落后,应该能够快速响应。

With my current configuration I\'m facing a few problems here:

<它似乎确实在将我连接到相应的管理服务器。但是,在仪表板中放置一段时间后。WordPresslogin表单弹出,要求我再次登录。

大多数管理页面都可以正常工作,但偶尔也会弹出WordPress登录,要求我再次登录。

每隔一段时间,我就会收到“504网关超时-服务器没有及时响应”

Here\'s what my configuration looks like:

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http
        retries 3
        option redispatch
        maxconn 2000
        timeout connect 5000
        timeout check 5000
        timeout client 30000
        timeout server 30000

frontend http-in
    bind *:80
    option  httplog
    option http-server-close

    acl has_domain hdr(host) -m found
    acl has_www hdr_beg(host) -i www.

    use_backend live_servers if has_domain has_www

    acl has_admin path_beg /wp-admin
    acl has_login path_beg /wp-login.php
    acl has_custom_login path_beg /manage

    use_backend admin_servers if has_admin or has_login or has_custom_login

    default_backend live_servers

backend live_servers
    mode http
    stats enable
    stats uri /haproxy?stats
    balance roundrobin
    option httpclose
    option forwardfor
    cookie SERVERID insert indirect nocache
    server s1 1.1.1.1:80 check cookie s1
    server s2 2.2.2.2:80 check cookie s2

backend admin_servers
    mode http
    stats enable
    stats uri /haproxy?stats
    balance roundrobin
    option httpclose
    option forwardfor
    cookie SERVERID insert indirect nocache
    server s1 1.1.1.1:80 check cookie s1
我愿意为此提供相当大的悬赏。如果我缺少任何设置,或者您认为可以改进我的配置,请在回答中提供完整的配置,包括所有适当的设置。

编辑:我目前正在使用HAProxy 1.6。并且愿意升级到最新版本,如果这是获得有效解决方案所需要的。

2 个回复
SO网友:dan9vu

The problem #1 & #2:

我不知道为什么需要添加和验证额外的cookie,但对我来说,这很简单,也很直接:

这是我在vagrant Box和默认WordPress结构上尝试的内容:

1. 准备6台单独的服务器

  • 111.111.1.10 - MySQL服务器111.111.1.11 - HAProxy服务器
  • 111.111.1.12 &;111.111.1.13 - 对于管理员URL111.111.1.14 &;111.111.1.15 - 对于非管理员URL,HAProxy(v1.6)配置:

    defaults
        log     global
        mode    http
        option  httplog
        option  forwardfor    
        option  dontlognull
        option  http-server-close
        timeout connect 5000
        timeout client  50000
        timeout server  50000
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http
    
    frontend http-revolver
        bind 111.111.1.11:80
        acl url_is_wp_admin path_beg /wp-admin /wp-login.php /manage
        use_backend admin-servers if url_is_wp_admin
        default_backend public-servers
    
    backend public-servers
        server s1 111.111.1.12:80 check
        server s2 111.111.1.13:80 check
    
    backend admin-servers
        server s3 111.111.1.14:80 check
        server s4 111.111.1.15:80 check
    
    listen stats
        bind  111.111.1.11:1984
        stats enable
        stats scope http-revolver
        stats scope public-servers
        stats scope admin-servers
        stats uri /
        stats realm Haproxy\\ Statistics
        stats auth user:password
    
    2. 使用wpms.dev 作为演示域并指向111.111.1.11 在里面/etc/hosts 主机的。

    3. 安装带有ubuntu/trusty64 服务器上的(灯组+WP multisite)111.111.1.12.

    避免问题的最重要步骤#1&#2是,because some WordPress cookies depend on paths, 我们必须确保这些常量在所有服务器中都是一致的:

    define(\'WP_HOME\', \'http://wpms.dev\');
    define(\'WP_SITEURL\', \'http://wpms.dev\');
    define(\'DOMAIN_CURRENT_SITE\', \'wpms.dev\');
    define(\'PATH_CURRENT_SITE\', \'/\');
    define(\'SITE_ID_CURRENT_SITE\', 1);
    define(\'BLOG_ID_CURRENT_SITE\', 1);
    
    要做到这一点,我们只需要将其添加到wp-config.php 在此基本框中。

    4. 打包base box并将其复制到其他服务器上:111.111.1.13, 111.111.1.14111.111.1.15. 现在vagrant up 对于所有服务器,请查看。

    如果ssh身份验证失败,则必须指向config.ssh.private_key_pathprivate_key 中的基框的Vagrantfile复制框的。

    The problem #3 太离题了,可能会偏离主题。可能是存储错误、服务器配置错误。。。您应该在适当的网络站点上进行询问。:-)

SO网友:cjbj

你的大部分问题似乎都与服务器相关,在这里可能会偏离主题,但这里是我对WordPress相关部分的五美分评论。

WP具有pretty simple login cookies 系统它存储三个cookie,一个用于主url,一个用于wp-admin 目录和一个wp-content\\plugins. 它们只包含用户名和双哈希密码。与服务器无关。因此,如果在正确的url上找到安装,这些cookie将不会阻止任何内容,除非它们过期event that is plugin controlable.

您似乎报告了不规则注销。从上面可以看出,可能会发生两件事。要么插件干扰了cookie的过期时间,要么url不匹配。

关于第一个。大量(电子商务)插件使用PHP sessions 存储数据。该数据可以存储在服务器端。如果插件在某些会话数据丢失时以某种方式将用户注销,那么当负载平衡器决定将您重定向到其他服务器时,您将被注销。这可以解释不规则注销的原因。

关于第二个。这需要在服务器之间重定向到不同的url。对我来说,这似乎不太可能。

相关推荐

在将代码添加到函数后无法登录WordPress wp-admin。php

我在函数末尾添加以下代码。php文件,用于根据自定义帖子的帖子标题填充分类法。问题是,当我添加代码时,尝试登录wp admin时会出现以下错误。非常感谢您能帮助我们弄清楚为什么会发生这种情况。Error:错误:由于意外输出,Cookie被阻止。有关帮助,请参阅此文档或尝试支持论坛。Code: <?php function update_custom_terms($post_id) { // only update terms if