Nginx implementiert den Aufbau eines Clusters mit hoher Verfügbarkeit (Keepalived+Haproxy+Nginx)

Nginx implementiert den Aufbau eines Clusters mit hoher Verfügbarkeit (Keepalived+Haproxy+Nginx)

1. Komponenten und implementierte Funktionen

Keepalived: realisiert eine hohe Verfügbarkeit des Haproxy-Dienstes und übernimmt die Dual-Active-Modellkonfiguration;

Haproxy: implementiert Lastausgleich und Lese-/Schreibtrennung für Nginx;

Nginx: realisiert die Hochgeschwindigkeitsverarbeitung von HTTP-Anfragen;

2. Architektur-Design-Diagramm

3. Keepalived-Bereitstellung

Keepalived muss auf beiden Knoten installiert werden. Der Befehl lautet wie folgt:

$ yum -y installiere Keepalived

Ändern Sie die Konfiguration der Datei keepalived.conf auf dem Knoten 172.16.25.109. Der Befehl lautet wie folgt

$ vim /etc/keepalived/keepalived.conf

Der geänderte Inhalt lautet wie folgt:

! Konfigurationsdatei für Keepalived
global_defs {
   Benachrichtigungs-E-Mail {
         root@localhost
   }
   Benachrichtigungs-E-Mail von [email protected]
   smtp_connect_timeout 3
   SMTP-Server 127.0.0.1
   Router-ID LVS_DEVEL
}
vrrp_script chk_maintaince_down {
   Skript "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
   Intervall 1
   Gewicht 2
}
vrrp_script chk_haproxy {
    Skript "killall -0 haproxy"
    Intervall 1
    Gewicht 2
}
vrrp_instance VI_1 {
    Schnittstelle eth0
    Zustand MEISTER
    Priorität 100
    virtuelle_Router_ID 125
    garp_master_delay 1
    Authentifizierung
        Authentizitätstyp PASS
        auth_pass 1e3459f77aba4ded
    }
    Track-Schnittstelle {
       eth0
    }
    virtuelle_IP-Adresse {
        172.16.25.10/16 dev eth0 Bezeichnung eth0:0
    }
    Titel_Skript {
        chk_haproxy
    }
    notify_master "/etc/keepalived/notify.sh master 172.16.25.10"
    notify_backup "/etc/keepalived/notify.sh Backup 172.16.25.10"
    notify_fault "/etc/keepalived/notify.sh Fehler 172.16.25.10"
}
vrrp_instance VI_2 {
    Schnittstelle eth0
    Status BACKUP
    Priorität 99
    virtuelle_Router_ID 126
    garp_master_delay 1
    Authentifizierung
        Authentizitätstyp PASS
        auth_pass 7615c4b7f518cede
    }
    Track-Schnittstelle {
       eth0
    }
    virtuelle_IP-Adresse {
        172.16.25.11/16 dev eth0 Bezeichnung eth0:1
    }
    Titel_Skript {
        chk_haproxy
chk_maintaince_down
    }
    notify_master "/etc/keepalived/notify.sh master 172.16.25.11"
    notify_backup "/etc/keepalived/notify.sh Backup 172.16.25.11"
    notify_fault "/etc/keepalived/notify.sh Fehler 172.16.25.11"
}

Ändern Sie auf ähnliche Weise die keepalived.conf-Konfiguration auf dem Knoten 172.16.25.110 mit dem folgenden Inhalt:

