이 글의 내용은 PHP 면접 질문 7번에서 nginx의 로드 밸런싱을 구성하는 방법에 대한 것입니다. 특정 참고 값이 있습니다. 이제 필요한 친구들이 참고할 수 있도록 공유하겠습니다.
nginx 로드 밸런싱에는 4가지 모드가 있습니다:
1), Polling(기본값)
각 요청은 시간순으로 하나씩 다른 백엔드 서버에 할당됩니다. 백엔드 서버가 다운되면 자동으로 제거될 수 있습니다.
2)、체중
폴링 확률을 지정하며 가중치는 접속률에 비례하며 백엔드 서버 성능이 고르지 않을 때 사용됩니다.
2), ip_hash
각 요청은 액세스 IP의 해시 결과에 따라 할당되므로 각 방문자는 백엔드 서버에 대한 고정 액세스 권한을 갖게 되어 세션 문제를 해결할 수 있습니다.
3), fair(제3자)
백엔드 서버의 응답 시간에 따라 요청을 할당하고, 응답 시간이 짧은 요청부터 먼저 할당합니다.
4), url_hash(타사)
Open nginx.cnf 파일
http 노드 아래에 업스트림 노드 추가:
upstream webname { server 192.168.0.1:8080; server 192.168.0.2:8080; }
여기서 webname은 선택한 이름이며 마지막으로 이 이름이 사용됩니다. in 위의 예시처럼 URL에서 접속할 경우, 아무것도 추가하지 않는 것이 기본 폴링입니다. 첫 번째 요청은 첫 번째 서버에 액세스하고, 두 번째 요청은 두 번째 서버에 액세스합니다. 차례로 오세요.
upstream webname { server 192.168.0.1:8080 weight 2; server 192.168.0.2:8080 weight 1; }
이 가중치도 이해하기 쉽습니다. 위의 예에서는 server1이 두 번 액세스되고 server2가 한 번 액세스됩니다. 이렇게 하면 동일한 IP에서 오는 모든 사람이 동일한 서버로 이동합니다
그런 다음 서버 노드에서 구성합니다.
upstream webname { ip_hash; server 192.168.0.1:8080; server 192.168.0.2:8080; }
proxy_pass는 원래 IP 주소를 위에서 구성한 웹 이름으로 바꿉니다.
이렇게 하면 기본적으로 로드 밸런싱 구성이 완료됩니다.
다음은 활성 및 백업 구성입니다.
아직 업스트림에 있습니다
location /name { proxy_pass http://webname/name/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }
특정 노드를 백업으로 설정하면 일반적으로 모든 요청은 server1에 액세스합니다.
upstream webname { server 192.168.0.1:8080; server 192.168.0.2:8080 backup; }
서버가 없으므로 지정된 도메인 이름을 직접 호스팅한 후 VMware에 CentOS 3개를 설치하는 테스트입니다.
테스트 도메인 이름: a.com
A 서버를 메인 서버, 도메인 이름은 서버 A(192.168.5.149)로 직접 확인되고, 서버 A는 서버 B(192.168.5.27)와 서버 C(192.168.5.126)로 로드 밸런싱됩니다.
도메인 이름 확인
끝에 C:WindowsSystem32driversetchosts
upstream webname { server 192.168.0.1:8080; server 192.168.0.2:8080 down; }
nginx.conf를 엽니다. 파일 위치는 nginx 설치 디렉터리의 conf 디렉터리에 있습니다.
http 섹션에 다음 코드를 추가하세요
192.168.5.149 a.com
nginx.confi를 열고 http 섹션에 다음 코드를 추가하세요
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; } }
nginx를 저장하고 다시 시작하세요
a.com 접속 시 어떤 서버로 리다이렉트되어 처리되는지 구분하기 위해 서버 B와 C 각각에 내용이 다른 index.html 파일을 작성하여 구분했습니다.
브라우저를 열고 a.com을 방문하여 새로고침하면 모든 요청이 메인 서버(192.168.5.149)에 의해 서버 B(192.168.5.27)와 서버 C(192.168.5.126)에 할당되어 로드 밸런싱이 이루어지는 것을 확인할 수 있습니다. . 효과.
특정 서버가 다운되면 접속에 영향이 있나요?
먼저 예시를 살펴보겠습니다. 위의 예시를 바탕으로 머신 C 서버 192.168.5.126이 다운되었다고 가정하고 (다운타임 시뮬레이션이 불가능해서 C 서버를 종료했습니다) 방문해보세요. 다시.
如果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面试题五之nginx如何调用php和php-fpm的作用和工作原理
위 내용은 PHP 인터뷰 질문 7: nginx 로드 밸런싱을 구성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!