05. Nginx 의 역방향 에이전트 와 부하 균형

11712 단어
Nginx 부하 균형
클 라 이언 트 의 방문 은 모두 백 엔 드 의 한 서버 에 대리 되 고 최종 적 으로 성능 병목 이 발생 하여 효율 이 떨 어 집 니 다. 전단 사용자 의 방문 속도 가 급 격 히 떨 어 집 니 다. 이 문 제 를 해결 하려 면 여러 대의 httpd 를 추가 하 는 동시에 대량의 병행 연결 을 받 아야 합 니 다. 모든 서버 가 받 는 병행 연결 이 낮 아 지고 효율 이 높 습 니 다. nginx 는 대리 로 서클 라 이언 트 의 요청 을 받 았 을 때 서로 다른 백 엔 드 서버 에 배 포 됩 니 다. 그러나 nginx 는 요청 을 받 은 후에 그 서버 에 배 치 됩 니 다. 어떤 규칙 과 수요 가 있 으 면 스케줄 링 알고리즘 으로 분배 해 야 합 니 다.
upstream 문법
# upstream      server{..}     
upstream  {  
# [    ];  
server IP:port [weight=] [max_fails=] [fail_timeout=];  
server IP:port [weight=] [max_fails=] [fail_timeout=];  
server IP:port [weight=] [max_fails=] [fail_timeout=];  
}  
  
weight=             #            
max_fails=          #          
fail_timeout=       #      ,    ,             
max_conns										#           
backup  										#         
down												#    server         

  
location / {  
 proxy_pass http://  
}  

스케줄 링 알고리즘
스케줄 링 알고리즘
개술
교대로 훈련 하 다
시간 순 으로 백 엔 드 서버 에 하나씩 할당 (기본 값)
weight
가중 윤 훈, weight 치가 클 수록 분 배 된 방문 확률 이 높 습 니 다.
Ip_hash
모든 요청 은 IP 에 접근 하 는 hash 결과 에 따라 분 배 됩 니 다. 같은 IP 에서 백 엔 드 서버 에 고정 적 으로 접근 할 수 있 습 니 다.
Url_hash
URL 에 접근 한 hash 결과 에 따라 요청 을 할당 합 니 다. 모든 URL 이 백 엔 드 서버 로 향 합 니 다.
Least_conn
최소 연결 수, 그 기 계 는 연결 수가 적 으 면 나 누 어 준다.
hash 관건 수치
hash 사용자 정의 key
rr
기본적으로 백 엔 드 서버 설정 가중치 (weight) 를 지원 합 니 다. 기본 값 은 1 입 니 다.
upstream linuxidc{
      server 10.0.0.77 weight=5;
      server 10.0.0.88 weight=10;
}

ip_hash
같은 IP 지역 의 클 라 이언 트 요청 에 따라 Nginx 는 백 엔 드 서버 로 대리 되 어 사이트 의 session 을 만 들 수 있 습 니 다.
upstream favresin{
      ip_hash;
      server 10.0.0.10:8080;
      server 10.0.0.11:8080;
}

least_conn
최소 연결, nginx 는 백 엔 드 서버 연결 수 를 자동 으로 감지 하여 최소 연결 서버 에 프 록 시 합 니 다.
우 리 는 윤 훈 알고리즘 이 요 구 를 각 백 엔 드 에 평균 적 으로 전달 하여 부하 가 대체적으로 같다 는 것 을 알 고 있다. 이것 은 모든 요구 가 차지 하 는 백 엔 드 시간 차이 가 많 지 않다 는 전제 가 있다. 만약 에 요구 시간 이 길 면 모든 백 엔 드 부하 가 비교적 높 을 것 이다. 이런 상황 에서 요 구 를 연결 수가 적은 백 엔 드 에 전달 하면 더욱 좋 은 부하 균형 효 과 를 얻 을 수 있다.이것 이 바로 leastconn 알고리즘.
least_conn 알고리즘 은 매우 간단 합 니 다. 먼저 백 엔 드 클 러 스 터 를 편리 하 게 하고 모든 백 엔 드 의 conns / weight 를 비교 하여 이 값 이 가장 작은 백 엔 드 를 선택 하 십시오.
만약 여러 개의 conns / weight 값 이 가장 작은 것 이 있다 면, 그들 에 게 가중 윤 훈 알고리즘 을 사용한다.https://blog.csdn.net/zhangskd/article/details/50242241
fair
백 엔 드 서버 의 응답 시간 에 따라 요청 을 분배 합 니 다. 응답 시간 이 짧 은 우선 분 배 는 weight 분배 정책 과 유사 합 니 다.
upstream favresin{     
      server 10.0.0.10:8080;
      server 10.0.0.11:8080;
      fair;
}

url_hash
url 에 접근 한 hash 결과 에 따라 요청 을 할당 하여 모든 url 을 백 엔 드 서버 로 지정 합 니 다. 백 엔 드 서버 가 캐 시 일 때 유효 합 니 다.
upstream 에 hash 문 구 를 추가 하고 server 문 구 는 weight 등 다른 매개 변 수 를 기록 할 수 없습니다. hashmethod 는 hash 알고리즘 을 사용 합 니 다.
upstream resinserver{
      server 10.0.0.10:7777;
      server 10.0.0.11:8888;
      hash $request_uri;
      hash_method crc32;
}
upstream:      #               ,            :
down:          #      server       .
weight:        #    1.weight  ,        。
max_fails:     
#             1.        ,  proxy_next_upstream        .
fail_timeout:  # max_fails    ,     。
backup: 
#       backup  down      ,  backup  。           。
#          Ip     
upstream bakend{ 
      ip_hash;
      server 10.0.0.11:9090 down;
      server 10.0.0.11:8080 weight=2;
      server 10.0.0.11:6060;
      server 10.0.0.11:7070 backup;
}

정방 향 에이전트 example 1:
구 글 에 올 라 갈 수 없습니다. 프 록 시 서버 를 찾 을 수 있 습 니 다. 프 록 시 에서 구 글 에 해당 하 는 프 록 시 주 소 를 설정 하면 됩 니 다. 그러면 프 록 시 에서 데 이 터 를 되 돌려 주 고 다시 우리 에 게 돌아 올 수 있 습 니 다. 그러면 우 리 는 구 글 을 방문 할 수 있 습 니 다. 옵션 - > 일반 - > 네트워크 프 록 시 - > 설정 - > 수 동 설정 프 록 시 - > ip 주소 포트 를 쓰 면 됩 니 다.
example 2
내부 네트워크 서버 는 외부 네트워크 에 접속 할 수 없 으 며, 외부 네트워크 에 접속 할 수 있 는 서버 를 대리 로 찾 아 인터넷 을 대체 하면 된다.
#        :
        # (1).           , google.
        # (2).     ,      .
        # (3).        ,      .
        # (4).            (      ),        .
#             
#             

Nginx 에이전트 설정 문법
Syntax: proxy_pass URL;
Default:    —
Context:    location, if in location, limit_except
http://localhost:8000/uri/
http://39.108.140.0:8000/uri/
http://unix:/tmp/backend.socket:/uri/
      
#           , 
Syntax: proxy_buffering on | off;
Default:    
proxy_buffering on;
Context:    http, server, location
#   :
proxy_buffer_size 
proxy_buffers 
proxy_busy_buffer_size    

#      
Syntax: proxy_redirect default;
proxy_redirect off;proxy_redirect redirect replacement;
Default:    proxy_redirect default;
Context:    http, server, location
  
#    
Syntax: proxy_set_header field value;
Default:    proxy_set_header Host $proxy_host;
            proxy_set_header Connection close;
Context:    http, server, location
#   : 
proxy_hide_header
proxy_set_body

#       TCP    
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location
#   
proxy_read_timeout  #     
proxy_send_timeout  #       ,         

