Nginx 설정 명령 의 실행 순서 (8)

10655 단어 nginx
앞에서 우 리 는 상세 하 게 토론 했다.  rewriteaccess  화해시키다  content  이 세 가지 가장 흔히 볼 수 있 는 Nginx 요청 처리 단계 입 니 다. 이 과정 에서 이 세 단계 에서 실행 되 는 많은 Nginx 모듈 과 그 설정 명령 도 소개 합 니 다.또한 요청 처리 단계 의 구분 은 설정 명령 의 집행 순서 에 직접적인 영향 을 미 친 다 는 것 을 알 수 있다. 이러한 단 계 를 숙지 하 는 것 은 서로 다른 Nginx 모듈 을 정확하게 설정 하고 서로 간 의 협동 작업 을 실현 하 는 데 매우 필요 하 다.그래서 우 리 는 이어서 남 은 단계 들 을 토론 할 것 이다.
 
    앞에서  (1)  Nginx 가 요청 을 처리 하 는 과정 은 모두 11 단계 로 나 뉘 는데, 실행 순서에 따라 다음 과 같다.  post-readserver-rewritefind-configrewritepost-rewritepreaccessaccesspost-accesstry-filescontent  그리고  log .
 
    가장 먼저 실 행 했 어  post-read  단 계 는 Nginx 에서 요청 헤더 (request headers) 를 읽 고 해석 한 후 바로 실 행 됩 니 다.이 단 계 는 앞에서 소개 한 것 처럼.  rewrite  단계 적 으로 Nginx 모듈 등록 처리 프로그램 을 지원 합 니 다.예 를 들 어 표준 모듈  ngx_realip  바로 post-read 단계 에서 처리 프로그램 을 등 록 했 습 니 다. Nginx 는 현재 요청 한 원본 주소 가 지정 한 요청 헤더 의 값 이 라 고 생각 하도록 하 는 기능 입 니 다.아래 의 이 예 를 사용 하 겠 습 니 다.  ngx_realip  모듈 은 제공 했다  set_real_ip_from  화해시키다  real_ip_header  이 두 설정 명령:
    server {
        listen 8080;
 
        set_real_ip_from 127.0.0.1;
        real_ip_header   X-My-IP;
 
        location /test {
            set $addr $remote_addr;
            echo "from: $addr";
        }
    }

여기 설정 은 Nginx 가 그 걸  127.0.0.1  모든 요청 의 원본 주 소 를 요청 헤더 로 변경 합 니 다.  X-My-IP  지정 한 값 입 니 다.동시에 이 예 는 표준 내장 변 수 를 사용 했다.  $remote_addr  현재 요청 한 원본 주 소 를 출력 하여 변경 되 었 는 지 확인 합 니 다.
 
    우선 이 걸 로 컬 에서 요청 해 볼 게 요.  /test  인터페이스:
    $ curl -H 'X-My-IP: 1.2.3.4' localhost:8080/test
    from: 1.2.3.4

여기 curl 도 구 를 사 용 했 어 요.  -H  옵션 을 선택 하면 추가 HTTP 요청 헤더 가 지 정 됩 니 다.  X-My-IP: 1.2.3.4. 출력 에서 볼 수 있 습 니 다. $remote_addr 변수의 값 이 확실히 있 습 니 다.  rewrite  단계 가 됐어 요.  X-My-IP  요청 헤더 에서 지정 한 값, 즉  1.2.3.4. 그렇다면 Nginx 는 현재 요청 한 원본 주 소 를 언제 바 꿨 을 까?정 답 은  post-read  단계... 때문에  rewrite  단계 적 운행  post-read  단계  location  설정 블록 중 통과  set  설정 명령 읽 기  $remote_addr  내 장 된 변 수 를 읽 을 때 원본 주 소 는 이미 지 났 습 니 다.  post-read  단계 변경.
 
    하면, 만약, 만약...  /test  인터페이스 가 지정 되 지 않 았 습 니 다.  X-My-IP  요청 헤더 또는 제공  X-My-IP  요청 헤더 의 값 이 합 법 적 인 IP 주소 가 아니라면 Nginx 는 원본 주 소 를 바 꾸 지 않 습 니 다. 예 를 들 어:
    $ curl localhost:8080/test
    from: 127.0.0.1
 
    $ curl -H 'X-My-IP: abc' localhost:8080/test
    from: 127.0.0.1

