Nginx의 연구 노트 (오) - Nginx에 리버스 프록시 IP get 및 클라이언트


역방향 프록시에 대해 이야기하기 전에, 우리는 다시 한번 프록시 서버 및 정방향 프록시 무엇인지 검토합니다.

프록시 서버

프록시 서버는 클라이언트가 송신 할 때, 요청이 목적지 호스트로 직접 전송하지 않고, 프록시 서버로 전송 된 최초는 프록시 서버가 클라이언트 요청을 수신 한 후, 다시 호스트가 대상 호스트에 의해 전송되고 에이전트에 저장된 리턴 데이터를 수신 서버는 하드 디스크의 다음 클라이언트로 전송.

예를 들면 : 가게에서 단지 삶처럼 행동 - 아디다스 손님을 가게에하는 신발 한 켤레를 구입하는이 가게는 에이전트, 에이전트의 역할은 아디다스 제조업체는 목표는 사용자의 역할이다.

1.1 이유는 프록시 서버를 사용?

(1) 액세스 속도를 향상 :

프록시 서버의 하드 디스크에서 직접 읽을 동일한 데이터에 액세스 다음에 고객 사이트 그래서 다음 대상 호스트로 인해 프록시 서버의 하드 디스크에 저장됩니다 반환 된 데이터는 캐시 할 수 크게 특히 인기 사이트, 역할을했다 요청을 속도.

(2) 방화벽의 역할 :

모든 클라이언트 요청이 프록시 서버를 통해 원격 사이트에 액세스해야하기 때문에, 그래서 당신은 안전하지 않은 정보를 필터링, 프록시 서버에 제한을 설정할 수 있습니다.

(3) 액세스 프록시 서버를 통해 대상 사이트에 액세스 할 수 없습니다 :

인터넷 프록시 서버의 개발이 많이 있습니다, 클라이언트 액세스 시간 제한, 프록시 서버를 통해 대상 사이트에 액세스 할 수 있습니다하는 것은 제한되지 않는다.

앞으로 프록시는 1.2 무엇입니까?

프록시 서버 얻어진 원본 콘텐츠 요구를 발신 서버에 요청을 전송하는 클라이언트로부터 컨텐츠와 표적 제제 (원 서버)을 획득 한 후 전달하기 위해, 클라이언트 및 서버 원 서버 (원 서버) 사이에 위치한 클라이언트에 반환. 클라이언트는 앞으로 프록시를 사용할 수 있습니다.

단어 요약에 앞으로 연기 : 에이전트 에이전트는 클라이언트입니다.

앞으로 프록시의 가장 큰 특징은 : 클라이언트는 매우 액세스 서버 주소로 원하는 삭제되며, 서버는 요청을 프록시 서버에서 삭제하지만,에서 어떤 특정 클라이언트를 모른다. ; 앞으로 프록시 모드 마스크 또는 진정한 클라이언트 정보를 숨 깁니다.

리버스 프록시는 1.3 무엇입니까?

리버스 프록시 (역방향 프록시) 모드가 인터넷에 연결 요청을 수락하도록 프록시 서버를 의미, 그 요청, 인터넷에서 클라이언트 연결 요청에 대한 서버에서 반환 된 내부 네트워크에있는 서버 및 결과, 이 시점 리버스 프록시 서버의 성능에 대한 외부 프록시 서버에서.

단어 요약에 프록시 역 : 에이전트 프록시 서버입니다.

예를 들어 대부분의 사람들은 Taobao의는 모두 매일 Taobao의 역이 테이블 버스트 한 방문자의 수를 연결되어 사용 구입하는 사람들의 성장 욕구를 충족시킬 수 없다 단일 서버,이 시간은 익숙한 용어가 있었다 : 분산 배포, 대부분의 기능에서 Taobao의 역을 달성하기 위해 프록시 역 Nginx에 직접이며, 포장 및 기타 구성 요소 이후의 nginx에 의해에 큰 연주,이다, 액세스 제한의 수는 여러 서버를 배포하여 문제를 해결하기 위해 이름 : Tengine이
그림 삽입 설명 여기
그림은 Nginx에 후 Taobao의 클라이언트의 요청을 전국 사용자 모두가 프록시 서버를 리버스 대표, 다음의 nginx 서버는 처리를 위해 백엔드 비즈니스 처리 서버에 분산 특정 규칙에 따라, 수신합니다.

