>  기사  >  운영 및 유지보수  >  nginx 로드 밸런싱 인스턴스 분석

nginx 로드 밸런싱 인스턴스 분석

WBOY
WBOY앞으로
2023-05-21 08:01:321088검색

nginx Load Balancing

보시다시피, 우리 웹사이트는 개발 초기 단계이기 때문에 nginx는 하나의 백엔드 서버에 대한 에이전트 역할만 하지만 웹사이트의 평판이 높아질수록 점점 더 많은 역할을 합니다. 서버가 실제로 처리할 수 없었기 때문에 여러 서버를 추가했습니다. 여기에서는 모든 사람을 위해 두 개의 서버를 예로 들어보겠습니다.

1.업스트림 로드 밸런싱 모듈 설명

케이스:

다음은 로드 밸런싱 서버 목록을 설정합니다.

upstream test.net{
ip_hash;
server 192.168.10.13:80;
server 192.168.10.14:80 down;
server 192.168.10.15:8009 max_fails=3 fail_timeout=20s;
server 192.168.10.16:8080;
}
server {
 location / {
  proxy_pass http://test.net;
 }
}

upstream은 nginx의 http 업스트림 모듈입니다. 이 모듈은 간단한 스케줄링 알고리즘을 사용하여 클라이언트 IP에서 백엔드 서버로의 로드 밸런싱을 달성합니다. 위 설정에서는 upstream 지시문을 통해 로드 밸런서 이름 test.net이 지정됩니다. 이 이름은 임의로 지정할 수 있으며 나중에 필요할 때 직접 호출할 수 있습니다.

2. 업스트림에서 지원되는 로드 밸런싱 알고리즘

nginx의 로드 밸런싱 모듈은 현재 4개의 스케줄링 알고리즘을 지원하며, 그 중 마지막 두 개는 타사 스케줄링 알고리즘에 속합니다.

  • 폴링(기본값). 각 요청은 시간순으로 하나씩 다른 백엔드 서버에 할당됩니다. 백엔드 서버가 다운되면 결함이 있는 시스템이 자동으로 제거되어 사용자 액세스에 영향을 미치지 않습니다. 가중치는 폴링 가중치를 지정하며, 가중치 값이 클수록 각 백엔드 서버의 성능이 고르지 않을 때 할당되는 확률이 높아집니다.

  • ip_hash. 각 요청은 액세스된 IP의 해시 결과에 따라 할당되므로 동일한 IP의 방문자는 백엔드 서버에 고정 액세스할 수 있으므로 동적 웹 페이지의 세션 공유 문제를 효과적으로 해결할 수 있습니다.

  • 공정해요. 이는 위의 두 가지보다 더 지능적인 로드 밸런싱 알고리즘입니다. 이 알고리즘은 페이지 크기와 로딩 시간을 기반으로 로드 밸런싱을 지능적으로 수행할 수 있습니다. 즉, 백엔드 서버의 응답 시간을 기반으로 요청을 할당하고 응답 시간이 짧은 요청의 우선 순위를 지정할 수 있습니다. nginx 자체는 fair를 지원하지 않습니다. 이 스케줄링 알고리즘을 사용해야 하는 경우 nginx의 upstream_fair 모듈을 다운로드해야 합니다.

  • url_hash. 이 방법은 액세스 URL의 해시 결과에 따라 요청을 할당하므로 각 URL이 동일한 백엔드 서버로 연결되므로 백엔드 캐시 서버의 효율성을 더욱 향상시킬 수 있습니다. nginx 자체는 url_hash를 지원하지 않습니다. 이 스케줄링 알고리즘을 사용해야 하는 경우 nginx 해시 소프트웨어 패키지를 설치해야 합니다.

3. 업스트림 지원 상태 매개변수

