Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Interviewfrage 7: So konfigurieren Sie den Nginx-Lastausgleich

PHP-Interviewfrage 7: So konfigurieren Sie den Nginx-Lastausgleich

不言
不言Original
2018-04-18 09:54:267132Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Konfiguration des Lastausgleichs von Nginx in Frage 7. Er hat einen gewissen Referenzwert. Jetzt kann ich ihn mit Ihnen teilen

Load Balancing


Nginx Load Balancing hat 4 Modi:

1), Polling (Standard)
Jede Anfrage wird in chronologischer Reihenfolge nacheinander einem anderen Backend-Server zugewiesen. Wenn der Backend-Server ausfällt, kann er automatisch eliminiert werden.
2), Gewicht
Geben Sie die Abfragewahrscheinlichkeit an. Die Gewichtung ist proportional zum Zugriffsverhältnis und wird verwendet, wenn die Leistung des Back-End-Servers ungleichmäßig ist.
2), ip_hash
Jede Anfrage wird entsprechend dem Hash-Ergebnis der Zugriffs-IP zugewiesen, sodass jeder Besucher festen Zugriff auf einen Back-End-Server hat, der das Sitzungsproblem lösen kann.
3), fair (Dritter)
Anfragen werden entsprechend der Antwortzeit des Back-End-Servers zugewiesen, und Anfragen mit kurzen Antwortzeiten werden zuerst zugewiesen.
4), url_hash (Dritter)

Konfigurationsmethode:

Öffnen Sie die Datei nginx.cnf

Upstream-Knoten unter http-Knoten hinzufügen :

upstream webname {  
  server 192.168.0.1:8080;  
  server 192.168.0.2:8080;  
}

Der Webname ist der von Ihnen gewählte Name. Der Zugriff erfolgt über diesen Namen in der URL. Wenn nichts hinzugefügt wird, erfolgt standardmäßig eine Abfrage Der erste Server wird aufgerufen, der zweite fordert den Zugriff auf den zweiten Server an. Kommen Sie der Reihe nach.

upstream webname {  
  server 192.168.0.1:8080 weight 2;  
  server 192.168.0.2:8080 weight 1;  
}

Dieses Gewicht ist auch leicht zu verstehen, je größer die Wahrscheinlichkeit, dass auf Server1 zugegriffen wird, und auf Server2 einmal zugegriffen wird

upstream webname {  
  ip_hash;  
  server 192.168.0.1:8080;  
  server 192.168.0.2:8080;  
}

ip_hash Die Konfiguration ist ebenfalls sehr einfach. Fügen Sie einfach eine Zeile hinzu, sodass jeder, der von derselben IP kommt, zum selben Server geht

und konfigurieren Sie ihn dann unter dem Serverknoten:

location /name {  
    proxy_pass http://webname/name/;  
    proxy_http_version 1.1;  
    proxy_set_header Upgrade $http_upgrade;  
    proxy_set_header Connection "upgrade";  
}

proxy_pass Der oben konfigurierte Webname ersetzt die ursprüngliche IP-Adresse.

Damit ist die Lastausgleichskonfiguration im Wesentlichen abgeschlossen.

Das Folgende ist die Konfiguration des Aktiv- und Backup-Knotens:

Noch im Upstream

upstream webname {  
  server 192.168.0.1:8080;  
  server 192.168.0.2:8080 backup;  
}

Legen Sie einen bestimmten Knoten als Backup fest, dann werden unter normalen Umständen alle Anfragen ausgeführt Greifen Sie auf Server1 zu. Server1 greift nur auf Server2 zu, wenn Server1 auflegt oder beschäftigt ist.

upstream webname {  
  server 192.168.0.1:8080;  
  server 192.168.0.2:8080 down;  
}

Setzen Sie einen Knoten auf „Down“, dann nimmt dieser Server nicht an der Last teil.

Implementierungsbeispiel

Lastausgleich ist etwas, was unsere stark frequentierte Website tun muss. Jetzt werde ich Ihnen die Lastausgleichskonfigurationsmethode auf dem Nginx-Server vorstellen für Studierende in Not.