특징 : 이 시간에 소스 클라이언트 요청이 분명하지만, 특정 요청이 명확하지 않다 서버에 의해 처리.

주로 분산 서버 클러스터의 배포, 리버스 프록시 서버 수피 정보, 리버스 프록시

두, Nginx와는 역방향 프록시 GET 실제 IP 클라이언트

우리가 역방향 프록시에 대부분의 클라이언트가 서버에 직접 액세스 할 수없는 인터넷 기반 서비스,하지만 클라이언트 첫 번째 요청에 액세스 할 때 역방향 프록시 서버는 다음 서비스 액세스의 실현에 전달.
그림 삽입 설명 여기알 수있는 바와 같이,프록시 Nginx의 도메인 간 역방향 아니라 완전히 서버에 연결된 사용자와 서버의 분리를 요청의 소스를 변경실제 클라이언트 IP를 얻을 수없는 서버는 단지 다음 nginx를 어떻게 실제 IP 그것을 얻을, 리버스 프록시 서비스의 IP 얻으려면?

  • realip 모듈의 Nginx의 사용은 사용자의 실제 IP를 가져옵니다. 층 프록시 IP 제외하면 IP, XFF로부터 폐기 realip_module의 nginx 프록시 IP 계층을 달성하기 위해 사용될 수있는 모듈이 규칙에 따라 지정된 실제 사용자 얻을 사용자의 IP를 획득하는 것이다.의 nginx를 컴파일 할 때 realip_module 필요성의 nginx 모듈을 가진 - - http_realip_module 매개 변수를 추가 할 수 있습니다.

로컬 서버에 IP 아날로그 구현 접속 2.1

1, 압축을 푼 디렉토리로,realip_module 모듈을 추가, 재 컴파일, 메이크업

 ./configure --prefix=/usr/local/nginx --with-file-aio --with-http_realip_module  

그림 삽입 설명 여기

그림 삽입 설명 여기
nginx -V 번역 매개 변수를보기
그림 삽입 설명 여기

2,가상 호스트를 추가합니다 정력 /usr/local/nginx/conf/nginx.conf

server {
   	 listen 80;
        server_name server1;
   	 location / {
                return 200;
        }  
        }

그림 삽입 설명 여기
3, 개방형 서비스의 nginx 테스트 : (200) 설명이 성공적으로 추가 확인 호스팅 (기계 구문 분석을 추가하십시오)
그림 삽입 설명 여기

그림 삽입 설명 여기

그림 삽입 설명 여기

검출이 성공하면 4, 우리는 그를 보자 실제 IP에 대응

  • == $ REMOTE_ADDR : 클라이언트 대신에 IP, 그러나 그것의 값은 클라이언트가 제공하지만, 클라이언트의 IP를 기반으로 서버가 아닌 실제 클라이언트 IP를 지정하지 않은; == 당신이 브라우저에 액세스 할 때. 사이트가 중간 에이전트없이 가정 할 때, 다음 사이트의 웹 서버 (등의 Nginx, 아파치는) REMOTE_ADDR, 프록시를 사용하는 경우, 다음 브라우저가 프록시 액세스 첫번째 것, 컴퓨터의 IP를 설정을 넣어 것입니다 당신의 IP는 프록시에 요청 헤더에 연결하지 않는 한 다음 웹 서버가이 프록시 기계 REMOTE_ADDR는 IP를 설정할 수 있도록 함께 ,, 사이트에 에이전트가 전송 된 웹 서버로 전달
server {
  	 listen 80;
       server_name server1;
  	 location / {
               return 200 "client real ip: $remote_addr\n";
       }  
       }

그림 삽입 설명 여기

5 다시 시작의 nginx, 시험을 다시 부드럽게 :

그림 삽입 설명 여기

