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

11697 단어 nginx
우리 앞 에 서 는 이미 알 고 있다.  set  명령  location  블록 을 설정 할 때 현재 요청 한 것 입 니 다.  rewrite  단계 적 운행.사실 이 문맥 에서 ngx_rewrite 모듈 의 거의 모든 명령 이 실행 되 고 있 습 니 다.  rewrite  단계  Nginx 변수 로 밍 (2)  소개  rewrite  지령그러나 주의해 야 할 것 은 이 명령 들 이  server  블록 을 설정 할 때 우리 가 언급 하지 않 은 더 빠 른 처리 단계 에서 실 행 됩 니 다. server-rewrite 단계
 
     Nginx 변수 로 밍 (2)  소개  ngx_set_misc  모듈 러  set_unescape_uri  명령 도 실행 중 입 니 다.  rewrite 단계.특별히 모듈 의 명령 은 그런대로 괜찮다.  ngx_set_misc  라 는 명령 을 섞 어 순서대로 집행 했다.우 리 는 이러한 예 를 보 자.
    location /test {
        set $a "hello%20world";
        set_unescape_uri $b $a;
        set $c "$b!";
 
        echo $c;
    }

이 인터페이스 에 접근 하면 다음 을 얻 을 수 있 습 니 다:
    $ curl 'http://localhost:8080/test'
    hello world!

우 리 는 보 았 다. ngx_rewrite 문장의 앞 뒤  set_unescape_uri  문 구 는 모두 글 을 쓸 때의 순서에 따라 앞 뒤로 집행 되 었 다.
 
    이 점 을 더 확인 하기 위해 서 는 Nginx 의 '디 버 깅 로그' 를 다시 한 번 확인 해 보 자.  set  중간 단계):
    grep -E 'http script (value|copy|set)' t/servroot/logs/error.log

걸 러 낸 디 버 깅 로그 정 보 는 다음 과 같 습 니 다.
    [debug] 11167#0: *1 http script value: "hello%20world"
    [debug] 11167#0: *1 http script set $a
    [debug] 11167#0: *1 http script value (post filter): "hello world"
    [debug] 11167#0: *1 http script set $b
    [debug] 11167#0: *1 http script copy: "!"
    [debug] 11167#0: *1 http script set $c

시작 두 줄 정보
    [debug] 11167#0: *1 http script value: "hello%20world"
    [debug] 11167#0: *1 http script set $a

우리 의 설정 문 에 대응 합 니 다.
    set $a "hello%20world";

다음 두 줄 은
    [debug] 11167#0: *1 http script value (post filter): "hello world"
    [debug] 11167#0: *1 http script set $b

대응 설정 문
    set_unescape_uri $b $a;

우 리 는 첫 줄 의 정보 와  (1)  지령 에 약간의 차이 가 있다.  "(post filter)"  이 표 시 는 마지막 으로 URI 디 코딩 작업 이 우리 가 원 하 는 것 처럼 작 동 하 는 것 을 보 여 줍 니 다. 즉,  "hello%20world"  여기 서 성공 적 으로 디 코딩 되 었 습 니 다.  "hello world" .
 
    마지막 두 줄 디 버 깅 정보
    [debug] 11167#0: *1 http script copy: "!"
    [debug] 11167#0: *1 http script set $c

마지막  set  문장:
    set $c "$b!";

이 명령 이  $c  변수 할당 시 '변수 삽입 값' 기능 을 사 용 했 기 때문에 첫 번 째 줄 디 버 깅 정 보 는 다음 과 같 습 니 다.  http script copy  시작, 뒤쪽 은 최종 값 을 맞 추 는 문자열 상수 입 니 다.  "!" .
 
    이 디 버 깅 정 보 를 연결 해 보면 우 리 는 이러한 설정 명령 의 실제 실행 순 서 는 다음 과 같다 는 것 을 알 수 있다.
    set $a "hello%20world";
    set_unescape_uri $b $a;
    set $c "$b!";

이것 은 설정 파일 에 있 는 쓰기 순서 와 완전히 일치 합 니 다.
 
    우리  set  제3자 모듈  Nginx 변수 로 밍 (7)  ngx_lua  설정 명령 도 set_by_lua 모듈 의 명령 과 마찬가지 로  ngx_set_misc  모듈 의 명령 을 혼합 하여 사용 합 니 다.ngx_rewrite  명령 은 사용자 Lua 코드 를 통 해 결 과 를 계산 한 다음 지정 한 Nginx 변 수 를 부여 하 는 것 을 지원 합 니 다.화해시키다  set_by_lua  명령 이 비슷 하 다. set 명령 도 존재 하지 않 는 Nginx 변 수 를 자동 으로 만 드 는 기능 이 있다.
 
    다음은 하나만 볼 게 요.  set_by_lua  명령  set_by_lua  명령 어 혼합 사용 예:
    location /test {
        set $a 32;
        set $b 56;
        set_by_lua $c "return ngx.var.a + ngx.var.b";
        set $equation "$a + $b = $c";
 
        echo $equation;
    }