Lastausgleich

Lassen Sie uns zunächst kurz verstehen, was Lastausgleich ist. Um es wörtlich zu verstehen, kann es erklären, dass N Server die Last gleichmäßig teilen, und das liegt nicht daran, dass ein bestimmter Server einen hat Hohe Auslastung Eine Situation, in der ein Server ausgefallen ist und sich im Leerlauf befindet. Die Voraussetzung für den Lastausgleich besteht darin, dass er von mehreren Servern erreicht werden kann, dh mehr als zwei Server sind ausreichend.

Testumgebung
Da kein Server vorhanden ist, hostet dieser Test direkt den angegebenen Domänennamen und installiert dann drei CentOS in VMware.

Testdomänenname: a.com

A-Server-IP: 192.168.5.149 (Haupt)

B-Server-IP: 192.168.5.27

C-Server IP: 192.168.5.126

Bereitstellungsidee
Ein Server wird als Hauptserver verwendet, der Domänenname wird direkt auf A-Server (192.168.5.149) aufgelöst und die A-Server-Last wird auf B-Server verteilt ( 192.168.5.27) und C auf dem Server (192.168.5.126).

Auflösung des Domänennamens

Da es sich nicht um eine reale Umgebung handelt, lautet der Domänenname zum Testen nur a.com, sodass die Auflösung von a.com nur in der Hosts-Datei festgelegt werden kann.

Öffnen: C:WindowsSystem32driversetchosts

Fügen Sie

192.168.5.149    a.com

am Ende hinzu, um zu speichern und zu beenden. Starten Sie dann den Befehlsmodus und pingen Sie, um zu sehen, ob die Einstellung erfolgreich ist

Dem Screenshot nach zu urteilen, wurde a.com erfolgreich auf 192.168.5.149IP analysiert

Ein Server nginx.conf-Einstellungen
Öffnen Sie nginx.conf und der Speicherort der Datei befindet sich in der conf Verzeichnis des Nginx-Installationsverzeichnisses.

Fügen Sie den folgenden Code im http-Bereich hinzu

upstream a.com { 
      server  192.168.5.126:80; 
      server  192.168.5.27:80; 
} 

server{ 
    listen 80; 
    server_name a.com; 
    location / { 
        proxy_pass        http://a.com; 
        proxy_set_header  Host            $host; 
        proxy_set_header  X-Real-IP        $remote_addr; 
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for; 
    } 
}

Speichern Sie Nginx und starten Sie es neu

B- und C-Server nginx.conf-Einstellungen
Öffnen Sie nginx.conf und fügen Sie es hinzu es im http-Abschnitt Der folgende Code

server{ 
    listen 80; 
    server_name a.com; 
    index index.html; 
    root /data0/htdocs/www; 
}

Nginx speichern und neu starten

Test
Um beim Zugriff auf a.com zu unterscheiden, an welchen Server zur Verarbeitung übertragen werden soll, habe ich Ich habe jeweils eine Index.html-Datei unter den B- und C-Servern mit unterschiedlichem Inhalt geschrieben, um sie zu unterscheiden.

Öffnen Sie den Browser, um auf a.com Refresh zuzugreifen. Sie werden feststellen, dass alle Anfragen vom Hauptserver (192.168.5.149) an Server B (192.168.5.27) und Server C (192.168.5.126) verteilt werden. . Erzielter Lastausgleichseffekt.

B-Server-Verarbeitungsseite

C-Server-Verarbeitungsseite

Was passiert, wenn einer der Server ausfällt?
Wird der Zugriff beeinträchtigt, wenn ein Server ausfällt?

Schauen wir uns zunächst das Beispiel an. Nehmen wir basierend auf dem obigen Beispiel an, dass der C-Server 192.168.126 der Maschine ausgefallen ist (da es unmöglich ist, die Ausfallzeit zu simulieren, habe ich den C-Server heruntergefahren). und dann noch einmal besuchen.

Zugriffsergebnisse:

