Nginx 변수 로 밍 (1)
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 등 언어 와 비슷 하 다.$
이러한 변수 접두사 수식 은 정통 Java
과 C#
프로그래머 를 불편 하 게 하지만 이러한 표현 방법의 장점 도 분명 하 다. 즉, 변 수 를 문자열 상수 에 직접 삽입 하여 새로운 문자열 을 만 들 수 있다 는 것 이다. 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.