05. 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.