! Konfigurationsdatei für Keepalived
global_defs {
   Benachrichtigungs-E-Mail {
         root@localhost
   }
   Benachrichtigungs-E-Mail von [email protected]
   smtp_connect_timeout 3
   SMTP-Server 127.0.0.1
   Router-ID LVS_DEVEL
}
vrrp_script chk_maintaince_down {
   Skript "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
   Intervall 1
   Gewicht 2
}
vrrp_script chk_haproxy {
    Skript "killall -0 haproxy"
    Intervall 1
    Gewicht 2
}
vrrp_instance VI_1 {
    Schnittstelle eth0
    Status BACKUP
    Priorität 99
    virtuelle_Router_ID 125
    garp_master_delay 1
    Authentifizierung
        Authentizitätstyp PASS
        auth_pass 1e3459f77aba4ded
    }
    Track-Schnittstelle {
       eth0
    }
    virtuelle_IP-Adresse {
        172.16.25.10/16 dev eth0 Bezeichnung eth0:0
    }
    Titel_Skript {
        chk_haproxy
chk_maintaince_down
    }
    notify_master "/etc/keepalived/notify.sh master 172.16.25.10"
    notify_backup "/etc/keepalived/notify.sh Backup 172.16.25.10"
    notify_fault "/etc/keepalived/notify.sh Fehler 172.16.25.10"
}
vrrp_instance VI_2 {
    Schnittstelle eth0
    Zustand MEISTER
    Priorität 100
    virtuelle_Router_ID 126
    garp_master_delay 1
    Authentifizierung
        Authentizitätstyp PASS
        auth_pass 7615c4b7f518cede
    }
    Track-Schnittstelle {
       eth0
    }
    virtuelle_IP-Adresse {
        172.16.25.11/16 dev eth0 Bezeichnung eth0:1
    }
    Titel_Skript {
        chk_haproxy
    }
    notify_master "/etc/keepalived/notify.sh master 172.16.25.11"
    notify_backup "/etc/keepalived/notify.sh Backup 172.16.25.11"
    notify_fault "/etc/keepalived/notify.sh Fehler 172.16.25.11"
}
# vi /etc/keepalived/notify.sh
#!/bin/bash
# Autor: Jason.Yu <[email protected]>
# Beschreibung: Ein Beispiel für ein Benachrichtigungsskript
#
Kontakt='root@localhost'
benachrichtigen() {
    mailsubject="`hostname` soll $1:$2 Floating sein"
    mailbody="`date '+%F %H:%M:%S'`: VRRP-Übergang, `Hostname` in $1 geändert"
    echo $mailbody | mail -s "$mailsubject" $kontakt
}
Fall "$1" in
    Master)
        Master benachrichtigen $2
        /etc/rc.d/init.d/haproxy Neustart
        Ausfahrt 0
    ;;
    Sicherung)
        Backup benachrichtigen $2 # Wenn der Knoten in den Sicherungszustand wechselt, muss der Haproxy-Dienst nicht absichtlich gestoppt werden, um zu verhindern, dass chk_maintaince und chk_haproxy den Haproxy-Dienst mehrmals ausführen.
        Ausfahrt 0
    ;;
    Fehler)
        Fehler melden $2 # Wie oben exit 0
    ;;
    *)
        echo 'Verwendung: `Basisname $0` {Master|Backup|Fehler}'
        Ausfahrt 1
    ;;
esac

Führen Sie den Startbefehl „keepalved“ auf beiden Knoten aus. Der Befehl lautet wie folgt:

  $ Dienst Keepalived Start 

4. Haproxy-Bereitstellung

HAProxy muss auf beiden Knoten installiert werden. Der Befehl lautet wie folgt:

 $ yum -y installiere haproxy

Ändern Sie die Konfiguration der Datei haproxy.cfg auf den Knoten 172.16.25.109 und 172.16.25.110 (die Konfigurationsdateien auf den beiden Knoten sind konsistent). Der Befehl lautet wie folgt:

 $ vim /etc/haproxy/haproxy.cfg

Der Inhalt der Konfigurationsdatei ist wie folgt:

weltweit
    Protokoll 127.0.0.1 local2
    chroot /var/lib/haproxy
    pid-Datei /var/run/haproxy.pid
    maxconn 4000
    Benutzer Haproxy
    Gruppen-Haproxy
    Daemon # Als Hintergrundprogramm ausführen;
Vorgabewerte
    Modus http # Wählen Sie den HTTP-Modus, um eine Filterung der Ebene 7 durchzuführen;
    globales Protokoll
    Option httplog # kann eine umfangreichere Protokollausgabe erhalten;
    Option dontlognull
    Option http-server-close # Der Server kann die HTTP-Verbindungsfunktion schließen;
    Option Forwardfor außer 127.0.0.0/8 # Übergebe die IP-Adresse des Clients an den Server und schreibe sie in den Header „X-Forward_for“.
    Option Redispatch
    Wiederholungsversuche 3
    Timeout für HTTP-Anforderungen: 10 s
    Timeout-Warteschlange 1m
    Timeout Verbindung 10s
    Timeout-Client 1m
    Timeout-Server 1m
    Zeitüberschreitung HTTP-Keep-Alive 10 s
    Timeout-Prüfung 10s
    maxconn 30000