http 업스트림 모듈에서는 server 명령을 통해 백엔드 서버의 IP 주소와 포트를 지정할 수 있으며, 각 백엔드 서버를 설정할 수도 있습니다. 로드 밸런싱 일정 상태입니다. 일반적으로 사용되는 상태는

  • down입니다. 이는 현재 서버가 일시적으로 로드 밸런싱에 참여하지 않음을 의미합니다.

  • 백업, 예약된 백업 머신. 다른 모든 비대기 시스템이 다운되거나 사용 중인 경우에만 요청이 대기 시스템으로 전송되므로 대기 시스템의 로드가 가장 적습니다.

  • max_fails, 허용되는 요청 실패 횟수, 기본값은 1입니다. 숫자가 최대 숫자를 초과하면 Proxy_next_upstream 모듈에서 정의한 오류가 반환됩니다.

  • 여러 번의 실패(max_fails 횟수 도달) 후에는 일정 기간 동안 서비스가 일시 중지되고 failure_timeout이 트리거됩니다. max_fails는 failure_timeout과 함께 사용할 수 있습니다.

참고: 로드 스케줄링 알고리즘이 ip_hash인 경우 로드 밸런싱 스케줄링의 백엔드 서버 상태는 가중치 및 백업일 수 없습니다.

4. 실험적 토폴로지

nginx 로드 밸런싱 인스턴스 분석

5. nginx 로드 밸런싱 구성

[root@nginx ~]# vim /etc/nginx/nginx.conf
upstream webservers {
   server 192.168.18.201 weight=1;
   server 192.168.18.202 weight=1;
 }
 server {
   listen    80;
   server_name localhost;
   #charset koi8-r;
   #access_log logs/host.access.log main;
   location / {
       proxy_pass   http://webservers;
       proxy_set_header x-real-ip $remote_addr;
   }
}

참고, 업스트림은 서버 외부에서 정의되며{ } 서버 내부에서는 정의할 수 없습니다. 업스트림을 정의한 후, 이를 참조하려면 Proxy_pass를 사용하세요.

6. 구성 파일을 다시 로드합니다.