Wir haben festgestellt, dass der C-Server (192.168.5.126) zwar ausgefallen war, dies jedoch keinen Einfluss auf den Website-Zugriff hatte. Auf diese Weise müssen Sie sich keine Sorgen darüber machen, dass die gesamte Site heruntergefahren wird, weil ein bestimmter Computer im Lastausgleichsmodus ausfällt.

如果b.com也要设置负载均衡怎么办?
很简单,跟a.com设置一样。如下:

假设b.com的主服务器IP是192.168.5.149,负载均衡到192.168.5.150和192.168.5.151机器上

现将域名b.com解析到192.168.5.149IP上。

在主服务器(192.168.5.149)的nginx.conf加入以下代码:

upstream b.com { 
      server  192.168.5.150:80; 
      server  192.168.5.151:80; 
} 

server{ 
    listen 80; 
    server_name b.com; 
    location / { 
        proxy_pass        http://b.com; 
        proxy_set_header  Host            $host; 
        proxy_set_header  X-Real-IP        $remote_addr; 
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for; 
    } 
}

保存重启nginx

在192.168.5.150与192.168.5.151机器上设置nginx,打开nginx.conf在末尾添加以下代码:

server{ 
    listen 80; 
    server_name b.com; 
    index index.html; 
    root /data0/htdocs/www; 
}

保存重启nginx

完成以后步骤后即可实现b.com的负载均衡配置。

主服务器不能提供服务吗?
以上例子中,我们都是应用到了主服务器负载均衡到其它服务器上,那么主服务器本身能不能也加在服务器列表中,这样就不会白白浪费拿一台服务器纯当做转发功能,而是也参与到提供服务中来。

如以上案例三台服务器:

A服务器IP :192.168.5.149 (主)

B服务器IP :192.168.5.27

C服务器IP :192.168.5.126

我们把域名解析到A服务器,然后由A服务器转发到B服务器与C服务器,那么A服务器只做一个转发功能,现在我们让A服务器也提供站点服务。

我们先来分析一下,如果添加主服务器到upstream中,那么可能会有以下两种情况发生:

1、主服务器转发到了其它IP上,其它IP服务器正常处理;

2、主服务器转发到了自己IP上,然后又进到主服务器分配IP那里,假如一直分配到本机,则会造成一个死循环。

怎么解决这个问题呢?因为80端口已经用来监听负载均衡的处理,那么本服务器上就不能再使用80端口来处理a.com的访问请求,得用一个新的。于是我们把主服务器的nginx.conf加入以下一段代码:

server{ 
    listen 8080; 
    server_name a.com; 
    index index.html; 
    root /data0/htdocs/www; 
}

重启nginx,在浏览器输入a.com:8080试试看能不能访问。结果可以正常访问

既然能正常访问,那么我们就可以把主服务器添加到upstream中,但是端口要改一下,如下代码:

upstream a.com { 
      server  192.168.5.126:80; 
      server  192.168.5.27:80; 
      server  127.0.0.1:8080; 
}

由于这里可以添加主服务器IP192.168.5.149或者127.0.0.1均可以,都表示访问自己。

重启Nginx,然后再来访问a.com看看会不会分配到主服务器上。

主服务器也能正常加入服务了。

最后
一、负载均衡不是nginx独有,著名鼎鼎的apache也有,但性能可能不如nginx。

二、多台服务器提供服务,但域名只解析到主服务器,而真正的服务器IP不会被ping下即可获得,增加一定安全性。

三、upstream里的IP不一定是内网,外网IP也可以。不过经典的案例是,局域网中某台IP暴露在外网下,域名直接解析到此IP。然后又这台主服务器转发到内网服务器IP中。

四、某台服务器宕机、不会影响网站正常运行,Nginx不会把请求转发到已宕机的IP上

相关推荐:

php面试题六之memcache和redis的区别

php面试题五之nginx如何调用php和php-fpm的作用和工作原理

php面试题四之实现autoload

Das obige ist der detaillierte Inhalt vonPHP-Interviewfrage 7: So konfigurieren Sie den Nginx-Lastausgleich. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn