nginx lua 지원 1. nginx 실행 절차 nginx 는 모든 사용자 의 요청 을 처리 할 때 여러 단계 에 따라 순서대로 처리 합 니 다.
post - read 가 요청 내용 을 읽 는 단계 에서 nginx 가 요청 헤드 를 읽 고 분석 한 후에 바로 실행 합 니 다.
server - rewrite server 요청 주소 재 작성 단계;
find - config 설정 검색 단 계 는 현재 요청 과 location 블록 간 의 짝 짓 기 작업 을 완성 합 니 다.
rewrite location 요청 주소 재 작성 단계, ngxrewrite 명령 은 location 에서 이 단계 에서 실 행 됩 니 다.
post - rewrite 요청 주소 재 작성 제출 단계 입 니 다. nginx 가 rewrite 단계 에서 요구 하 는 내부 점프 동작 을 완성 하면 rewrite 단계 에서 이러한 요구 가 있 으 면;
preaccess 접근 권한 검사 준비 단계, ngxlimit_req 와 ngxlimit_zone 이 단계 에서 실행, ngxlimit_req 요청 한 접근 주파 수 를 제어 할 수 있 습 니 다. ngxlimit_zone 은 접근 의 병행 도 를 제어 할 수 있 습 니 다.
access 권한 검사 단계, ngxaccess 는 이 단계 에서 실 행 됩 니 다. 설정 명령 은 주로 접근 제어 와 관련 된 작업 을 수행 합 니 다. 예 를 들 어 사용자 의 접근 권한 을 검사 하고 사용자 의 소스 IP 가 합 법 적 인지 확인 합 니 다.
post - access 접근 권한 검사 제출 단계;
try - files 설정 항목 try파일 처리 단계;
content 내용 의 생 성 단 계 는 모든 요청 처리 단계 에서 가장 중요 한 단계 입 니 다. 이 단계 의 명령 은 보통 HTTP 응답 내용 을 생 성 하 는 데 사용 되 기 때 문 입 니 다.
log 로그 모듈 처리 단계;
nginx_lua 상용 모듈 openwrt 에서 우 리 는 일반적으로 nginx 를 이용한다.lua 의 다음 몇 가지 기능
set_by_lua: 주로 매개 변수 설정 을 할 때 사용 합 니 다
header_filter_by_lua: 머리 요청 정보의 예비 처리
access_by_lua_file: 위의 7 단계 에 대응 하여 저 희 는 여기 서 업무 요청 정 보 를 처리 할 수 있 습 니 다
.
content_by_lua_file: 위의 10 단계
에 대응
log_by_lua_file: 위의 11 단계 에 대응 하여 contentby_lua_file 이후 실행.
업무 수요: 로 컬 파일 다운로드 타 점 (시작 - 끝)
수요 분석:
공유 기 에 정적 파일 을 설치 하여 클 라 이언 트 가 이 파일 을 다운로드 하 는 시작 과 다운로드 가 끝 나 는 과정 을 기록 합 니 다.
정적 파일 공유 기 단 은 location 에 등록 되 어 있 습 니 다.
정적 파일 의 다운로드, http 응답 내 에 파일 이 있 기 때문에 contentby_lua_파일 은 필요 없어.
요청 한 기록 을 다운로드 하면 contentby_lua_file 에서 가 져 옵 니 다.
최종 데 이 터 를 되 돌려 주 는 기록 을 다운로드 하면 logby_lua_file 에서 가 져 옵 니 다.
클 라 이언 트 가 서버 에 여러 http 요청 을 동시에 보 냅 니 다. http 요청 header 에는 range 인자 가 있 습 니 다. range 에는 필요 한 파일 조각
이 포함 되 어 있 습 니 다.
서비스 측 이 range 정보 에 따라 응답 한 영 화 를 클 라 이언 트 에 게 되 돌려 줍 니 다.
클 라 이언 트 는 최종 적 으로 모든 파일 을 하나의 파일 로 통합 시 켰 다.
정지점 전송 은 다 중 응답 을 요청 하고 다운로드 가 완료 되 었 는 지 클 라 이언 트 가 확인 한 것 이기 때문에 정지점 전송 에서 공유 기 는 다운로드 가 완료 되 었 는 지 정확하게 알 수 없다.따라서 단일 파일 다운로드 과정 에 대한 타 점 이 필요 하 다 면 정지점 전송 을 금지 해 야 한다.
3. 단일 파일 에 대해 정지점 전송 을 금지 하 는 방법
nginx 의 서버 정지점 전송 기능 지원 이 ngx 라 는 것 을 알 게 되 었 습 니 다.http_range_filter_module 의
따라서 우 리 는 nginx 가 http 요청 을 받 았 을 때 r - > allowranges = 0 이면 됩 니 다
그래서 우 리 는 nginxlua 모듈 의 ngxhttp_lua_req_method. c 에서 set 봉인ranges 와 getranges 두 모듈
static int
ngx_http_lua_ngx_req_set_ranges(lua_State * L)
{
ngx_http_request_t *r;
int range = luaL_checkinteger(L, 1);
r = ngx_http_lua_get_req(L);
if (r == NULL) {
return luaL_error(L, "no request object found");
}
r->allow_ranges = range;
return 1;
}
static int
ngx_http_lua_ngx_req_get_ranges(lua_State *L)
{
ngx_http_request_t *r;
r = ngx_http_lua_get_req(L);
if (r == NULL) {
return luaL_error(L, "request object not found");
}
lua_pushinteger(L, r->allow_ranges);
return 1;
}
http 요청 을 받 았 을 때 set 실행ranges(0)
ngx.req.set_ranges(0)
저 희 는 nginx 에서 요청 한 range 에 대한 차단 을 실 현 했 지만 클 라 이언 트 가 여러 개의 요청 을 하 는 것 을 제어 할 수 없 기 때문에 nginx 는 여러 http 요청 을 받 았 습 니 다.그러나 nginx 에 게 이렇게 많은 요청 중 하 나 는 구체 적 인 파일 데 이 터 를 되 돌려 주 었 습 니 다.따라서 우 리 는 이 특별한 요청 / 응답 만 찾 으 면 된다.tcpdump 에 대한 분석 을 통 해 우 리 는 이 요청 의 특징 이 다음 과 같다 는 것 을 발견 했다
.
local h1 = ngx.req.get_headers();
local range = h1["Range"];
local accept_encoding = h1["Accept_Encoding"];
if range == nil and accept_encoding == "identity" then
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다: