nginx 스 크 립 트 엔진 과 디자인 (3)

이 부분 에서 우 리 는 비교적 세부 적 인 것 을 연구 할 것 이다. 게다가 앞의 (1), (2) 두 편의 글 이 전형 적 인 상황 에 대한 분석 을 더 하면 사람들 이 nginx 의 스 크 립 트 분석 체 제 를 이해 하 는 데 큰 도움 이 될 것 이 라 고 믿는다.
 
        여기 우리 관심 ngxhttp_core_main_conf_t (다음은 cmcf 라 고 약칭) 구조 중의 이 두 구성원, cmcf - > variableskeys 와 cmcf - > variables, 그 중 variableskeys 는 hash 배열 입 니 다. 변수 hash 값 은 같은 배열 에 넣 고 유일한 것 입 니 다. 반복 할 때 오 류 를 보고 합 니 다.중요 한 것 은 이 hash 배열, 즉 cmcf - > variables 입 니 다.keys 는 전체 시스템 에서 미리 정 의 된, 사용자 정의, 거의 모든 변 수 를 저장 합 니 다. (일부 특정한 접두사 변 수 는 'http' 등 을 제외 하고 함수 ngx http variables init vars 에 열 거 됩 니 다.)
 
우 리 는 항목 별로 본다.
1.  시스템 에 사용 할 수 있 는 모든 변 수 는 cmcf - > variableskeys 중.
 
2.  설정 에 나타 난 변 수 는 cmcf - > variables 에 넣 습 니 다.전체적으로 보면 특정한 접두사 가 있 는 변 수 를 제외 하고 cmcf - > variables 는 ngx 라 고 볼 수 있 습 니 다.http_variables_init_vars 의 부분 집합.이 디자인 을 통 해 알 수 있 듯 이 시스템 정의 변 수 는 처 리 를 요청 할 때 모두 사용 되 지 않 습 니 다. 우 리 는 설정 에 따라 유용 한 것 을 얻 으 면 됩 니 다. 그래서 cmcf - > variableskeys temp 사용pool (실제 요 소 는 cf - > pool) 을 사용 합 니 다. variables 가 변 수 를 수집 한 후에 variables키 구조 도 소 용 없어.
 
3.  cmcf - > variables 는 배열 입 니 다. 요소 유형 은 ngx 입 니 다.http_variable_t。
struct ngx_http_variable_s {

   //       

    ngx_str_t                    name; 

//          request       ,  set

    ngx_http_set_variable_pt   set_handler;

//   request   ( uri,args )     ,r->variables        。 

    ngx_http_get_variable_pt   get_handler;

//            ,          ,            // data   

    uintptr_t                    data;

//       ,      ,      

    ngx_uint_t                   flags;

//     cmcf->variables      

    ngx_uint_t                   index;

};

4.  init 에서request 단계 에서 우 리 는 이러한 처리 가 있 는 것 을 보 았 다.
r->variables =ngx_pcalloc(r->pool, cmcf->variables.nelts * sizeof(ngx_http_variable_value_t));
여기 서 디자인 사상 은 이 렇 습 니 다. cmcf - > variables 는 모든 변수의 처리 정보의 패키지 이 고 r - > variables 안 에는 이 변 수 를 처리 하여 얻 은 내용 (즉 value) 이기 때문에 cmcf - > variables 와 r - > variables 는 일일이 대응 합 니 다. 구성원 간 에는 var 대 value 의 관계 입 니 다. 이것 은 이곳 의 var 와 value 는 많은 정 보 를 담 은 구조 입 니 다.단순 한 값 이나 문자열 이 아 닙 니 다.여기 r - > variables 멤버 들 을 살 펴 보 겠 습 니 다.
typedef struct {

    unsigned    len:28;

    unsigned    valid:1;          //              ,    

//         ,      get_handler   ,          //        。

    unsigned    no_cacheable:1; 

//            (        ),     “not found”!

    unsigned    not_found:1;

    unsigned    escape:1; //      ,            

    u_char     *data;

} ngx_variable_value_t;

 
우 리 는 이 구조 에서 직접 변 수 를 나타 내 는 포인터 와 크기 (즉, data 와 len) 를 처리 하 는 것 을 보 았 고 나머지 는 모두 태그 비트 입 니 다.
 
다음은 매크로 몇 개 를 보 겠 습 니 다.
#define NGX_HTTP_VAR_CHANGEABLE   1
#define NGX_HTTP_VAR_NOCACHEABLE  2
#define NGX_HTTP_VAR_INDEXED       4
#define NGX_HTTP_VAR_NOHASH        8
 
1.  NGX_HTTP_VAR_CHANGEABLE
이 매크로 를 사용 할 때 이 변 수 는 반복 적 으로 설정 할 수 있 음 을 의미 합 니 다. 일반적으로 설정 한 것 은 앞의 설정 을 덮어 씁 니 다.예:
set $file $1
set $file $2
그러면 결 과 는 file 의 최종 값 이 2 달러 로 대표 된다.
2.  NGX_HTTP_VAR_NOCACHEABLE
이 매크로 가 영향 을 미 치 는 것 은 바로 ngxvariable_value_t 구조 중의 nocacheable, 앞에서 설명 한 바 와 같이 이 표 시 된 변 수 는 모두 get 을 통 해handler 는 변수의 값 을 가 져 옵 니 다.다음 함수 와 같이:
ngx_http_get_flushed_variable(ngx_http_request_t *r, ngx_uint_tindex)

{

   ngx_http_variable_value_t  *v;

   v = &r->variables[index];

//     ,      ,      NGX_HTTP_VAR_NOCACHEABLE,  //    cmcf->variables               。

   if (v->valid) {  //     ,         

       if (!v->no_cacheable) { //     ,    

            return v;

       }

       //     NGX_HTTP_VAR_NOCACHEABLE     ,  …

       v->valid = 0;

       v->not_found = 0;

   }

//     ,        ,        

   returnngx_http_get_indexed_variable(r, index);

}

 
이러한 변 수 는 특정한 요청 과 밀접 한 관 계 를 가진다. 예 를 들 어 host, uri, args 와 같은 것 은 처리 할 때 새로운 값 을 다시 가 져 올 때마다 필요 하 다.
3.  NGX_HTTP_VAR_INDEXED 와 NGXHTTP_VAR_NOHASH
이 두 매크로 는 주로 SSI 관련 처리 에 사용 되 며, ssi 의 처 리 는 cmcf - > variables 를 사용 해 야 합 니 다.hash, 이것 은 hash 표 입 니 다. 변 수 를 효율적으로 찾 을 수 있 습 니 다.NGX_HTTP_VAR_NOHASH 형식의 변 수 는 이 hash 표 에 전혀 들 어가 지 않 습 니 다. hash 표 에서 찾 은 변 수 는 ngx 입 니 다.http_variable_t 구조, 만약 우리 가 그것 의 flags 에서 NGX 를 발견 한다 면HTTP_VAR_INDEXED 표 시 는 r - > variables 에서 직접 찾 을 수 있 음 을 의미 합 니 다. 찾 은 후에 사용 할 수 있 는 지 여 부 는 따로 판단 해 야 합 니 다!

좋은 웹페이지 즐겨찾기