Hörstatistiken
    Modus http
    bind 0.0.0.0:1080 # Die Statistikseite ist an Port 1080 gebunden;
    stats enable # Aktivieren Sie die Statistikseitenfunktion;
    Statistiken Hide-Version #Haproxy-Versionsnummer ausblenden;
    stats uri /haproxyadmin?stats #Passen Sie die Zugriffs-URI der Statistikseite an;
    Stats Realm Haproxy\ Statistics #Eingabeaufforderung für Informationen zur Kennwortüberprüfung auf der Statistikseite;
    stats auth admin:admin # Anmeldeauthentifizierung für die Statistikseite aktivieren;
    stats admin if TRUE # Wenn der angemeldete Benutzer die Überprüfung besteht, wird ihm die Verwaltungsfunktion gewährt;
Frontend-HTTP-In
    binden *:80
    Modus http
    globales Protokoll
    Option httpclose
    Option Logasap
    Option dontlognull
    Erfassen Sie den Anforderungsheader Host-Länge 20
    Erfassungsanforderungsheader Referrer-Länge 60
    acl url_static path_beg -i /static /p_w_picpaths /javascript /stylesheets
    acl url_static path_end -i .jpg .jpeg .gif .png .css .js .html
    use_backend static_servers if url_static # Anfragen, die den ACL-Regeln entsprechen, werden an den statischen Backend-Server weitergeleitet default_backend dynamic_servers # Anfragen werden standardmäßig an den dynamischen Backend-Server weitergeleitet backend static_servers
    Rundenturnier
    Server imgsrv1 192.168.0.25:80 check maxconn 6000 # Statischer Server, mehrere Server können konfiguriert und das Gewicht kann festgelegt werden;
Backend dynamische_Server
    Balance-Quelle # Bei dynamischen Anforderungen kann der Quellplanungsalgorithmus verwendet werden, um bis zu einem gewissen Grad Sitzungspersistenz zu erreichen; am besten ist es jedoch, Cookie-Bindung zu verwenden, um Sitzungspersistenz zu erreichen. Server websrv1 192.168.0.35:80 check maxconn 1000 # Dynamische Server können mit mehreren Servern konfiguriert und Gewichte festgelegt werden.

Die beiden Knoten starten den Dienst mit den folgenden Befehlen:

$ Dienst HaProxy starten

5. Nginx-Bereitstellung

yum -y groupinstall "Entwicklungstools"
yum -y groupinstall „Serverplattform-Entwicklung“
yum installiere gcc openssl-devel pcre-devel zlib-devel
Gruppenadd -r nginx
Benutzeradd -r -g nginx -s /sbin/nologin -M nginx
tar xf nginx-1.4.7.tar.gz
cd nginx-1.4.7
mkdir -pv /var/tmp/nginx
./konfigurieren \
  --prefix=/usr \
  --sbin-path=/usr/sbin/nginx \
  --conf-path=/etc/nginx/nginx.conf \
  --error-log-path=/var/log/nginx/error.log \
  --http-log-path=/var/log/nginx/access.log \
  --pid-path=/var/run/nginx/nginx.pid \
  --lock-path=/var/lock/nginx.lock \
  --Benutzer=nginx \
  --group=nginx \
  --mit-http_ssl_module \
  --mit-http_flv_module \
  --mit-http_stub_status_module \
  --mit-http_gzip_static_module \
  --http-client-body-temp-path=/var/tmp/nginx/client/ \
  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
  --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
  --http-scgi-temp-path=/var/tmp/nginx/scgi \
  --mit-pcre
machen && machen installieren

Konfigurieren von Dienstskripten

