Nginx 변수 로 밍 (1)

8865 단어
Nginx 의 프로필 은 마이크로 프로 그래 밍 언어 를 사용 합 니 다. 많은 실제 세계 의 Nginx 프로필 은 작은 프로그램 입 니 다.물론 '투 령 완전' 이 든 아니 든 간 에 적어도 내 가 관찰 한 바 에 의 하면 그것 은 디자인 에 있어 Perl 과 Bourne Shell 이라는 두 언어의 영향 을 많이 받는다.그런 점 에서 Apache 와 Lighttpd 등 다른 웹 서버 의 설정 기법 에 비해 Nginx 의 큰 특색 이 라 고 할 수 없다.프로 그래 밍 언어 인 만큼 '변수' 라 는 것 이 빠 질 수 없다.
    Perl, Bourne Shell, C / C + + 등 명령 식 프로 그래 밍 언어 를 잘 아 는 친 구 는 변수 가 말하자면 '값' 을 저장 하 는 용기 라 는 것 을 분명히 알 고 있 을 것 이다.이른바 '값' 은 많은 프로 그래 밍 언어 에서 3.14 과 같은 수치 일 수도 있 고 hello world 와 같은 문자열 일 수도 있 으 며, 심지 어 는 수조, 해시 표 와 같은 복잡 한 데이터 구조 일 수도 있다.그러나 Nginx 설정 에서 변 수 는 한 가지 유형의 값 만 저장 할 수 있 습 니 다. 한 가지 유형의 값 만 존재 하기 때 문 입 니 다. 그것 이 바로 문자열 입 니 다.
    예 를 들 어 우리 nginx.conf 파일 에는 다음 줄 의 설정 이 있 습 니 다.
    set $a "hello world"; 

우 리 는 표준 ngx 를 사용 했다.rewrite 모듈 의 set 설정 명령 은 변수 $a 에 대해 할당 작업 을 했 습 니 다.특히 우 리 는 문자열 hello world 을 부 여 했 습 니 다.
    우 리 는 Nginx 변수 이름 앞 에 $ 기호 가 있 는 것 을 보 았 는데 이것 은 기법 상의 요구 이다.모든 Nginx 변 수 는 Nginx 설정 파일 에서 참조 할 때 $ 접 두 사 를 가 져 와 야 합 니 다.이런 표현 방법 은 Perl, PHP 등 언어 와 비슷 하 다.
    $ 이러한 변수 접두사 수식 은 정통 JavaC# 프로그래머 를 불편 하 게 하지만 이러한 표현 방법의 장점 도 분명 하 다. 즉, 변 수 를 문자열 상수 에 직접 삽입 하여 새로운 문자열 을 만 들 수 있다 는 것 이다.
    set $a hello;
    set $b "$a, $a"; 

여기 서 우 리 는 기 존의 Nginx 변수 $a 의 값 을 통 해 변수 $b 의 값 을 구성 합 니 다. 그래서 이 두 명령 순서 가 실 행 된 후에 $a 의 값 은 hello 이 고 $b 의 값 은 hello, hello 입 니 다. 이런 기술 은 Perl 세계 에서 '변수 삽입 값' (variable interpolation) 이 라 고 불 립 니 다.그것 은 전문 적 인 문자열 연결 연산 자 를 더 이상 필요 로 하지 않 게 한다.우 리 는 이곳 에서 도 이 용 어 를 채택 해도 무방 하 다.
    우 리 는 비교적 완전한 설정 예 시 를 보 았 다.
    server {
        listen 8080;
 
        location /test {
            set $foo hello;
            echo "foo: $foo";
        }
    } 

이 예 는 nginx.conf 설정 파일 의 가장 바깥쪽 http 설정 블록 과 events 설정 블록 을 생략 합 니 다.curl 이 HTTP 클 라 이언 트 를 사용 하여 명령 행 에서 이 /test 인 터 페 이 스 를 요청 하면 얻 을 수 있 습 니 다.
    $ curl 'http://localhost:8080/test'
    foo: hello

