CDN 스케줄 러 HAProxy, Nginx, Varnish
6263 단어 CDN
즉, 사용자 의 서로 다른 소스 IP 에 따라 사용자 요청 을 서로 다른 CDN 서버 로 재 설정 하 는 것 이다.그렇다면 어떻게 이 뤄 질 까?
스마트 DNS 는 방법 중 하나 로 안정 적 이 고 효과 적 이다.그러나 적어도 두 가지 환경 에서 우 리 를 완전히 만족 시 키 지 못 한다. 1. 특별한 스케줄 이 필요 할 때.대부분의 DNS 서버 는 DNS 확장 프로 토 콜 을 지원 하지 않 기 때문에 사용자 의 실제 IP 를 받 지 못 하고 Local DNS 에 따라 만 스케줄 링 할 수 있 습 니 다.2. 방문 이 특히 잦 을 때.매번 스케줄 링 이 DNS 를 한 번 촉발 하기 때문에 요청 이 밀집 되면 DNS 요청 자체 가 가 져 오 는 비용 도 상응 하 게 커진다.3. 서버 의 대역 폭 용량, 연결 수, 부하 상황, 즉석 여부 에 따라 조정 해 야 할 때.DNS Server 에 CDN 노드 서버 정보 가 없 기 때문에 이런 스케줄 링 은 어려워 질 수 있다.
이 럴 때 저 희 는 1. 사용 자 를 한 대 또는 몇 대의 통 일 된 서버 로 먼저 안내 할 수 있 습 니 다.2. 사용자 의 실제 IP 를 받 아 서비스 서버 를 계산 하도록 합 니 다.3. HTTP 302 또는 다른 방식 으로 사용 자 를 최종 서버 로 지정 합 니 다.
사용자 가 먼저 방문 한 몇 대의 서버 에 배치 되 어 있 으 며, IP 를 찾 은 후에 사용자 가 요청 한 소프트웨어 를 다시 지정 합 니 다. 우 리 는 그것 을 '스케줄 러' 라 고 부 릅 니 다.
HAProxy 구현: HAProxy 는 0.0.0.1 - 0.8255.255 cn 과 같은 IP 세그먼트 표시 방법 을 지원 하지 않 고 1.1.4.0 / 22 "CN" 의 IP 세그먼트 표시 방법 만 지원 합 니 다.1. 우 리 는 먼저 IP 세그먼트 를 인식 하 는 방식 으로 전환 해 야 한다.a > iprang. c 또는 iprang. c 로 컬 미 러 다운로드;b > gcc - s - O3 - o iprange iprange. c 컴 파일;c > IP 세그먼트 목록 geo. txt 형 을 정리 합 니 다:
# head geo.txt
"1.0.0.0","1.0.0.255","AU"
"1.0.1.0","1.0.3.255","CN"
"1.0.4.0","1.0.7.255","AU"
"1.0.8.0","1.0.15.255","CN"
"1.0.16.0","1.0.31.255","JP"
"1.0.32.0","1.0.63.255","CN"
"1.0.64.0","1.0.127.255","JP"
"1.0.128.0","1.0.255.255","TH"
"1.1.0.0","1.1.0.255","CN"
"1.1.1.0","1.1.1.255","AU"
d > HAProxy 가 인식 하 는 IP 세그먼트 목록 출력:
# cut -d, -f1,2,5 geo.txt | ./iprange | head
1.0.0.0/24 "AU"
1.0.1.0/24 "CN"
1.0.2.0/23 "CN"
1.0.4.0/22 "AU"
1.0.8.0/21 "CN"
1.0.16.0/20 "JP"
1.0.32.0/19 "CN"
1.0.64.0/18 "JP"
1.0.128.0/17 "TH"
1.1.0.0/24 "CN"
1.1.1.0/24 "AU"
e > 관리 하기 쉬 운 목적 으로 통 합 된 IP 세그먼트 를 같은 파일 에 분류 합 니 다.
# cut -d, -f1,2,5 geo.txt | ./iprange | sed 's/"//g' | awk -F' ' '{ print $1 >> $2".subnets" }'
# ls *.subnets
A1.subnets AX.subnets BW.subnets CX.subnets FJ.subnets GR.subnets IR.subnets LA.subnets ML.subnets NF.subnets PR.subnets SI.subnets TK.subnets VE.subnets
# cat AU.subnets
1.0.0.0/24
1.0.4.0/22
1.1.1.0/24
f > 이 파일 들 을 같은 폴 더 아래 에 놓 습 니 다. / etc / haproxy / conf / 를 예 로 들 면.
2. HAProxy 를 올 바 르 게 설정 하여 이 IP 세그먼트 를 규칙 으로 올 바 르 게 조정 합 니 다.다음은 haproxy. cfg 의 예 입 니 다.설정 후 Haproxy 를 다시 시작 하면 됩 니 다.
global
log 127.0.0.1 local2 debug
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 8000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 8000
frontend main *:5000
acl geo_A1 src -f /etc/haproxy/conf/A1.subnets
acl geo_AX src -f /etc/haproxy/conf/AX.subnets
acl geo_BW src -f /etc/haproxy/conf/BW.subnets
acl geo_CX src -f /etc/haproxy/conf/CX.subnets
acl geo_FJ src -f /etc/haproxy/conf/FJ.subnets
...
reqrep ^([^\ ]*)\ /(.*)\ HTTP \1\ /\2&ipfrom=A1\ HTTP if geo_A1
reqrep ^([^\ ]*)\ /(.*)\ HTTP \1\ /\2&ipfrom=AX\ HTTP if geo_AX
reqrep ^([^\ ]*)\ /(.*)\ HTTP \1\ /\2&ipfrom=BW\ HTTP if geo_BW
reqrep ^([^\ ]*)\ /(.*)\ HTTP \1\ /\2&ipfrom=CX\ HTTP if geo_CX
reqrep ^([^\ ]*)\ /(.*)\ HTTP \1\ /\2&ipfrom=FJ\ HTTP if geo_FJ
...
default_backend static
backend static
server static 127.0.0.1:6081 check
Nginx 구현: Nginx 는 핵심 모듈 HttpGeoModule (http://wiki.nginx.org/HttpGeoModule) 의 협조 하에 스케줄 링 을 실현 한다.
http{
...
geo $useriprang {
ranges;
default a;
0.0.0.1-0.8.255.255 a;
0.9.0.0-0.255.255.255 a;
1.0.0.0-1.0.0.255 a;
1.0.1.0-1.0.1.255 b;
1.0.2.0-1.0.3.255 b;
1.0.4.0-1.0.7.255 a;
...
223.255.252.0-223.255.253.255 c;
223.255.254.0-223.255.254.255 a;
223.255.255.0-223.255.255.255 a;
}
upstream backend {
server 127.0.0.1:81;
}
server {
listen 80;
client_max_body_size 10240m;
location / {
proxy_redirect off;
proxy_pass http://backend$request_uri&useriprang=$useriprang;
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache cache_one;
proxy_cache_key $host:$server_port$uri$is_args$args;
expires 5s;
}
}
...
}
Varnish 구현: Varnish 는 두 개의 플러그 인 으로 스케줄 링 을 할 수 있 습 니 다.https://github.com/cosimo/varnish-geoip (Last updated: 28/05/2013)https://github.com/meetup/varnish-geoip-plugin (Last updated: 2010)
성능 문 제 는 위 와 같이 Haproxy, Nginx, Varnish 를 사용 하면 이 기능 을 신속하게 실현 할 수 있다.그 중에서 Nginx 와 Varnish 는 이분법 을 사용 하여 IP 표 에서 사용자 IP 를 찾 았 고 Haproxy 는 조목조목 걸 러 냈 다.따라서 IP 가 비교적 세분 화 되 고 IP 세그먼트 그룹 이 비교적 많 을 때 (분류 후 1000 그룹 이상) Haproxy 는 뚜렷 한 성능 저하 가 나타 나 고 나머지 두 가 지 는 이런 문제 가 없다.
다른 본 고 에서 사용 한 소프트웨어 버 전 은 다음 과 같다. HAProxy 1.4.22, Nginx 1.2.9, Varnish 3.0.4.HAProxy 와 Varnish 는 모두 현재 의 최신 버 전이 다.본문 에 참고 가 있다http://blog.exceliance.fr/2012/07/02/use-geoip-database-within-haproxy/다음으로 이동:
http://blog.yikuyiku.com/?p=3851
원본 주소:http://www.ttlsa.com/web/the-cdn-scheduler-nginx-haproxy-varnish/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
외부 script 파일 읽어들이기 , 라이브러리 사용해보기HTML 페이지 내부에 script 태그를 만들고 태그 내부에 자바스크립트 코드를 입력하였다. 그리고 VSCode(Visual Studio Code)에서 폴더를 열고 hyo.html 파일에 html:5를 열어 hea...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.