vi /etc/init.d/nginx # Serviceskript konfigurieren#!/bin/sh
#
# nginx - dieses Skript startet und stoppt den nginx-Daemon
#
# chkconfig: -85 15
# Beschreibung: Nginx ist ein HTTP(S)-Server, HTTP(S) Reverse \
# Proxy und IMAP/POP3-Proxyserver
# Prozessname: nginx
# Konfiguration: /etc/nginx/nginx.conf
# Konfiguration: /etc/sysconfig/nginx
# PID-Datei: /var/run/nginx.pid
# Quellfunktionsbibliothek.
. /etc/rc.d/init.d/Funktionen
# Quellnetzwerkkonfiguration.
. /etc/sysconfig/netzwerk
# Überprüfen Sie, ob das Netzwerk aktiv ist.
[ "$NETWORKING" = "nein" ] && exit 0
nginx="/usr/sbin/nginx"
prog=$(Basisname $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
   # erforderliche Verzeichnisse erstellen
   Benutzer=`nginx -V 2>&1 | grep "Argumente konfigurieren:" | sed 's/[^*]*--Benutzer=\([^ ]*\).*/\1/g' -`
   Optionen=`$nginx -V 2>&1 | grep 'Argumente konfigurieren:'`
   für Opt-in $options; tun
       wenn [ `echo $opt | grep '.*-temp-path'` ]; dann
           Wert=`echo $opt | cut -d "=" -f 2`
           wenn [ ! -d "$wert" ]; dann
               # echo "erstellen" $value
               mkdir -p $Wert && chown -R $Benutzer $Wert
           fi
       fi
   Erledigt
}
Start() {
    [ -x $nginx ] || beenden 5
    [ -f $NGINX_CONF_FILE ] || beenden 6
    make_dirs
    echo -n $"$prog wird gestartet: "
    Daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    Echo
    [ $retval -eq 0 ] && touch $lockfile
    Rückgabewert $retval
}
stoppen() {
    echo -n $"$prog wird gestoppt: "
    killproc $prog -QUIT
    retval=$?
    Echo
    [ $retval -eq 0 ] && rm -f $lockfile
    Rückgabewert $retval
}
neu starten() {
    Konfigurationstest || return $?
    stoppen
    Schlaf 1
    Start
}
neu laden() {
    Konfigurationstest || return $?
    echo -n $"Lade $prog neu: "
    killproc $nginx -HUP
    RETVAL=$?
    Echo
}
force_reload() {
    Neustart
}
konfigurationtest() {
  $nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
    Status $prog
}
rh_status_q() {
    rh_status >/dev/null 2>&1
}
Fall "$1" in
    Start)
        rh_status_q und beenden 0
        1 Dollar
        ;;
    stoppen)
        rh_status_q || beenden 0
        1 Dollar
        ;;
    Neustart|Konfigurationstest)
        1 Dollar
        ;;
    neu laden
        rh_status_q || Ausgang 7
        1 Dollar
        ;;
    erzwungenes Neuladen
        erzwingen_neuladen
        ;;
    Status)
        rh_status
        ;;
    condrestart|versuchen Sie einen Neustart)
        rh_status_q || beenden 0
            ;;
    *)
        echo $"Verwendung: $0 {Start|Stopp|Status|Neustart|Condrestart|Neustartversuch|Neuladen|Neuladen erzwingen|Configtest}"
        Ausfahrt 2
esac
chmod +x /etc/init.d/nginx # Stellt die Ausführungsberechtigung des Serviceskripts wieder her vi /etc/nginx/nginx.conf # Bearbeiten Sie die Hauptkonfigurationsdatei worker_processes 2;
Fehlerprotokoll /var/log/nginx/nginx.error.log;
pid /var/run/nginx.pid;
Ereignisse {
    Arbeiterverbindungen 1024;
}
http {
    mime.types einschließen;
    Standardtyp Anwendung/Oktett-Stream;
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    sendfile an;
    KeepAlive-Timeout 65;
    Server {
        hören Sie 80;
        Servername xxrenzhe.lnmmp.com;
        Zugriffsprotokoll /var/log/nginx/nginx.access.log Haupt;
        Standort / {
            Wurzel /www/lnmmp.com;
            index.php index.html index.htm;
        }
        Fehlerseite 404 /404.html;
        Fehlerseite 500 502 503 504 /50x.html;
        Standort = /50x.html {
            Wurzel /www/lnmmp.com;
        }
        Standort ~ \.php$ {
            Wurzel /www/lnmmp.com;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $Dokumentstammsatz$fastcgi_script_name;
            fastcgi_params einschließen;
        }
    }
}
vi /etc/nginx/fastcgi_params # Fastcgi-Parameterdatei bearbeiten fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $Anforderungsmethode;
fastcgi_param CONTENT_TYPE $Inhaltstyp;
fastcgi_param CONTENT_LENGTH $Inhaltslänge;
fastcgi_param SCRIPT_FILENAME $Dokumentstammsatz$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $Dokumentstammsatz;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