여기 서 우 리 는 제3자 ngx 를 사용한다.echo 모듈 의 echo 설정 명령 은 $foo 변수의 값 을 현재 요청 한 응답 체 로 출력 합 니 다.
    echo 설정 명령 의 인자 도 '변수 삽입 값' 을 지원 하 는 것 을 보 았 습 니 다.그러나 모든 설정 명령 이 '변수 플러그 인' 을 지원 하 는 것 은 아니다.사실상 명령 파라미터 가 '변수 삽입 값' 을 허용 하 는 지 여 부 는 이 명령 의 실현 모듈 에 달 려 있다.
    만약 우리 가 echo 명령 을 통 해 '달러 문자' $ 가 함 유 된 문자열 을 직접 출력 하고 싶다 면 특수 한 $ 문 자 를 전의 할 방법 이 있 습 니까?답 은 부정 적 이다.그러나 다행히도 우 리 는 이 제한 을 돌아 갈 수 있다. 예 를 들 어 '변수 삽입 값' 을 지원 하지 않 는 모듈 설정 명령 을 통 해 추출 값 1.0.10 의 Nginx 변 수 를 전문 적 으로 구성 한 다음 에 echo 에서 이 변 수 를 사용 할 수 있다.아래 의 이 예 를 보 세 요.
    geo $dollar {
        default "$";
    }
 
    server {
        listen 8080;
 
        location /test {
            echo "This is a dollar sign: $dollar";
        }
    } 

테스트 결 과 는 다음 과 같다.
    $ curl 'http://localhost:8080/test'
    This is a dollar sign: $

여기에 표준 모듈 ngx 를 사 용 했 습 니 다.geo 가 제공 하 는 설정 명령 geo 는 변수 $ 에 문자열 $dollar 을 부여 합 니 다. 그러면 우 리 는 아래 에 달러 부 호 를 사용 해 야 하 는 곳 에서 우리 의 "$" 변 수 를 직접 참조 하면 됩 니 다.사실 ngxgeo 모듈 의 가장 일반적인 용법 은 클 라 이언 트 의 IP 주소 에 따라 지정 한 Nginx 변 수 를 할당 하 는 것 입 니 다. 여 기 는 '무조건' 으로 우리 의 $dollar 변수 에 '달러 문자' 라 는 값 을 부여 할 수 있 도록 빌려 쓰 는 것 입 니 다.
    '변수 삽입 값' 의 상하 문 에 또 하나의 특수 한 상황 이 있다. 즉, 인 용 된 변수 이름 뒤에 변수 이름 의 구성 문자 가 붙 어 있 을 때 (예 를 들 어 뒷 굽 자모, 숫자 와 밑줄) 우 리 는 특별한 기법 을 사용 하여 잘못된 의 미 를 없 애 야 한다. 예 를 들 어:
    server {
        listen 8080;
 
        location /test {
            set $first "hello ";
            echo "${first}world";
        }
    } 

여기 서 echo 설정 명령 의 매개 변수 값 에서 변수 $dollar 를 참조 할 때 뒤에 $first 라 는 단어 가 붙 어 있 기 때문에 직접 쓰기 world 하면 Nginx '변수 플러그 인' 컴 퓨 팅 엔진 은 이 를 인용 변수 "$firstworld" 로 식별 합 니 다. 이 어 려 운 문 제 를 해결 하기 위해 Nginx 의 문자열 기록 법 은 괄호 $firstworld 를 사용 하 는 것 을 지원 합 니 다.그 다음 에 변수 이름 을 둘 러 라. 예 를 들 어 여기 $. 위의 이 예 는 다음 과 같다.
    $ curl 'http://localhost:8080/test
    hello world 

set 명령 (그리고 앞에서 언급 한 geo 명령) 은 할당 기능 뿐만 아니 라 Nginx 변 수 를 만 드 는 부작용 도 있 습 니 다. 즉, 할당 대상 의 변수 가 존재 하지 않 을 때 이 변 수 를 자동 으로 만 듭 니 다.예 를 들 어 위의 이 예 에서 ${first} 이 변 수 를 만 들 지 않 으 면 $a 명령 은 자동 으로 set 이 사용자 변 수 를 만 듭 니 다.만약 우리 가 만 들 지 않 고 그것 의 값 을 직접 사용한다 면, 잘못 보고 할 것 이다.예컨대
    ? server {
    ?     listen 8080;
    ?
    ?     location /bad {
    ?         echo $foo;
    ?     }
    ? } 