# Proxy           
vim /etc/nginx/proxy_params
proxy_redirect default;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 32k;
proxy_buffering on;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;
//  location  
location / {
    proxy_pass http://127.0.0.1:8080;
    include proxy_params;
}

역방향 에이전트
리 버스 프 록 시 (Reverse Proxy) 의 실제 실행 방식 은 프 록 시 서버 로 인터넷 의 연결 요청 을 받 은 다음 내부 네트워크 에 있 는 서버 에 전송 요청 을 하고 서버 에서 얻 은 결 과 를 인터넷 에 연 결 된 클 라 이언 트 에 게 되 돌려 주 는 것 을 말 합 니 다. 이때 프 록 시 서버 는 대외 적 으로 하나의 서버 로 표 시 됩 니 다. (서버 프 록 시)
역방향 에이전트 의 용도:
내부 네트워크 의 안전 을 확보 하고 웹 공격, 대형 사 이 트 를 조직 하 며 보통 역방향 대 리 를 공공 네트워크 방문 주소 로 하고 웹 서버 는 내부 네트워크 입 니 다.
4. 567917. 부하 균형, 역방향 프 록 시 서버 를 통 해 사이트 의 부하 최적화. 4. 567918.
총결산
# 1.            ,     ,                .    (     )
# 2.            ,     ,                .  (     )

프 록 시 설정 인 스 턴 스
example 1:
클 라 이언 트 통과http://39.108.140.0- proxy 호스트 가 nginx 에 접근 할 때 로 컬 페이지 로 응답 합 니 다.통과 하 다.http://39.108.140.0/forum , proxy 호스트 접근 시 백 엔 드 서버 49.233.69.195 - rearend 호스트 에 프 록 시
vim /etc/nginx/conf.d/default.conf
    location /forum {
        proxy_pass http://49.233.69.195/;
    }

location 후 사용자 정의 URI 주 소 를 쓰 면 역방향 대 리 를 할 때 경 로 를 지정 해 야 합 니 다.location 를 정의 할 때 ~ ~ * 이러한 패턴 이 일치 하 는 문 자 를 추가 하면 뒤에 경로, proxypass 를 쓸 때 서버 주소 에 만 쓸 수 있 습 니 다. 즉, IP 뒤의 / 를 쓸 수 없습니다. 그렇지 않 으 면 문법 오류 가 발생 합 니 다.
location ~ /discuz {
          proxy_pass http://49.233.69.195;
      }
echo 123 > /usr/share/nginx/html/discuz/index.html
# elinks --dump 39.108.140.0/discuz

이 곳 에서 주의해 야 할 것 은 forum 의 쓰기 방법 에 따 르 면 루트 디 렉 터 리 는 forum 이 없 으 면 대리 에 성공 할 수 있 습 니 다. 그러나 discuz 의 쓰기 방법 에 따라 discuz 디 렉 터 리 가 있 더 라 도 123 \ # 파일 이 없 으 면 403, 404 와 같은 오 류 를 보고 할 수 있 습 니 다.
systemctl reload nginx
echo you-men > /usr/share/nginx/html/index.html
echo ten-xun > /usr/share/nginx/html/index.html
elinks 39.108.140.0 --dump
   you-men
elinks --dump 39.108.140.0/forum
   ten-xun

example 2:
클 라 이언 트 접근http://39.108.140.0/discuz백 엔 드 서버 로 프 록 시http://49.233.69.195bbs 디 렉 터 리 아래
location  /discuz {
    proxy_pass http://49.233.69.195/bbs;
}
echo ten-xun_bbs > /usr/share/nginx/html/bbs/index.html
elinks --dump 39.108.140.0/discuz
   ten-xun_bbs

example 3:
nginx 가 클 라 이언 트 접근 요청 에 응답 하지 않 고 모든 접근 요청 을 백 엔 드 서버 로 프 록 시 합 니 다.
location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
}

