Nginx 변수 로 밍 (3)

8349 단어
일부 내장 변 수 는 변경 을 지원 합 니 다. 그 중 하 나 는 $args 입 니 다. 이 변 수 는 읽 을 때 현재 요청 한 URL 매개 변수 문자열 (즉, 요청 URL 의 물음표 뒤의 부분, 있 으 면) 을 되 돌려 주 고 값 을 부여 할 때 매개 변수 문자열 을 직접 수정 할 수 있 습 니 다.우 리 는 예 를 하나 보 자.
    location /test {
        set $orig_args $args;
        set $args "a=3&b=4";
 
        echo "original args: $orig_args";
        echo "args: $args";
    } 

여기에 원본 URL 매개 변수 문자열 을 $orig_args 변수 에 저장 한 다음 $args 변 수 를 바 꾸 어 현재 URL 매개 변수 문자열 을 수정 합 니 다. 마지막 으로 echo 명령 으로 각각 출력 $orig_args 과 $args 변수의 값 을 출력 합 니 다.다음은 이 /test 인 터 페 이 스 를 이렇게 테스트 합 니 다.
    $ curl 'http://localhost:8080/test'
    original args: 
    args: a=3&b=4
 
    $ curl 'http://localhost:8080/test?a=0&b=1&c=2'
    original args: a=0&b=1&c=2
    args: a=3&b=4 

첫 번 째 테스트 에서 우 리 는 URL 매개 변수 문자열 을 설정 하지 않 았 기 때문에 출력 $orig_args 변수의 값 이 비어 있 습 니 다.그리고 첫 번 째 와 두 번 째 테스트 에서 우리 가 URL 매개 변수 문자열 을 제공 하 든 안 하 든 매개 변수 문자열 은 location /test 에서 강제로 바 뀝 니 다 a=3&b=4.
    특별히 지적 해 야 할 것 은, 이곳 의 $args 변수 와 $arg 입 니 다.XXX 와 마찬가지 로 자신의 저장 값 에 속 하 는 용 기 를 사용 하지 않 습 니 다.$args 를 읽 을 때 Nginx 는 Nginx 핵심 에 현재 URL 매개 변수 문자열 을 저장 하 는 위치 에서 데 이 터 를 읽 는 작은 코드 를 실행 합 니 다.그리고 우리 가 $args 를 고 칠 때 Nginx 는 다른 작은 코드 를 실행 하여 같은 위 치 를 고 칩 니 다.Nginx 의 다른 부분 은 현재 URL 매개 변수 문자열 이 필요 할 때 그 위치 에서 데 이 터 를 읽 기 때문에 $args 에 대한 수정 은 모든 부분의 기능 에 영향 을 줄 수 있 습 니 다.우 리 는 예 를 하나 보 자.
    location /test {
        set $orig_a $arg_a;
        set $args "a=5";
        echo "original a: $orig_a";
        echo "a: $arg_a";
    } 

여기 서 우 리 는 먼저 내장 변수 $arg_a 의 값, 즉 원 초적 으로 요청 한 URL 매개 변수 a 의 값 을 사용자 변수 $orig_a 에 저장 한 다음 에 내장 변수 $args 를 할당 하여 현재 요청 한 매개 변수 문자열 을 a=5 로 바 꾸 고 마지막 으로 echo 명령 으로 각각 출력 $orig_a$arg_a 변수의 값 을 출력 합 니 다.내장 변수 $args 에 대한 수정 은 현재 요청 한 URL 매개 변수 문자열 에 직접적인 변 화 를 가 져 올 수 있 기 때문에 내장 변수 $argXXX 도 자연히 변화 한다.테스트 결과 이 점 이 입증 되 었 다.
    $ curl 'http://localhost:8080/test?a=3'
    original a: 3
    a: 5 

원본 요청 한 URL 매개 변수 문자열 이 a=3 이기 때문에 $arg_a 최초의 값 은 3 이 었 으 나, 이후 $args 변 수 를 바 꾸 어 URL 매개 변수 문자열 을 a=5 로 강제로 수정 하 였 기 때문에 최종 $arg_a 의 값 은 자동 으로 5 로 바 뀌 었 습 니 다.
    변수 영향 기준 을 수정 $args 한 HTTP 프 록 시 모듈 ngxproxy 의 예:
    server {
        listen 8080;
 
        location /test {
            set $args "foo=1&bar=2";
            proxy_pass http://127.0.0.1:8081/args;
        }
    }
 
    server {
        listen 8081;
 
        location /args {
            echo "args: $args";
        }
    } 

여기에서 우 리 는 http 설정 블록 에서 두 개의 가상 호스트 를 정의 했다.첫 번 째 가상 호스트 감청 8080 포트, 그 /test 인 터 페 이 스 는 스스로 $args 변 수 를 바 꾸 어 현재 요청 한 URL 매개 변수 문자열 을 무조건 foo=1&bar=2 로 수정 한 다음 /test 인 터 페 이 스 를 통 해 ngxproxy 모듈 의 proxypass 명령 은 이 컴퓨터 의 8081 포트 에 있 는 HTTP 서비스 /args 를 가리 키 는 역방향 에이 전 트 를 설정 합 니 다. 기본 값 으로 ngxproxy 모듈 은 HTTP 요청 을 원 격 HTTP 서비스 로 전송 할 때 현재 요청 한 URL 매개 변수 문자열 도 자동 으로 원 격 으로 전송 합 니 다.
    이 컴퓨터 의 8081 포트 에 있 는 HTTP 서 비 스 는 바로 우리 가 정의 한 두 번 째 가상 호스트 가 제공 하 는 것 입 니 다.저 희 는 두 번 째 가상 호스트 location /args 에서 echo 명령 을 이용 하여 현재 요청 한 URL 매개 변수 문자열 을 출력 하여 /test 인터페이스 가 ngx 를 통과 하 는 지 확인 합 니 다.proxy 모듈 에서 실제 전 송 된 URL 요청 매개 변수 문자열 입 니 다.
    첫 번 째 가상 호스트 의 /test 인 터 페 이 스 를 실제로 방문 합 니 다.
    $ curl 'http://localhost:8080/test?blah=7'
    args: foo=1&bar=2 

URL 매개 변수 문자열 blah=7 을 요청 하 였 으 나 location /test 에서 매개 변수 문자열 이 강제로 foo=1&bar=2 로 바 뀌 었 습 니 다. 이 어 proxypass 명령 은 우리 가 고 쳐 쓴 매개 변수 문자열 을 두 번 째 가상 호스트 에 설 정 된 /args 인터페이스 에 전송 한 다음 /args 인터페이스의 URL 매개 변 수 를 출력 합 니 다.사실은 우리 가 $args 변수 에 대한 할당 작업 도 ngx 에 성공 적 으로 영향 을 미 쳤 음 을 증명 합 니 다.proxy 모듈 의 행동.
    변 수 를 읽 을 때 실행 되 는 이 특수 코드 는 Nginx 에서 '취 처리 프로그램' (get handler) 이 라 고 합 니 다.변 수 를 바 꿀 때 실행 되 는 이 특수 코드 는 '저장 처리 프로그램' (set handler) 이 라 고 합 니 다.서로 다른 Nginx 모듈 은 일반적으로 그들의 변 수 를 위해 서로 다른 '액세스 처리 프로그램' 을 준비 하여 이러한 변수의 행동 을 마법 으로 가득 채 웁 니 다.
    사실 이런 기 교 는 계산 세계 에서 결코 드 물 지 않다.예 를 들 어 대상 을 대상 으로 프로 그래 밍 할 때 클래스 의 디자이너 는 클래스 의 구성원 변 수 를 클래스 의 사용자 에 게 직접 노출 시 키 지 않 고 두 가지 방법 (method) 을 따로 제공 합 니 다. 각각 이 구성원 변수의 읽 기와 쓰기 작업 에 사용 합 니 다. 이 두 가지 방법 은 흔히 '액세스 기' (accessor) 라 고 부 릅 니 다.다음은 C + + 언어의 예 입 니 다.
    #include <string>
    using namespace std;
 
    class Person {
    public:
        const string get_name() {
            return m_name;
        }
 
        void set_name(const string name) {
            m_name = name;
        }
 
    private:
        string m_name;
    }; 