이 때 Nginx 서버 에서 설정 불 러 오 기 를 거부 합 니 다.
    [emerg] unknown "foo" variable

예, 우 리 는 심지어 서 비 스 를 시작 할 수 없습니다!
    흥미 로 운 것 은 Nginx 변수의 생 성과 할당 작업 이 전혀 다른 시간 단계 에서 발생 한 다 는 것 이다.Nginx 변수의 생 성 은 Nginx 설정 이 불 러 올 때 만 발생 하거나 Nginx 가 시 작 될 때 만 발생 합 니 다.할당 작업 은 실제 처 리 를 요청 할 때 만 발생 합 니 다.이것 은 변 수 를 만 들 지 않 고 직접 사용 하면 시작 에 실패 할 수 있 음 을 의미 하 며, 또한 우리 가 처 리 를 요청 할 때 동적 으로 새로운 Nginx 변 수 를 만 들 수 없다 는 것 을 의미한다.
    Nginx 변수 가 생 성 되면 그 변수 이름 의 보 이 는 범 위 는 전체 Nginx 설정 이 고 서로 다른 가상 호스트 의 $a 설정 블록 을 뛰 어 넘 을 수 있 습 니 다.우 리 는 예 를 하나 보 자.
    server {
        listen 8080;
 
        location /foo {
            echo "foo = [$foo]";
        }
 
        location /bar {
            set $foo 32;
            echo "foo = [$foo]";
        }
    } 

여기 서 우 리 는 server 에서 location /bar 명령 으로 변수 set 를 만 들 었 기 때문에 전체 프로필 에서 이 변 수 를 볼 수 있 습 니 다. 따라서 우 리 는 $foo 에서 이 변 수 를 직접 인용 할 수 있 습 니 다. Nginx 가 잘못 보고 할 까 봐 걱정 하지 않 아 도 됩 니 다.
    다음은 명령 행 에서 location /foo 도구 로 이 두 인 터 페 이 스 를 방문 한 결과 입 니 다.
    $ curl 'http://localhost:8080/foo'
    foo = []
 
    $ curl 'http://localhost:8080/bar'
    foo = [32]
 
    $ curl 'http://localhost:8080/foo'
    foo = [] 

이 예 에서 볼 수 있 듯 이 curl 명령 은 set 에서 사용 되 기 때문에 할당 작업 은 방문 location /bar 요청 에서 만 실 행 됩 니 다.그리고 요청 /bar 인 터 페 이 스 를 요청 할 때 우 리 는 항상 빈 /foo 값 을 얻 습 니 다. 사용자 변수 가 할당 되 지 않 고 출력 하면 빈 문자열 을 얻 을 수 있 습 니 다.
    이 예 에서 볼 수 있 는 또 다른 중요 한 특징 은 Nginx 변수 이름 의 보 이 는 범 위 는 전체 설정 이지 만 모든 요청 에 모든 변수의 독립 사본 이 있 거나 각 변수 가 값 을 저장 하 는 용기 의 독립 사본 이 있어 서로 간섭 하지 않 는 다 는 것 이다.예 를 들 어 앞에서 우리 가 $foo 인 터 페 이 스 를 요청 한 후에 /bar 변 수 는 값 $foo 을 부 여 받 았 지만 후속 32 인터페이스 에 대한 요청 에 대응 하 는 /foo 값 (이것 은 여전히 비어 있 습 니 다!) 에 영향 을 주지 않 습 니 다. 각 요청 은 자신 만 의 $foo 변수의 사본 이 있 기 때 문 입 니 다.
    Nginx 초보 자 에 게 가장 흔히 볼 수 있 는 오류 중 하 나 는 Nginx 변 수 를 요청 간 에 전역 적 으로 공유 하 는 것 으로 이해 하거나 '전역 변수' 라 고 말 하 는 것 이다.사실상 Nginx 변수의 생명 기 는 요청 경 계 를 뛰 어 넘 을 수 없습니다.
    (미 완성 계속)
다음으로 이동:http://blog.sina.com.cn/s/blog_6d579ff40100wi7p.html

좋은 웹페이지 즐겨찾기