nginx 변수 사용 방법 상세 설명 (1)

5860 단어 nginxnginx 변수
Nginx 의 프로필 은 마이크로 프로 그래 밍 언어 를 사용 합 니 다. 많은 실제 세계 의 Nginx 프로필 은 작은 프로그램 입 니 다.물론 '투 령 완전' 이 든 아니 든 간 에 적어도 내 가 관찰 한 바 에 의 하면 그것 은 디자인 에 있어 Perl 과 Bourne Shell 이라는 두 언어의 영향 을 많이 받는다.그런 점 에서 Apache 와 Lighttpd 등 다른 웹 서버 의 설정 기법 에 비해 Nginx 의 큰 특색 이 라 고 할 수 없다.프로 그래 밍 언어 인 만큼 '변수' 라 는 것 이 빠 질 수 없다.Perl, Bourne Shell, C / C + + 등 명령 식 프로 그래 밍 언어 를 잘 아 는 친 구 는 변수 가 말하자면 '값' 을 저장 하 는 용기 라 는 것 을 분명히 알 고 있 을 것 이다.이른바 '값' 은 많은 프로 그래 밍 언어 에서 3.14 와 같은 수치 일 수도 있 고 Hello World 와 같은 문자열 일 수도 있 으 며 심지어 배열, 해시 표 와 같은 복잡 한 데이터 구조 일 수도 있다.그러나 Nginx 설정 에서 변 수 는 한 가지 유형의 값 만 저장 할 수 있 습 니 다. 한 가지 유형의 값 만 존재 하기 때 문 입 니 다. 그것 이 바로 문자열 입 니 다.예 를 들 어 우리 ngix. conf 파일 에 다음 줄 설정 이 있 습 니 다.
set $a "hello world";
우 리 는 표준 ngx 를 사용 했다.rewrite 모듈 의 set 설정 명령 은 변수 $a 에 대해 할당 작업 을 했 습 니 다.특히 우 리 는 문자열 hello World 를 부 여 했 습 니 다.우 리 는 Nginx 변수 이름 앞 에 $기호 가 있 는 것 을 보 았 습 니 다. 이것 은 표기 법의 요구 입 니 다.모든 Nginx 변 수 는 Nginx 설정 파일 에서 참조 할 때 $접 두 사 를 가 져 와 야 합 니 다.이런 표현 방법 은 Perl, PHP 등 언어 와 비슷 하 다.$이러한 변수 접두사 수식 은 정통 자바 와 C \ # 프로그래머 를 불편 하 게 하지만 이러한 표현 방법의 장점 도 분명 합 니 다. 즉, 변 수 를 문자열 상수 에 직접 삽입 하여 새로운 문자열 을 만 들 수 있 습 니 다.
set $a hello;
set $b "$a, $a";
여기 서 우 리 는 기 존의 Nginx 변수 $a 의 값 을 통 해 변수 $b 의 값 을 구성 합 니 다. 그래서 이 두 명령 순서 가 실 행 된 후에 $a 의 값 은 hello 이 고 $b 의 값 은 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 명령 을 통 해 '달러 문자' ($) 가 함 유 된 문자열 을 직접 출력 하고 싶다 면, 특별한 $문 자 를 전의 할 방법 이 있 습 니까?정 답 은 부정 적 이다.그러나 다행히도 우 리 는 이 제한 을 돌 릴 수 있 습 니 다. 예 를 들 어 '변수 플러그 인' 을 지원 하지 않 는 모듈 설정 명령 을 통 해 $의 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 에 문자열 '$' 를 부여 합 니 다. 그러면 우 리 는 아래 에 달러 부 호 를 사용 해 야 하 는 곳 에서 $dollar 변 수 를 직접 참조 하면 됩 니 다.사실 ngxgeo 모듈 의 가장 일반적인 용법 은 클 라 이언 트 의 IP 주소 에 따라 지정 한 Nginx 변 수 를 할당 하 는 것 입 니 다. 여 기 는 '무조건' 으로 우리 의 $dollar 변수 에 '달러 문자' 라 는 값 을 부여 할 수 있 도록 빌려 쓰 는 것 입 니 다.'변수 삽입 값' 의 상하 문 에 또 하나의 특수 한 상황 이 있다. 즉, 인 용 된 변수 이름 뒤에 변수 이름 의 구성 문자 가 붙 어 있 을 때 (예 를 들 어 뒷 굽 자모, 숫자 와 밑줄) 우 리 는 특별한 기법 을 사용 하여 잘못된 의 미 를 없 애 야 한다. 예 를 들 어:
server {
listen 8080;
location /test {
set $first "hello ";
echo "${first}world";
}
}
여기 서 echo 설정 명령 의 매개 변수 값 에서 변 수 를 참조 할 때 $first 뒤에 World 라 는 단 어 를 따 르 기 때문에 '$firstworld' 를 직접 쓰 면 Nginx '변수 삽입 값' 컴 퓨 팅 엔진 은 변 수 를 참조 한 $firstworld 로 인식 하여 이 문 제 를 해결 합 니 다.Nginx 의 문자열 표기 법 은 $다음 에 변수 이름 을 둘러싸 는 것 을 지원 합 니 다. 예 를 들 어 ${first}. 위의 출력 은:
$ curl 'http://localhost:8080/test
hello world
set 명령 (그리고 앞에서 언급 한 geo 명령) 은 할당 기능 뿐만 아니 라 Nginx 변 수 를 만 드 는 부작용 도 있 습 니 다. 즉, 할당 대상 의 변수 가 존재 하지 않 을 때 이 변 수 를 자동 으로 만 듭 니 다.예 를 들 어 위의 이 예 에서 $a 라 는 변수 가 생 성 되 지 않 으 면 set 명령 은 $a 라 는 사용자 변 수 를 자동 으로 생 성 합 니 다.만약 우리 가 만 들 지 않 고 그것 의 값 을 직접 사용한다 면, 잘못 보고 할 것 이다.예컨대
server {
listen 8080;
location /bad {
echo $foo;
}
}
이 때 Nginx 서버 에서 설정 불 러 오 기 를 거부 합 니 다.
[emerg] unknown "foo" variable
네, 저 희 는 서 비 스 를 시작 할 수 없습니다!흥미 로 운 것 은 Nginx 변수의 생 성과 할당 작업 이 전혀 다른 시간 단계 에서 발생 한 다 는 것 이다.Nginx 변수의 생 성 은 Nginx 설정 이 불 러 올 때 만 발생 하거나 Nginx 가 시 작 될 때 만 발생 합 니 다.할당 작업 은 실제 처 리 를 요청 할 때 만 발생 합 니 다.이것 은 변 수 를 만 들 지 않 고 직접 사용 하면 시작 에 실패 할 수 있 음 을 의미 하 며, 또한 우리 가 처 리 를 요청 할 때 동적 으로 새로운 Nginx 변 수 를 만 들 수 없다 는 것 을 의미한다.Nginx 변수 가 생 성 되면 그 변수 이름 의 보 이 는 범 위 는 전체 Nginx 설정 이 고 서로 다른 가상 호스트 의 server 설정 블록 을 뛰 어 넘 을 수 있 습 니 다.우 리 는 예 를 하나 보 자.
server {
listen 8080;
location /foo {
echo "foo = [$foo]";
}
location /bar {
set $foo 32;
echo "foo = [$foo]";
}
}
여기 서 우 리 는 location / bar 에서 set 명령 으로 변 수 를 만 들 었 습 니 다. 그래서 전체 프로필 에서 이 변 수 를 볼 수 있 습 니 다. 따라서 우 리 는 location / foo 에서 이 변 수 를 직접 참조 할 수 있 습 니 다. Nginx 가 잘못 보고 할 까 봐 걱정 하지 않 아 도 됩 니 다.다음은 명령 행 에서 두 인터페이스 에 curl 도구 로 접근 한 결과 입 니 다.
$ curl 'http://localhost:8080/foo'
foo = []

$ curl 'http://localhost:8080/bar'
foo = [32]

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

좋은 웹페이지 즐겨찾기