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

Vue implementiert den Anwesenheitskalender von DingTalk

In diesem Artikel wird der spezifische Code von V...

js, um einen Karusselleffekt zu erzeugen

Ich denke, das Karussell ist ein relativ wichtige...

UCenter-Homepage fügt Statistikcode hinzu

UCenter Home ist ein von Comsenz veröffentlichtes ...

Uniapp implementiert Beispielcode für die Anmeldung mit DingTalk-Scancode

Da Uniapp nicht über eine autorisierte DingTalk-A...

So implementieren Sie eine bidirektionale MySQL-Sicherung

Die bidirektionale MySQL-Sicherung wird auch als ...

Einigen Eigenschaften in CSS geht ein "*" oder "_" voraus.

Einigen Eigenschaften in CSS geht ein "*&quo...

Tutorial zur Installation von JDK und Tomcat unter Linux CentOS

Laden Sie zuerst JDK herunter. Hier verwenden wir...

Beispiel zum Deaktivieren der Browser-Cache-Konfiguration im Vue-Projekt

Beim Freigeben eines Projekts müssen Sie häufig d...