위 location 설명 을 디 렉 터 리 에 일치 하 는 것 으로 바 꾸 면 백 엔 드 서버 와 관련 된 location 에 프 록 시 합 니 다.
Nginx 의 4 층 부하 균형
무엇이 4 층 부하 균형 입 니까?
4 층 부하 균형 은 전송 층 프로 토 콜 패 키 지 를 바탕 으로 봉 인 된 것 이다 (예 를 들 어 TCP / IP). 그러면 우리 가 앞에서 사용 한 7 층 은 응용 층 을 말한다. 그의 조립 은 4 층 을 바탕 으로 4 층 이 든 7 층 이 든 모두 OSI 네트워크 모델 을 말한다.
4 층 부하 균형 응용 장면
#   +        ,                  ; :nginx             ,    LVS  keepalive。

#  :tcp       ,     TCP   (mysql、ssh),                         ,          。
# 1、          TCP/IP  、UDP  、        , :tcp/22、udp/53;
# 2、                        ;(          65535    )
# 3、                     ;(                )
# 4、              ,    tcp/ip  ,   http https  ;
# 5、                             。

Nginx 4 층 부하 균형 설정
1. 컴 파일 에 -- with - stream 모듈 을 추가 하 는 것 을 기억 하 세 요.
2. nginx. conf 기본 설정 파일 에 기본적으로 stream 설정 이 없습니다.stream 모듈 의 설정 은 http 설정 과 동급 이 므 로 http 에 쓰 지 않도록 주의해 야 합 니 다.
데이터 테스트 디 렉 터 리 설정
mkdir -p /nginx_test/web{1..2}
echo web1 > /nginx_test/web1/index.html 
echo web2 > /nginx_test/web2/index.html 

설정 nginx
cat conf/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
stream {
    log_format  proxy '$remote_addr $remote_port - [$time_local] $status $protocol '
                  '"$upstream_addr" "$upstream_bytes_sent" "$upstream_connect_time"' ;
    access_log /var/log/nginx/proxy.log proxy;
    upstream lb {
            server 121.36.43.223:81 weight=5 max_fails=3 fail_timeout=30s;
            server 121.36.43.223:82 weight=5 max_fails=3 fail_timeout=30s;
    }

    server {
            listen 80;
            proxy_connect_timeout 3s;
            proxy_timeout 3s;
            proxy_pass lb;
    }
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       81;
        server_name  localhost;
        location / {
            root   /nginx_test/web1;
            index  index.html index.htm;
        }
    }

    server {
        listen       82;
        server_name  localhost;
        location / {
            root   /nginx_test/web2;
            index  index.html index.htm;
        }   
    }
}

[root@nginx_test ~]# curl 121.36.43.223
web1
[root@nginx_test ~]# curl 121.36.43.223
web2
[root@nginx_test ~]# curl 121.36.43.223
web1

백 엔 드 서버 리 얼 클 라 이언 트 IP 기록
프 록 시 설정set_header, 백 엔 드 서버 에 실제 클 라 이언 트 IP 기록 실현
vim /etc/nginx/conf.d/default.conf
    location /forum {
        proxy_pass http://49.233.69.195/;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
	#         nginx       ;

        proxy_set_header x-real-ip $remote_addr; 
	#         httpd   
        #           httpd,    httpd     
systemctl reload nginx

httpd 라면 설정 파일 vim / etc / httpd / conf / httpd. conf LogFormat "% {x - real - ip} i% l% u% t"% r "% > s% b"% {Refer} i "% {User - agent} i" combined}
39.108.140.0 - - [01/Nov/2019:19:31:45 +0800] "GET / HTTP/1.0" 200 8 "-" "ELinks/0.12pre6 (textmode; Linux; -)" "-"                    
#   proxy_set_header        

..39.108.140.0 - - [01/Nov/2019:19:29:26 +0800] "GET / HTTP/1.0" 200 8 "-" "ELinks/0.12pre6 (textmode; Linux; -)" "47.92.24.137"   
#  proxy_set_header        

좋은 웹페이지 즐겨찾기