여기 우리 먼저  $a  화해시키다  $b  변수 가 각각 초기 화 됨  32  화해시키다  56 그리고 이용  set  명령 은 우리 가 지정 한 Lua 코드 를 연결 하여 Nginx 변 수 를 계산 합 니 다.  $a  화해시키다  $b  의 "대수 와" (sum), 그리고 변 수 를 부여 합 니 다.  $c 이어서 '변수 삽입 값' 기능 을 이용 하여 변 수 를  $a 、  $b  화해시키다  $c  값 을 문자열 형식의 등식 으로 연결 하여 변 수 를 부여 합 니 다.  $equation 마지막 에 쓰 세 요.  set_by_lua  명령 출력  $equation  의 값.
 
    이 예 에서 주의해 야 할 점 은: 우선, 우 리 는 Lua 코드 에서 통과 했다.  echo  인터페이스 에서 Nginx 변 수 를 읽 기 $VARIABLE 의그 다음으로 Nginx 변수의 값 은 문자열 이라는 형식 만 있 기 때문에 Lua 코드 에서 읽 습 니 다.  ngx.var.a  와 ngx.var.b Lua 문자열 형식의 값 을 얻 었 습 니 다.  "32"  화해시키다  "56" ;이 어 우 리 는 두 문자열 에 대해 덧셈 연산 을 하면 Lua 가 덧셈 에 대해 자동 형식 변환 을 촉발 할 것 이다 (Lua 는 두 개의 덧셈 을 먼저 수치 형식 으로 바 꾸 고 다시 합 칠 것 이다).그리고 우 리 는 Lua 코드 에서 최종 결 과 를 통과 시 켰 다.  return  문 구 는 밖의 Nginx 변 수 를 되 돌려 줍 니 다.  $c ;마지막 으로 ngx.var.VARIABLE 모듈  $c  실제 할당 전에 도 return 구문 이 되 돌려 주 는 수치 형식의 결과, 즉 Lua 덧셈 으로 계 산 된 '와' 는 자동 으로 문자열 로 변 환 됩 니 다 (이것 은 Nginx 변수의 값 이 문자열 일 수 밖 에 없 기 때 문 입 니 다).
 
    이 예 의 실제 운행 결 과 는 우리 의 기대 에 부합된다.
    $ curl 'http://localhost:8080/test'
    32 + 56 = 88

그래서 이것 이 검증 되 었 다  ngx_lua  지령 도 확실히  set_by_lua  이런  set  모듈 이 제공 하 는 명령 을 한데 섞 어 작업 하 다.
 
    그리고 적지 않 은 제3자 모듈, 예 를 들 면  ngx_rewrite  소개  Nginx 변수 로 밍 (8)  사용자 세 션 복호화 (session) 에 사용 할  ngx_array_var  ngx_encrypted_session  모듈 의 명령 이음매 없 는 혼합 작업.
 
    스 탠 더 드  ngx_rewrite  모듈 의 응용 이 이렇게 광범 위 하기 때문에 설정 명령 과 혼합 하여 사용 할 수 있 는 제3자 모듈 은 행운 입 니 다.사실 위 에서 언급 한 이 제3자 모듈 들 은 모두 특수 한 기술 을 사용 하여 그들의 배치 명령 을 '주입' 시 켰 다.  ngx_rewrite  모듈 의 명령 시퀀스 에서 (Marcus Clyne 이 작성 한 제3자 모듈 을 빌 렸 습 니 다.  ngx_rewrite )。다시 말 하면, 더 많은 일반적인 것 은 Nginx 에 있다.  rewrite  단계 등록 과 실행 명령 의 제3자 모듈 은 그다지 운 이 좋 지 않다.이 "일반 모듈" 의 명령 도 실행 되 고 있 지만 rewrite 단계  ngx_devel_kit  모듈 (그리고 같은 단계 의 다른 모듈) 은 모두 분리 되 어 독립 적 으로 집행 된다.실행 할 때 서로 다른 모듈 의 설정 명령 집합 간 의 선후 순 서 는 일반적으로 불확실 하 다 (엄 밀 히 말 하면 모듈 의 로드 순서 에 의 해 결정 되 지만 예외 적 인 경우 도 있다).예 를 들 면  A  화해시키다  B  두 모듈 다 있어 요.  rewrite  단계 실행 명령  A  모듈 의 모든 명령 을 다 실행 하고 실행 합 니 다.  B  모듈 의 명령 들 은 반대로,  B  명령 을 모두 실행 하고 실행 합 니 다.  A  라 는 지령 을 내 렸 다.모듈 문서 에 명확 한 설명 이 있 는 경 우 를 제외 하고 사용 자 는 이러한 불확실 한 순서 에 의존 하 는 설정 을 작성 해 서 는 안 됩 니 다.

좋은 웹페이지 즐겨찾기