하면, 만약, 만약...  /test  인터페이스  X-My-IP  요청 헤더, Nginx 가 원본 주 소 를 바 꾸 는 것 을 실행 하지 않 습 니 다.이것 은 상례 가 이미 사용 되 었 기 때문이다.  set_real_ip_from  명령 은 원본 주소 의 변경 작업 을 규정 하고 있 습 니 다 127.0.0.1. 라 는 요청 이 발효 됐다.이런 여과 메커니즘 은 다른 신뢰 할 수 없 는 주소 에서 온 악의 적 인 사 기 를 피 할 수 있다.물론 통과 할 수도 있다 set_real_ip_from 명령 어 IP 네트워크 지정 (이용)  (3)  중 에 소 개 된 'CIDR 기법').이 밖 에 여러 개 set_real_ip_from 를 동시에 설정 합 니 다. 문장 도 허용 합 니 다. 이렇게 하면 여러 개의 신뢰 받 는 원본 주소 나 주소 단 을 지정 할 수 있 습 니 다.다음은 하나의 예 이다.
    set_real_ip_from 10.32.10.5;
    set_real_ip_from 127.0.0.0/24;

어떤 독자 들 은 물 어 볼 수도 있다. ngx_realip 모듈 은 도대체 어떤 실제 용도 가 있 습 니까?왜 우 리 는 요청 의 출처 주 소 를 고 쳐 써 야 합 니까?정 답 은 Nginx 가 처리 한 요청 이 한 HTTP 프 록 시 서버 의 리 트 윗 을 거 쳤 을 때 이 모듈 은 특히 유용 해 졌 다 는 것 이다.원본 사용자 가 전송 을 요청 한 후에 Nginx 가 받 은 요청 의 원본 주 소 는 예외 없 이 이 프 록 시 서버 의 IP 주소 로 바 뀌 었 기 때문에 Nginx 와 Nginx 뒤의 응용 프로그램 은 원본 요청 의 실제 출처 를 알 수 없습니다.따라서 일반적으로 우 리 는 Nginx 이전의 프 록 시 서버 에서 요청 한 원본 주 소 를 특수 한 HTTP 요청 헤더 에 인 코딩 합 니 다 (예 를 들 어 상례 의 경우).  X-My-IP  요청 헤더) 그리고 이 요청 헤더 에 인 코딩 된 주 소 를 Nginx 쪽 에서 복원 합 니 다.이렇게 하면 Nginx 의 후속 처리 단계 (Nginx 뒤의 각종 백 엔 드 응용 포함) 는 이러한 요청 이 원래 의 주소 에서 직접 왔 다 고 생각 하고 프 록 시 서버 는 존재 하지 않 는 것 과 같다.바로 이 수요 때문에  ngx_realip  모듈 은 첫 번 째 처리 단계, 즉  post-read  가능 한 한 빨리 요청 의 출처 를 고 칠 수 있 도록 단계, 등록 처리 프로그램.
 
     post-read  단계  server-rewrite  단계우리  (2)  맞다  ngx_rewrite  모듈 의 설정 명령 을 직접 작성 합 니 다.  server  블록 을 설정 할 때 기본적으로 실 행 됩 니 다.  server-rewrite  단계다음은 이러한 예 를 살 펴 보 겠 습 니 다.
    server {
        listen 8080;
 
        location /test {
            set $b "$a, world";
            echo $b;
        }
 
        set $a hello;
    }

여기  set $a hello  바로 적 혀 있어 요.  server  설정 블록 에서 실 행 됩 니 다.  server-rewrite  단계그리고 server-rewrite 보다 빠르다  rewrite  단계 실행  location  블록 에 있 는 문 구 를 설정 합 니 다.  set $b "$a, world"  바깥 것 보다 늦다  set $a hello  문장 운행.이 사례 의 테스트 결 과 는 이 점 을 증명 했다.
    $ curl localhost:8080/test
    hello, world

... 때문에  server-rewrite  에 자리잡다,...  post-read  단계 이후  server  설정 블록의  set  명령 도 항상 실행 ngx_realip 모듈 에서 요청 한 원본 주 소 를 바 꾼 후.아래 의 이 예 를 보십시오.
    server {
        listen 8080;
 
        set $addr $remote_addr;
 
        set_real_ip_from 127.0.0.1;
        real_ip_header   X-Real-IP;
 
        location /test {
            echo "from: $addr";
        }
    }

청구 하 다.  /test  인터페이스의 결 과 는 다음 과 같다.
    $ curl -H 'X-Real-IP: 1.2.3.4' localhost:8080/test
    from: 1.2.3.4

비록  set  지령 이 적 혀 있다  ngx_realip  설정 명령 전 까지 만 해도 늦 었 습 니 다.  ngx_realip  모듈 실행.그래서 $addr 변수  server-rewrite  단계 이불  set  명령 할당 시  $remote_addr  변수 가 읽 은 원본 주 소 는 이미 고 쳐 쓴 것 입 니 다.

좋은 웹페이지 즐겨찾기