6, 에서 얻어진 X-전달-를 들어 실제 클라이언트에 IP 변경 구성 파일 : 정력 /usr/local/nginx/conf/nginx.conf

  • X가 전달 된-의 경우 : XFF 짧은 머리, 그것은 HTTP 요청 실제 IP가 클라이언트를 나타냅니다만 HTTP 프록시 서버 또는 위에서 언급 한 바와 같이 이러한 상황을 방지하기 위해, 당신은 프록시를 사용하는 경우, 웹 서버가 실제 IP를 모르고, 추가됩니다 부하 분산, 프록시 서버는 일반적으로 증가 할 때 x_forwarded_for 헤더 정보라고하며 사이트가 실제 웹 서버 IP를 얻을 수 있다는 것을 보장하기 위해 헤더 정보에 추가 된 클라이언트 IP (예 : 인터넷 컴퓨터 IP)에 연결합니다.
  • XFF的格式为X-Forwarded-For: client, proxy1, proxy2。 XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP(注意:如果未经严格处理,可以被伪造)。如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息X-Forwarded-For: IP0, IP1, IP2,Proxy3 直连服务器,它会给 XFF 追加 IP2,表示它是在帮 Proxy2 转发请求,列表中并没有 IP3,IP3 可以在服务端通过 Remote Address 字段获得。
server {
  	 listen 80;                    
       server_name server1;              # 添加域名
       set_real_ip_from 172.25.2.1;    # 真实服务器上一级代理的IP地址或者IP段,可以写多行
       real_ip_header X-Forwarded-For;    # 告知Nginx真实客户端IP从哪个请求头获取
       real_ip_recursive off;                       # 是否递归解析,off表示默认从最后一个地址开始解析;on表示从前往后依次递归获取ip
  	 location / {
               return 200 "client real ip: $remote_addr\n";
       }  
       }

그림 삽입 설명 여기
7、平滑重启nginx,再次测试:curl -H “X-Forwarded-For:1.1.1.1,172.25.2.1” server1

그림 삽입 설명 여기
当配置文件里的参数 real_ip_recursive 为off 时:

  • real_ip_recursive :是否递归解析,off表示默认从最后一个地址开始解析;on表示从前往后依次递归获取ip

그림 삽입 설명 여기

配置文件里的参数 real_ip_recursive 为on 时:

그림 삽입 설명 여기

2.2 配置真正的反向代理服务器

实验环境

主机信息 主机的功能(服务)
server1(172.25.2.1) 后端服务器 (nginx+http_realip_module )
server2(172.25.2.2) 反向代理服务器
真机(172.25.2.250) 用作客户端测试

1、在server1上面进行配置,修改nginx服务器默认发布页面的内容

그림 삽입 설명 여기
그림 삽입 설명 여기
2、修改配置文件,添加内容
그림 삽입 설명 여기

그림 삽입 설명 여기

3、进行语法检测,重启服务

그림 삽입 설명 여기
4、将server1上编译好的nginx的目录发送给server2

그림 삽입 설명 여기
5、在server2(代理服务器)上面进行配置,代理服务器的配置参考官网
그림 삽입 설명 여기

6, 프록시 서버 서버 2에서 구성 파일을 작성

그림 삽입 설명 여기

그림 삽입 설명 여기
삭제 프록시 웹 자원 위의 7, 서버 2

그림 삽입 설명 여기8, 쓰기 파싱 위의 실제 머신에서 테스트
그림 삽입 설명 여기

9, 당신은 IP의 서버 2는 호스트입니다 해당 도메인 이름을 볼 수 있지만, 릴리즈의 내용에 대한 액세스 서버 1 페이지입니다

그림 삽입 설명 여기
서버 1에 액세스 로그보기 : /usr/local/nginx/logs/access.log당신은의 nginx 서버가 클라이언트의 IP에 직접 얻을 수 있습니다 볼 수 있습니다.

의 nginx 서버의 두 행을 주석으로는 프록시 서버의 IP에 대한 접근은 IP입니다
그림 삽입 설명 여기
그림 삽입 설명 여기

서버 1에 액세스 로그보기 : /usr/local/nginx/logs/access.log당신의 nginx 서버를 볼 수있는 것은 프록시 서버의 IP는 IP를 얻을 수 있습니다.

게시 된 102 개 원래 기사 · 원의 찬양 (21) · 전망 5308

추천

출처blog.csdn.net/ranrancc_/article/details/102757067