Starten des Dienstes

service nginx configtest #Überprüfen Sie, ob die Konfigurationsdatei korrekt ist, bevor Sie den Dienst starten service nginx start
ps -ef |grep nginx # Überprüfen Sie den nginx-Prozess, insbesondere, ob der Worker-Prozess mit dem worker_processes-Wert übereinstimmt ss -antupl |grep 80 # Überprüfen Sie, ob der Service-Port gestartet ist

6. Zugangsverifizierung

Test der Haproxy-Statistikseite

Dynamischer und statischer Trenntest

Hochverfügbarkeitstests

Damit ist die Einführung in den Aufbau eines Nginx-Hochverfügbarkeitsclusters (Keepalived+Haproxy+Nginx) abgeschlossen.

Dies ist das Ende dieses Artikels über den Aufbau eines Nginx-Hochverfügbarkeitsclusters (Keepalived+Haproxy+Nginx). Weitere relevante Inhalte zum Nginx-Hochverfügbarkeitscluster finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Beispiel für die Implementierung eines Master-Slave-Hot-Standby mit Docker+keepalived+nginx
  • Nginx + Keepalived realisiert Hot-Standby von Dual-Maschinen
  • Konfigurationsmethode für Keepalived Dual-Machine Hot Standby Nginx
  • Keepalived implementiert Nginx-Lastausgleich und Beispielcode für hohe Verfügbarkeit
  • So implementieren Sie Dual-Machine-Master und Backup mit Nginx+Keepalived
  • Detaillierte Erläuterung der hochverfügbaren Master-Slave-Konfiguration von nginx+keepalived
  • Informationen zur Verwendung von Keepalived zum Erreichen eines automatischen Neustarts von Nginx und einer hohen Verfügbarkeit von Dual Active Hot Standby

<<:  Über den Lösungseintrag zur fehlenden Reaktion der Seite bei Verwendung von window.print() in React

>>:  Design-Story: Der Wachmann, der sich Nummernschilder nicht merken kann

Artikel empfehlen

Mehrere Möglichkeiten, Axios in Vue zu kapseln

Inhaltsverzeichnis Basisversion Schritt 1: Axios ...

MySQL deaktiviert die Überprüfung der Kennwortstärke

Informationen zur Überprüfung der Kennwortstärke:...

Erstellen einer KVM-Virtualisierungsplattform auf CentOS7 (drei Möglichkeiten)

KVM steht für Kernel-based Virtual Machine und is...

Zusammenfassung der Ereignisse, die Browser registrieren können

HTML-Ereignisliste Allgemeine Ereignisse: onClick ...

Asynchroner Lebenszyklus von AsyncHooks in Node8

Async Hooks ist eine neue Funktion von Node8. Sie...

Standard-CSS-Stil der XHTML-Sprache

html,Adresse, Blockzitat, Körper, dd, div, dl,dt,...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.11 (Win10)

In diesem Artikel werden die Installations- und K...

So erstellen Sie eine Ansicht in MySQL

Grundlegende Syntax Sie können eine Ansicht mit d...

Detaillierte Erläuterung der Verwendung des Linux-Zeitbefehls

1. Befehlseinführung Mit „time“ werden die für di...

So installieren Sie Nginx und konfigurieren mehrere Domänennamen

Nginx-Installation CentOS 6.x yum verfügt standar...

Praktisches Beispiel einer virtuellen Vue-Liste

Inhaltsverzeichnis Vorwort Design erreichen Zusam...

Drei BOM-Objekte in JavaScript

Inhaltsverzeichnis 1. Standortobjekt 1. URL 2. Ei...

Ein IE-Absturzfehler

Code kopieren Der Code lautet wie folgt: <styl...