[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                      [确定]

7. 테스트해 보세요

nginx 로드 밸런싱 인스턴스 분석

nginx 로드 밸런싱 인스턴스 분석

참고: 검색 콘텐츠를 지속적으로 새로 고칠 수 있으며 web1과 web2가 교대로 나타나 로드 밸런싱 효과에 도달하는 것을 확인할 수 있습니다. .

8. 웹 접속 서버 로그를 확인하세요

web1:

[root@web1 ~]# tail /var/log/httpd/access_log
192.168.18.138 - - [04/sep/2013:09:41:58 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"
192.168.18.138 - - [04/sep/2013:09:41:58 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"
192.168.18.138 - - [04/sep/2013:09:41:59 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"
192.168.18.138 - - [04/sep/2013:09:41:59 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"
192.168.18.138 - - [04/sep/2013:09:42:00 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"
192.168.18.138 - - [04/sep/2013:09:42:00 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"
192.168.18.138 - - [04/sep/2013:09:42:00 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"
192.168.18.138 - - [04/sep/2013:09:44:21 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"
192.168.18.138 - - [04/sep/2013:09:44:22 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"
192.168.18.138 - - [04/sep/2013:09:44:22 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"

web2:

먼저 웹 서버 기록 로그 형식을 수정하세요.

[root@web2 ~]# vim /etc/httpd/conf/httpd.conf
logformat "%{x-real-ip}i %l %u %t \"%r\" %>s %b \"%{referer}i\" \"%{user-agent}i\"" combined
[root@web2 ~]# service httpd restart
停止 httpd:                        [确定]
正在启动 httpd:                      [确定]

그럼 여러번 방문하셔서 계속해서 로그를 확인해보세요.

[root@web2 ~]# tail /var/log/httpd/access_log
192.168.18.138 - - [04/sep/2013:09:50:28 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"
192.168.18.138 - - [04/sep/2013:09:50:28 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"
192.168.18.138 - - [04/sep/2013:09:50:28 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"
192.168.18.138 - - [04/sep/2013:09:50:28 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"
192.168.18.138 - - [04/sep/2013:09:50:28 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"
192.168.18.138 - - [04/sep/2013:09:50:28 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"
192.168.18.138 - - [04/sep/2013:09:50:28 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"
192.168.18.138 - - [04/sep/2013:09:50:28 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"
192.168.18.138 - - [04/sep/2013:09:50:29 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"
192.168.18.138 - - [04/sep/2013:09:50:29 +0800] "get / http/1.0" 200 23 "-" "mozilla/5.0 (compatible; msie 10.0; windows nt 6.1; wow64; trident/6.0)"

참고로, 두 서버의 로그에는 192.168.18.138의 액세스 로그가 기록되어 있는 것을 볼 수 있으며, 이는 로드 밸런싱 구성에도 성공했음을 나타냅니다.

9. 상태 확인을 위한 nginx 구성

  • max_fails, 허용되는 요청 실패 횟수, 기본값은 1입니다. 숫자가 최대 숫자를 초과하면 Proxy_next_upstream 모듈에서 정의한 오류가 반환됩니다.

  • 최대 허용 실패 횟수(max_fails)를 초과한 후 일정 시간(fail_timeout) 동안 서비스가 중단됩니다. 상태 확인은 max_fails 및 failure_timeout을 사용하여 수행할 수 있습니다.

[root@nginx ~]# vim /etc/nginx/nginx.conf
upstream webservers {
    server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
    server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
  }

10.重新加载一下配置文件

[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                      [确定]

11.停止服务器并测试

先停止web1,进行测试。
[root@web1 ~]# service httpd stop
停止 httpd:                        [确定]

nginx 로드 밸런싱 인스턴스 분석

注,大家可以看到,现在只能访问web2,再重新启动web1,再次访问一下。

[root@web1 ~]# service httpd start
正在启动 httpd:                      [确定]

nginx 로드 밸런싱 인스턴스 분석

nginx 로드 밸런싱 인스턴스 분석

注,大家可以看到,现在又可以重新访问,说明nginx的健康状态查检配置成功。但大家想一下,如果不幸的是所有服务器都不能提供服务了怎么办,用户打开页面就会出现出错页面,那么会带来用户体验的降低,所以我们能不能像配置lvs是配置sorry_server呢,答案是可以的,但这里不是配置sorry_server而是配置backup。

12.配置backup服务器

[root@nginx ~]# vim /etc/nginx/nginx.conf
server {
        listen 8080;
        server_name localhost;
        root /data/www/errorpage;
        index index.html;
    }
upstream webservers {
    server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
    server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
    server 127.0.0.1:8080 backup;
  }
[root@nginx ~]# mkdir -pv /data/www/errorpage
[root@nginx errorpage]# cat index.html
<h1>sorry......</h1>

13.重新加载配置文件

[root@nginx errorpage]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                      [确定]

14.关闭web服务器并进行测试

[root@web1 ~]# service httpd stop
停止 httpd:                        [确定]
[root@web2 ~]# service httpd stop
停止 httpd:                        [确定]

nginx 로드 밸런싱 인스턴스 분석

注,大家可以看到,当所有服务器都不能工作时,就会启动备份服务器。好了,backup服务器就配置到这里,下面我们来配置ip_hash负载均衡。

15.配置ip_hash负载均衡

ip_hash,每个请求按访问ip的hash结果分配,这样来自同一个ip的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。(一般电子商务网站用的比较多)

[root@nginx ~]# vim /etc/nginx/nginx.conf
upstream webservers {
    ip_hash;
    server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
    server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
    #server 127.0.0.1:8080 backup;
  }

注,当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能有backup。(有人可能会问,为什么呢?大家想啊,如果负载均衡把你分配到backup服务器上,你能访问到页面吗?不能,所以了不能配置backup服务器)

16.重新加载一下服务器

[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                      [确定]

17.测试一下

nginx 로드 밸런싱 인스턴스 분석

注,大家可以看到,你不断的刷新页面一直会显示的民web2,说明ip_hash负载均衡配置成功。下面我们来统计一下web2的访问连接数。

18.统计web2的访问连接数

[root@web2 ~]# netstat -an | grep :80 | wc -l
304

注,你不断的刷新,连接数会越来越多。

위 내용은 nginx 로드 밸런싱 인스턴스 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제