>  기사  >  백엔드 개발  >  nginx 애플리케이션: 로드 밸런싱을 위해 nginx 사용

nginx 애플리케이션: 로드 밸런싱을 위해 nginx 사용

不言
不言원래의
2018-06-01 15:15:301877검색

이 글에서는 주로 nginx의 응용을 소개합니다. nginx를 로드 밸런싱에 사용하는 것은 특정 참고 가치가 있습니다. 이제 필요한 친구들이 참고할 수 있도록 공유하겠습니다.

nginx 애플리케이션: 로드 밸런싱을 위해 nginx 사용
nginx는 일반적으로 7계층 로드 밸런싱에 사용될 수 있습니다. 이 기사에서는 로드 밸런싱에 대한 몇 가지 기본 지식과 로드 밸런싱을 위해 nginx를 사용하는 간단한 예를 소개합니다.

4레이어 로드 밸런싱 vs. 7레이어 로드 밸런싱

실제로는 ISO OSI 네트워크 모델의 레이어 이름에 따라 7레이어 로드 밸런싱이나 4레이어 로드 밸런싱이 결정된다고 흔히 말합니다. 애플리케이션 계층에서는 http 프로토콜을 사용하여 로드 밸런싱 작업을 수행하므로 7계층 로드 밸런싱이라고 합니다. 예를 들어, TCP 계층에서 로드 밸런싱 작업을 수행하는 LVS를 계층 4 로드 밸런싱이라고 합니다. 일반적으로 로드 밸런싱 분류는 다음과 같습니다.

Category OSI Model Layer Description
Layer 2 Load Balancing MAC 레이어 MAC 주소 기반 응답
3계층 로드 밸런싱 IP 계층 IP 주소에 따라 응답
4계층 로드 밸런싱 TCP 계층 포트 번호와 결합된 IP 주소를 기준으로 응답
7계층 로드 밸런싱 HTTP 레이어 4레이어를 기반으로 URL/브라우저 카테고리 등 7레이어 정보를 바탕으로 추가 대응 가능

공통 소프트웨어 지원

소프트웨어 4레이어 로드 밸런싱 7계층 로드 밸런싱
nginx 경량 구현 http 및 메일 지원, 성능은 haproxy
haproxy - 7계층 로드 밸런싱 지원
LVS 더 무거운 -
F5 하드웨어 구현 및 높은 비용 -

공통 로드 밸런싱 알고리즘을 구현하는 4계층 로드 밸런싱을 지원합니다. 알고리즘에는 다음이 포함됩니다. 다음:

로드 밸런싱 알고리즘일반 폴링 가중 폴링 Random BalanceWeighted Random응답 속도Least ConnectionDNS 응답로드 밸런싱 데모 예: 일반 폴링
로드 밸런싱 알고리즘(E) nginx 지원 여부 지침 적용 가능한 시나리오
라운드 로빈 지원 오른쪽 바퀴 동일한 가중치의 폴링 은 외부 서비스 요청과 내부 서버가 상대적으로 균형을 이루는 시나리오에 적합합니다.
가중 라운드 로빈 지원(가중치) 폴링에 다른 가중치를 설정할 수 있습니다. 서버 처리 능력이 다르거나 흐름을 제어하고 싶은 경우, 예를 들어 Canary Release
Random - 서버에 무작위로 할당 외부와 내부가 매우 균형 잡힌 경우 또는 무작위 할당에 대한 수요가 상대적으로 높음 Strong
Weighted Random - 가중치와 결합하여 서버에 무작위로 할당 랜덤 전략은 가중치와 결합하여 실제 생활에 더 잘 적응할 수 있도록 조정 가능 배포 조건
응답 시간 지원(공정) 서버의 응답 속도에 따라 할당 서버 성능과 서버의 현재 운영 상태를 조합하여 동적으로 조정할 수 있는 전략입니다. 능력 있는 사람이 더 이상 할 수 없는 경우에도 많은 작업을 할당하지 않도록 상태
Least Connection 연결 수에 따라 분배 Polling은 작업을 할당하기 때문입니다. 실제 상황에서 폴링에 의한 제어가 불가능하여 작업 완료 속도를 확인할 수 없으므로 실제 서버의 반영이 발생하며, 부하 연결 수가 다양하며 장기간 연결 서비스를 제공하는 기업에 적합합니다. 온라인 고객 서비스를 위한 WebSocket 구현이나 FTP/SFTP와 같은 서비스 등 오랜 시간이 걸렸습니다.
플래시 DNS - 다른 DNS에서 반환된 IP 주소를 무시하고 가장 빠르게 반환된 DNS 확인 결과를 기반으로 계속 서비스를 요청합니다. 글로벌 로드 밸런싱이 있는 상황에 적용 가능, 예, CDN

다음으로 nginx를 사용하여 일반 폴링 수행 방법을 시연합니다.

