it-swarm.com.de

Wie kann ich WordPress Backend und Frontend auf Layer 7 verteilen?

Ich habe ein Layer 7 Load Balancer-Setup mit HAProxy für WordPress Multisite.

Ich möchte, dass alles, was mit dem WordPress-Backend zu tun hat, von einer bestimmten Servergruppe aus bedient wird (A/K/A irgendetwas in /wp-admin/), während das Frontend der WordPress-Websites von einer anderen Servergruppe aus bedient wird.

Muss ich etwas in wp-config.php anpassen, um die Cookie-Namen so zu ändern, dass sie die Server-ID enthalten? oder nach der Server-ID im WordPress-Cookie suchen? Ich habe das Gefühl, dass die Probleme 1 und 2 mit Cookies zusammenhängen. Ich habe keine Ahnung, warum # 3 passiert. Meine Server sind überhaupt nicht im Rückstand und sollten schnell reagieren.

Mit meiner aktuellen Konfiguration habe ich hier ein paar Probleme:

  1. Es scheint in der Tat, mich mit dem entsprechenden Admin-Server zu verbinden. Allerdings nach einer Weile im Dashboard. Das WordPress-Anmeldeformular erscheint und fordert mich auf, mich erneut anzumelden.

  2. Die meisten Administrationsseiten funktionieren einwandfrei, aber auch hier und da wird genau wie bei Nummer 1 das WordPress-Login für angezeigt und ich werde aufgefordert, mich erneut anzumelden.

  3. Hin und wieder erhalte ich die Meldung "504 Gateway Timeout - Der Server hat nicht rechtzeitig geantwortet."

So sieht meine Konfiguration aus:

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

Ich bin bereit, eine ziemlich saftige Prämie dafür bereitzustellen. Wenn Einstellungen fehlen oder Sie glauben, dass Sie meine Konfiguration verbessern könnten, geben Sie bitte eine vollständige Konfiguration mit allen entsprechenden Einstellungen in Ihrer Antwort an.

Bearbeiten: Ich verwende derzeit HAProxy 1.6.x und bin bereit, auf die neueste Version zu aktualisieren, wenn dies erforderlich ist, um eine gültige Lösung zu erhalten.

6
Michael Ecklund

Das Problem # 1 & # 2 :

Ich weiß nicht, warum Sie zusätzliche Cookies hinzufügen und validieren müssen, aber für mich ist das ganz einfach und unkompliziert:

Dies ist, was ich auf Vagrant-Boxen und mit Standard-WordPress-Struktur versucht habe:

1 . Bereiten Sie 6 separate Server vor

  • 111.111.1.10 - MySQL Server
  • 111.111.1.11 - HAProxy-Server
  • 111.111.1.12 & 111.111.1.13 - für Admin-URLs
  • 111.111.1.14 & 111.111.1.15 - für Nicht-Administrator-URLs

HAProxy (v1.6) -Konfigurationen:

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 . Verwenden Sie wpms.dev als Demo-Domain und zeigen Sie auf 111.111.1.11 im /etc/hosts des Host-Computers.

3 . Installieren Sie eine Base-Box mit ubuntu/trusty64 (LAMP-Stack + WP Multisite) auf dem Server 111.111.1.12.

Der wichtigste Schritt zur Vermeidung des Problems Nr. 1 und Nr. 2 ist da einige WordPress-Cookies von Pfaden abhängen , müssen wir sicherstellen, dass diese Konstanten auf allen Servern konsistent sind:

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);

Dazu müssen wir es nur zu wp-config.php in dieser Basisbox hinzufügen.

4 . Packen Sie die Basisbox und duplizieren Sie sie auf anderen Servern: 111.111.1.13, 111.111.1.14 und 111.111.1.15. Jetzt vagrant up für alle Server und check es aus.

Wenn die SSH-Authentifizierung fehlschlägt, müssen Sie config.ssh.private_key_path auf den private_key der Basisbox in Vagrantfiles der duplizierten Boxen verweisen.

Das Problem # 3 ist zu im Ausland und kann hier off-Topic sein. Dies kann ein Speicherfehler oder ein Server-Konfigurationsfehler sein. Sie sollten ihn an einem geeigneten Netzwerkstandort erfragen. :-)

4
MinhTri

Die meisten Ihrer Fragen scheinen serverbezogen zu sein und hier nicht zum Thema zu gehören, aber hier sind meine fünf Cent für den WordPress-bezogenen Teil.

WP hat ein ziemlich einfaches Login-Cookies System. Es werden drei Cookies gespeichert, eines für die Haupt-URL, eines für das Verzeichnis wp-admin und eines für wp-content\plugins. Sie enthalten nur den Benutzernamen und ein doppeltes Hash-Passwort. Nichts Server bezogen. Wenn die Installation unter der richtigen URL gefunden wird, blockieren diese Cookies nichts, es sei denn, sie verfallen. Dies ist ein Ereignis, das vom Plugin gesteuert werden kann .

Sie scheinen unregelmäßige Abmeldungen zu melden. Aus dem oben Gesagten folgt, dass zwei Dinge passieren könnten. Entweder hat ein Plugin die Cookie-Ablaufzeit überschritten oder die URL stimmt nicht überein.

Zum ersten. Viele (E-Commerce-) Plugins verwenden PHP sessions zum Speichern von Daten. Diese Daten können serverseitig gespeichert werden. Wenn das Plugin den Benutzer irgendwie abmeldet, wenn einige Sitzungsdaten fehlen, werden Sie abgemeldet, wenn Ihr Load Balancer beschließt, Sie auf einen anderen Server umzuleiten. Dies würde unregelmäßige Abmeldungen erklären.

Zum zweiten. Dies würde eine Umleitung auf eine andere URL zwischen den Servern erfordern. Das erscheint mir weniger wahrscheinlich.

1
cjbj