nginx + lua 학습 - 정적 파일 다운로드 프로 세 스 타 점 기록

4677 단어
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 에서 가 져 옵 니 다.

  • nginx 설정:
  •     location ~* .(apk)$ {
            root  /tmp/loadapp;
            add_header Content-Disposition attachment;
            access_by_lua_file /system/nginx/lua/access_apk.lua;
            log_by_lua_file /system/nginx/lua/log_apk.lua;
        }
    
  • 직면 한 큰 문제: 단점 속전 의 타 점 을 어떻게 해결 합 니까?
  • 단점 속전 의 대체적인 원리:
  • 클 라 이언 트 가 서버 에 여러 http 요청 을 동시에 보 냅 니 다. http 요청 header 에는 range 인자 가 있 습 니 다. range 에는 필요 한 파일 조각
  • 이 포함 되 어 있 습 니 다.
  • 서비스 측 이 range 정보 에 따라 응답 한 영 화 를 클 라 이언 트 에 게 되 돌려 줍 니 다.
  • 클 라 이언 트 는 최종 적 으로 모든 파일 을 하나의 파일 로 통합 시 켰 다.

  • 정지점 전송 은 다 중 응답 을 요청 하고 다운로드 가 완료 되 었 는 지 클 라 이언 트 가 확인 한 것 이기 때문에 정지점 전송 에서 공유 기 는 다운로드 가 완료 되 었 는 지 정확하게 알 수 없다.따라서 단일 파일 다운로드 과정 에 대한 타 점 이 필요 하 다 면 정지점 전송 을 금지 해 야 한다.


  • 3. 단일 파일 에 대해 정지점 전송 을 금지 하 는 방법
  • nginx 의 서버 정지점 전송 기능 지원 이 ngx 라 는 것 을 알 게 되 었 습 니 다.http_range_filter_module 의
  • static ngx_int_t
    ngx_http_range_header_filter(ngx_http_request_t *r)
    {
        time_t                        if_range;
        ngx_int_t                     rc;
        ngx_http_range_filter_ctx_t  *ctx;
    
        if (r->http_version < NGX_HTTP_VERSION_10
            || r->headers_out.status != NGX_HTTP_OK
            || r != r->main
            || r->headers_out.content_length_n == -1
            || !r->allow_ranges)
        {
            return ngx_http_next_header_filter(r);
        }
    }
    
  • 따라서 우 리 는 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
    

    좋은 웹페이지 즐겨찾기