이 이름 Person 의 C + + 클래스 에서 우 리 는 개인 구성원 변수 get_name 의 '액세스 기' 로 서 set_namem_name 두 가지 공공 방법 을 제공 했다.
    이런 디자인 의 장점 은 명백히 알 수 있다.클래스 의 디자이너 는 '액세스 기' 에서 임의의 코드 를 실행 하여 필요 한 업무 논리 와 '부작용' 을 실현 할 수 있다. 예 를 들 어 현재 구성원 변수 와 의존 관계 가 있 는 다른 구성원 변 수 를 자동 으로 업데이트 하거나 현재 대상 과 관련 된 데이터 라 이브 러 리 표 의 대응 필드 를 직접 수정 할 수 있다.그리고 다음 상황 에 대해 '액세스 기' 에 대응 하 는 구성원 변 수 는 존재 하지 않 거나 존재 하 더 라 도 데이터 캐 시 역할 을 하여 프 록 시 데이터 베이스 에 대한 접근 압력 을 완화 시 킬 수 있 습 니 다.
    대상 지향 프로 그래 밍 의 '액세스 기' 개념 과 대응 되 며, Nginx 변수 도 바 인 딩 '액세스 처리 프로그램' 을 지원 합 니 다.Nginx 모듈 은 변 수 를 만 들 때 변수 에 저장 값 을 할당 할 용기 와 읽 기와 쓰기 동작 에 대응 하 는 '액세스 처리 프로그램' 을 스스로 제공 할 지 여 부 를 선택 할 수 있 습 니 다.
    모든 Nginx 변수 가 저 장 된 용 기 를 가지 고 있 는 것 은 아 닙 니 다.값 용 기 를 가 진 변 수 는 Nginx 핵심 에서 '인 덱 싱 된' (indexed) 이 라 고 합 니 다.반대로 '색인 되 지 않 은' (non - indexed) 이 라 고 불 린 다.
    우리 앞 에 서 는 (2) 에서 이미 알 고 있 습 니 다. $arg 같 습 니 다.XXX 는 이렇게 무수 한 변종 을 가 진 변수 군 으로 '색인 되 지 않 은' 것 이다.이러한 변 수 를 읽 을 때 '취 처리 프로그램' 이 작용 합 니 다. 즉, 현재 요청 한 URL 매개 변수 문자열 을 실시 간 으로 검색 하여 변수 이름 이 지정 한 URL 매개 변수의 값 을 추출 합 니 다.많은 초보 자 들 이 $argXXX 의 실현 방식 에 오해 가 생 겼 습 니 다. Nginx 가 현재 요청 한 모든 URL 인 자 를 미리 분석 하고 관련 $argXXX 변수의 값 을 미리 설정 합 니 다.그러나 사실은 그렇지 않 습 니 다. Nginx 는 URL 매개 변수 문자열 을 미리 해석 하지 않 고 사용자 가 $arg 을 읽 습 니 다.XXX 변 수 를 사용 할 때 '취 처리 프로그램' 을 호출 하여 URL 매개 변수 문자열 을 즉시 검색 합 니 다.유사 하 게, 내장 변수 $cookieXXX 도 '취 처리 프로그램' 을 통 해 요청 헤더 에 있 는 정 의 를 즉시 검색 합 니 다.
    (미 완성 계속)
 
다음으로 이동:http://blog.sina.com.cn/s/blog_6d579ff40100wm63.html

좋은 웹페이지 즐겨찾기