Nginx의 가장 큰 특징은 리버스 프록시와 로드 밸런싱입니다. 이 글에서는 Nginx 로드 밸런싱의 구성에 대해 자세히 설명합니다.
로드 밸런싱
먼저, 로드 밸런싱이 무엇인지 간단히 알아보겠습니다. 말 그대로 이해하려면 N개의 서버가 로드를 균등하게 공유하며, 어떤 서버는 로드가 높아서 다운되지 않고, 어떤 서버는 유휴 상태가 되지 않는다고 설명할 수 있습니다. 그러면 로드 밸런싱의 전제는 여러 서버에서 달성할 수 있다는 것입니다. 즉, 두 개 이상의 서버이면 충분합니다.
테스트 환경
서버가 없기 때문에 이번 테스트에서는 지정된 도메인 이름을 직접 호스팅한 후 VMware에 CentOS 3개를 설치합니다.
테스트 도메인 이름: a.com
서버 IP : 192.168.5.149 (메인)
B서버 IP : 192.168.5.27
C 서버 IP: 192.168.5.126
배포 아이디어
서버 A가 메인 서버 역할을 하며, 도메인 이름은 서버 A(192.168.5.149)로 직접 확인되고, 서버 A는 서버 B(192.168.5.27)와 서버 C(192.168.5.126)로 로드 밸런싱됩니다.
그림과 같이:
도메인 이름 확인
실제 환경이 아니기 때문에 도메인 이름은 테스트용 a.com일 뿐이므로 a.com의 해상도는 호스트 파일에서만 설정할 수 있습니다.
열기: C:WindowsSystem32driversetchosts
끝에
추가
192.168.5.149 a.com
저장하고 종료한 후 명령 모드를 시작하고 ping을 통해 설정이 성공했는지 확인하세요
스크린샷을 보면 a.com이 192.168.5.149IP로 성공적으로 확인되었습니다
서버 nginx.conf 설정
nginx.conf를 엽니다. 파일 위치는 nginx 설치 디렉터리의 conf 디렉터리에 있습니다.
http 섹션
<code>upstream a<span>.</span>com { server <span>192.168</span><span>.5</span><span>.126</span>:<span>80</span>; server <span>192.168</span><span>.5</span><span>.27</span>:<span>80</span>; } server{ listen <span>80</span>; server_name a<span>.</span>com; location <span>/</span> { proxy_pass http:<span>//a.com;</span> proxy_set_header Host <span>$host</span>; proxy_set_header X<span>-Real</span><span>-IP</span><span>$remote_addr</span>; proxy_set_header X<span>-Forwarded</span><span>-For</span><span>$proxy_add_x_forwarded_for</span>; } }</code>
nginx를 저장하고 다시 시작하세요
에 다음 코드를 추가하세요.
B. C 서버 nginx.conf 설정
nginx.confi를 열고 http 섹션에 다음 코드를 추가하세요.
<code><span>server</span>{ listen <span>80</span>; server_name a.com; <span>index</span><span>index</span>.html; root /data0/htdocs/www; }</code>
nginx를 저장하고 다시 시작하세요
테스트
a.com에 접속할 때 어느 서버로 리다이렉트되어 처리되는지 구분하기 위해 서버 B와 C 각각에 내용이 다른 index.html 파일을 작성했습니다.
a.com에 액세스하기 위해 브라우저를 엽니다. 새로 고치면 모든 요청이 메인 서버(192.168.5.149)에 의해 서버 B(192.168.5.27)와 서버 C(192.168.5.126)로 분산되어 로드가 발생하는 것을 볼 수 있습니다. 균형 효과.
B서버 처리페이지
C 서버 처리 페이지
서버 중 하나가 다운되면 어떻게 되나요?
서버가 다운되면 액세스에 영향이 미치나요?
먼저 예제를 살펴보겠습니다. 위의 예제를 바탕으로 머신 C 서버 192.168.5.126이 다운되었다고 가정하고(다운타임 시뮬레이션이 불가능하여 C 서버를 종료했습니다) 다시 방문합니다.
방문 결과:
C 서버(192.168.5.126)가 다운되었음에도 불구하고 웹사이트 접속에는 영향을 미치지 않은 것으로 확인되었습니다. 이렇게 하면 특정 시스템이 로드 밸런싱 모드에서 다운되어 전체 사이트를 끌어 내리는 것에 대해 걱정할 필요가 없습니다.
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에 다음 코드를 추가합니다:
<code>upstream b<span>.</span>com { server <span>192.168</span><span>.5</span><span>.150</span>:<span>80</span>; server <span>192.168</span><span>.5</span><span>.151</span>:<span>80</span>; } server{ listen <span>80</span>; server_name b<span>.</span>com; location <span>/</span> { proxy_pass http:<span>//b.com;</span> proxy_set_header Host <span>$host</span>; proxy_set_header X<span>-Real</span><span>-IP</span><span>$remote_addr</span>; proxy_set_header X<span>-Forwarded</span><span>-For</span><span>$proxy_add_x_forwarded_for</span>; } }</code>
nginx를 저장하고 다시 시작하세요
192.168.5.150 및 192.168.5.151 시스템에서 nginx를 설정하고 nginx.conf를 열고 끝에 다음 코드를 추가합니다.
<code><span>server</span>{ listen <span>80</span>; server_name b.com; <span>index</span><span>index</span>.html; root /data0/htdocs/www; }</code>
保存重启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加入以下一段代码:
<code><span>server</span>{ listen <span>8080</span>; server_name a.com; <span>index</span><span>index</span>.html; root /data0/htdocs/www; }</code>
重启nginx,在浏览器输入a.com:8080试试看能不能访问。结果可以正常访问
既然能正常访问,那么我们就可以把主服务器添加到upstream中,但是端口要改一下,如下代码:
<code>upstream a.com { <span>server</span><span>192.168</span><span>.5</span><span>.126</span>:<span>80</span>; <span>server</span><span>192.168</span><span>.5</span><span>.27</span>:<span>80</span>; <span>server</span><span>127.0</span><span>.0</span><span>.1</span>:<span>8080</span>; }</code>
由于这里可以添加主服务器IP192.168.5.149或者127.0.0.1均可以,都表示访问自己。
重启Nginx,然后再来访问a.com看看会不会分配到主服务器上。
主服务器也能正常加入服务了。
最后
一、负载均衡不是nginx独有,著名鼎鼎的apache也有,但性能可能不如nginx。
二、多台服务器提供服务,但域名只解析到主服务器,而真正的服务器IP不会被ping下即可获得,增加一定安全性。
三、upstream里的IP不一定是内网,外网IP也可以。不过经典的案例是,局域网中某台IP暴露在外网下,域名直接解析到此IP。然后又这台主服务器转发到内网服务器IP中。
四、某台服务器宕机、不会影响网站正常运行,Nginx不会把请求转发到已宕机的IP上。
http://www.qttc.net/201208181.html
以上就介绍了Nginx负载均衡设置实例,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。