Nginx 설정 명령 의 실행 순서 (10)
13733 단어 nginx
post-rewrite
단계 다음 preaccess
단계단계 access
단계 전에 실행, 고명 preaccess
.표준 모듈 ngx_limit_req 화해시키다 ngx_limit_zone 이 단 계 를 실행 하면 전 자 는 요청 한 방문 빈 도 를 제어 할 수 있 고 후 자 는 방문 의 병행 도 를 제한 할 수 있다.여기 서 우 리 는 단지 그것들 과 만 났 을 뿐, 뒤에 이 두 모듈 을 전문 적 으로 접 할 기회 가 있 을 것 이다.
앞에서 반복 적 으로 언급 한 표준 모듈 ngx_realip 사실 이 단계 에서 도 처리 절 차 를 등록 했다.어떤 독자 들 은 '왜 일 까? 이미 있 는 게 아니 야.
post-read
"단계 등록 처리 절차 가 있 습 니까?" 우 리 는 다음 과 같은 예 를 통 해 답 을 밝 혀 도 됩 니 다. server {
listen 8080;
location /test {
set_real_ip_from 127.0.0.1;
real_ip_header X-Real-IP;
echo "from: $remote_addr";
}
}
먼저 본 예 에 비해 이 예 의 가장 중요 한 차 이 는 ngx_realip 설정 명령
location
설정 블록 중.앞에서 저희 가 소 개 했 잖 아 요. Nginx 매 칭. location
에서 발생 하 다,... find-config
단계 find-config
훨씬 늦다 post-read
단계 에서 실행 되 기 때문에 post-read
단계, 현재 요청 은 아무것도 없습니다. location
서로 관련되다.이 예 에서 ngx_realip 설정 명령 이 모두 적 혀 있 습 니 다. location
설정 블록 중 post-read
단계, ngx_realip 모듈 의 처리 프로그램 은 사용 가능 한 설정 정 보 를 보지 못 하면 원본 주소 의 변경 작업 을 수행 하지 않 습 니 다.이 어 려 운 문 제 를 해결 하기 위해 ngx_realip 모듈
preaccess
단계 에 처리 프로그램 을 등록 해 야 실행 할 수 있 습 니 다 location
블록 에 있 는 설정 명령 어 입 니 다.바로 이 때문에 위의 이 사례 의 운행 결 과 는 직관 적 인 기대 에 부합 되 었 다. $ curl -H 'X-Real-IP: 1.2.3.4' localhost:8080/test
from: 1.2.3.4
불 행 히 도, ngx_realip 모듈 의 이 해결 방안 에는 아직도 구멍 이 존재 합 니 다. 예 를 들 어 다음 과 같은 예 가 있 습 니 다.
server {
listen 8080;
location /test {
set_real_ip_from 127.0.0.1;
real_ip_header X-Real-IP;
set $addr $remote_addr;
echo "from: $addr";
}
}
여기
rewrite
단계 장 $remote_addr 사용자 변수 에 저 장 된 값 $addr
중, 그리고 출력.... 때문에 rewrite
단계 가 먼저 preaccess
단계 실행 ngx_realip 모듈 이 아직 없습니다. preaccess
원본 주 소 를 단계 적 으로 바 꿀 때 최초의 원본 주 소 는 이미 있 습 니 다. rewrite
단계 가 읽 혔 습 니 다.상례 의 실제 요구 결 과 는 우리 의 결론 을 증명 했다. $ curl -H 'X-Real-IP: 1.2.3.4' localhost:8080/test
from: 127.0.0.1
출력 한 주 소 는 확실히 고 쳐 쓰 지 않 았 다.Nginx 의 "디버그 로그" 는 이 점 을 더 확인 할 수 있 습 니 다.
$ grep -E 'http script (var|set)|realip' logs/error.log
[debug] 32488#0: *1 http script var: "127.0.0.1"
[debug] 32488#0: *1 http script set $addr
[debug] 32488#0: *1 realip: "1.2.3.4"
[debug] 32488#0: *1 realip: 0100007F FFFFFFFF 0100007F
[debug] 32488#0: *1 http script var: "127.0.0.1"
그 중 첫 번 째 줄 디 버 깅 정보
[debug] 32488#0: *1 http script var: "127.0.0.1"
예. set 구문 읽 기 $remote_addr 변수정보 문자열
"127.0.0.1"
바로 $remote_addr 그때 읽 은 값.두 번 째 줄 디 버 깅 정보
[debug] 32488#0: *1 http script set $addr
변 수 를 표시 합 니 다.
$addr
할당 작업 을 진행 하 였 습 니 다.뒤의 두 줄 정보
[debug] 32488#0: *1 realip: "1.2.3.4"
[debug] 32488#0: *1 realip: 0100007F FFFFFFFF 0100007F
예. ngx_realip 모듈
preaccess
현재 요청 한 원본 주 소 를 단계 적 으로 바 꿉 니 다.우 리 는 고 친 후의 새로운 주 소 는 확실히 기대 하 는 것 을 보 았 다 1.2.3.4
. 그러나 이 조작 이 발생 한 것 은 분명 하 다. $addr
변수 할당 후 너무 늦 었 습 니 다.마지막 줄 정보
[debug] 32488#0: *1 http script var: "127.0.0.1"
... 뿐 echo 설정 명령 이 출력 할 때 변 수 를 읽 습 니 다.
$addr
때때로 발생 하 는 것 을 우 리 는 그것 의 값 이 쓰기 전의 원본 주 소 를 바 꾸 는 것 을 보 았 다.이곳 을 보면 어떤 독자 들 은 '만약 에 ngx_realip 모듈 부재
preaccess
단계 등록 처리 프로그램, 재 rewrite
단계 등록, 그럼 상례 로 일 할 수 있 지 않 습 니까?... 때문에 ngx_rewrite 모듈 의 처리 프로그램 도 마찬가지 로 등록 되 어 있다. rewrite
단계 (2) 특히 이런 상황 에서 서로 다른 모듈 간 의 집행 순 서 는 일반적으로 불확실 하기 때문에 ngx_realip 이 가능 하 다, ~ 할 수 있다,... set 문장 뒤에 집행 하 다.가능 한 한
server
설정 블록 에 설정 ngx_realip 이런 모듈 은 위 에서 소개 한 이런 까다 로 운 예외 상황 을 피한다.운행
preaccess
단계 다음은 우리 의 또 다른 오 랜 친구, access
단계앞에서 우 리 는 이미 표준 모듈 ngx_access, 제3자 모듈 을 알 았 다. ngx_auth_request 그리고 제3자 모듈 ngx_lua 의 access_by_lua 명령 은 이 단계 에서 실행 된다.access
단계 post-access
단계이 단계 의 이름 에서 우 리 는 그것 이 바짝 따 르 고 있다 는 것 을 한눈 에 알 수 있다. access
단계 뒤에 실 행 했 습 니 다.이 단계 도... post-rewrite
단계 가 유사 합 니 다. Nginx 모듈 등록 처리 프로그램 을 지원 하지 않 고 Nginx 핵심 에서 스스로 처리 작업 을 수행 합 니 다.post-access
단계 access
단계 실현 기준 ngx_http_core 모듈 에서 제공 하 는 설정 명령 satisfy 의 기능.여러 Nginx 모듈 에 등록
access
단계 의 처리 절차, satisfy 설정 명령 은 서로 간 의 협력 방식 을 제어 하 는 데 사용 할 수 있 습 니 다.예 를 들 어 모듈 A 와 B 가 모두 있 습 니 다. access
단계 에 액세스 제어 와 관련 된 처리 프로그램 이 등록 되 어 있 으 면 두 가지 협력 방식 이 있다. 하 나 는 모듈 A 와 모듈 B 가 모두 검증 을 통과 해 야 통과 하 는 것 이 고, 다른 하 나 는 모듈 A 와 모듈 B 가 그 중 하 나 를 통과 하면 통과 하 는 것 이다.협력 all
방식 any
방식.기본적으로 Nginx 는 all
방식다음은 하나의 예 이다. location /test {
satisfy all;
deny all;
access_by_lua 'ngx.exit(ngx.OK)';
echo something important;
}
여기
/test
인터페이스 에 동시에 설정 되 어 있 습 니 다. ngx_access 모듈 과 ngx_lua 모듈 access
단 계 는 이 두 모듈 이 함께 검사 작업 을 한다.그 속 deny all
양보 하 다 ngx_access 모듈 의 처리 프로그램 은 항상 현재 요청 을 거부 합 니 다. 문장 access_by_lua 'ngx.exit(ngx.OK)'
항상 접근 을 허용 합 니 다.우리 가 통과 할 때 satisfy 명령 어 설정 all
방식 시 필요 access
단계 의 모든 모듈 은 검증 을 통 과 했 지만 불행 하 게 도 여기 는 ngx_access 모듈 은 항상 접근 을 거부 하기 때문에 모든 요청 이 거 부 됩 니 다. $ curl localhost:8080/test
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>
세심 한 독 자 는 Nginx 오류 로그 파일 에서 다음 줄 과 같은 오류 정 보 를 볼 수 있 습 니 다.
[error] 6549\#0: *1 access forbidden by rule
그러나 우리 가 상례 중의
satisfy all
구문 변경 satisfy any
, location /test {
satisfy any;
deny all;
access_by_lua 'ngx.exit(ngx.OK)';
echo something important;
}
결 과 는 완전히 다르다.
$ curl localhost:8080/test
something important
요청 이 오히려 최종 검증 을 통과 했다 는 것 이다.이것 은
any
방식 상 access
단 계 는 하나의 모듈 이 검증 을 통과 하면 요청 이 전체적으로 검증 을 통과 했다 고 생각 하고 상례 에서 ngx_lua 모듈 러 access_by_lua 문 구 는 항상 검증 을 통과 할 것 이다.설정 중 입 니 다.
satisfy any
하 다 access
단계 의 모든 모듈 의 처리 프로그램 이 접근 을 거부 할 때 모든 요청 이 거 부 됩 니 다. 예 를 들 어: location /test {
satisfy any;
deny all;
access_by_lua 'ngx.exit(ngx.HTTP_FORBIDDEN)';
echo something important;
}
이 때 방문
/test
인 터 페 이 스 를 받 을 수 있 습 니 다. 403 Forbidden
오류 페이지.여기, post-access
단계 참여 access
단계 각 모듈 처리 프로그램의 '또는 관계' 의 실현.특히 위의 이 몇 가지 예 가 필요 하 다. ngx_lua 0.5.0rc 19 이상 버 전;이전 버 전 은 안 돼 요.
satisfy any
배치 문 같이 작 동 했 어 요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
간단! Certbot을 사용하여 웹 사이트를 SSL(HTTPS)화하는 방법초보자가 인프라 주위를 정돈하는 것은 매우 어렵습니다. 이번은 사이트를 간단하게 SSL화(HTTP에서 HTTPS통신)로 변경하는 방법을 소개합니다! 이번에는 소프트웨어 시스템 Nginx CentOS7 의 환경에서 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.