로드 밸런싱 알고리즘일반 폴링

미리 준비하세요

두 개의 포트 7001/7002에서 두 서비스를 미리 시작하여 서로 다른 정보를 표시하도록 했습니다. 시연의 편의를 위해 tornado를 사용하여 이미지를 만들었고, 도커 컨테이너 시작 시 전달되는 매개변수가 달라 표시됩니다. 서비스가 다릅니다.

[root@kong ~]# docker run -d -p 7001:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "User Service 1: 7001"ddba0abd24524d270a782c3fab907f6a35c0ce514eec3159357bded09022ee57
[root@kong ~]# docker run -d -p 7002:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "User Service 1: 7002"95deadd795e19f675891bfcd44e5ea622c95615a95655d1fd346351eca707951
[root@kong ~]# [root@kong ~]# curl http://192.168.163.117:7001Hello, Service :User Service 1: 7001[root@kong ~]# [root@kong ~]# curl http://192.168.163.117:7002Hello, Service :User Service 1: 7002[root@kong ~]#

Start nginx

[root@kong ~]# docker run -p 9080:80 --name nginx-lb -d nginx 9d53c7e9a45ef93e7848eb3f4e51c2652a49681e83bda6337c89a3cf2f379c74
[root@kong ~]# docker ps |grep nginx-lb9d53c7e9a45e        nginx                      "nginx -g 'daemon ..."   11 seconds ago      Up 10 seconds       0.0.0.0:9080->80/tcp                                                 nginx-lb
[root@kong ~]#

nginx code snippet

다음 nginx 코드 snippet을 준비하여 nginx

http {
upstream nginx_lb {    server 192.168.163.117:7001;    server 192.168.163.117:7002;
}server {
    listen       80;
    server_name  www.liumiao.cn 192.168.163.117;
    location / {
        proxy_pass http://nginx_lb;
    }

}

default.conf 수정 방법

의 /etc/nginx/conf.d/default.conf에 추가하세요. 효과를 얻으려면 컨테이너에 vim 설치를 사용하세요. 로컬에서 수정하여 docker cp를 통해 전달하거나 sed로 직접 수정할 수도 있습니다. 컨테이너에 vim을 설치하는 경우 다음 방법을 사용하세요

[root@kong ~]# docker exec -it nginx-lb sh# apt-get update...省略# apt-get install vim...省略

수정 전

# cat default.confserver {
    listen       80;
    server_name  localhost;    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;        index  index.html index.htm;
    }    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}}#

수정 후

# cat default.confupstream nginx_lb {    server 192.168.163.117:7001;    server 192.168.163.117:7002;
}server {
    listen       80;
    server_name  www.liumiao.cn 192.168.163.117;    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {        #root   /usr/share/nginx/html;
        #index  index.html index.htm;
        proxy_pass http://nginx_lb;
    }    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}}#

nginx 컨테이너를 다시 시작

[root@kong ~]# docker restart nginx-lbnginx-lb
[root@kong ~]#

결과를 확인하세요

폴링이 순서대로 수행되는 것을 확실히 볼 수 있습니다.

[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7001[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7002[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7001[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7002[root@kong ~]#

로드 밸런싱 데모 예시: 가중치 폴링

이를 기준으로 가중치 폴링은 가중치만 추가하면 됩니다

로드 밸런싱 알고리즘(E) nginx 지원 또는 not 설명 적용 시나리오
라운드 로빈 은 동일한 가중치로 폴링을 지원 외부 서비스 요청과 내부 서버가 상대적으로 균형을 이루는 시나리오에 적용 가능
로드 밸런싱 알고리즘 로드 밸런싱 알고리즘(E) nginx 지원 여부 설명 적용 가능한 시나리오
Weighted Round Robin Weighted Round Robin 지원(가중치) 폴링에 대해 서로 다른 가중치를 설정할 수 있습니다 서버의 처리 기능이 다르거나 Canary와 같은 트래픽 제어를 수행하려는 경우 Release

default.conf를 수정

default.conf를 다음과 같이 수정

# cp default.conf default.conf.org
# vi default.conf
# diff default.conf default.conf.org
2,3c2,3
<     server 192.168.163.117:7001 weight=100;<     server 192.168.163.117:7002 weight=200;
--->     server 192.168.163.117:7001;
>     server 192.168.163.117:7002;
#

nginx 컨테이너 재시작

[root@kong ~]# docker restart nginx-lbnginx-lb
[root@kong ~]#

결과 확인

1/3과 2/3에 따른 폴링 결과를 보실 수 있습니다 비율은 진행 중:

[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7001[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7002[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7002[root@kong ~]#

관련 권장 사항:

nginx 관리 구성 최적화

Nginx 역방향 프록시 웹 소켓 구성 예

위 내용은 nginx 애플리케이션: 로드 밸런싱을 위해 nginx 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.