nginx 모듈 개발 - nginx 내장 변수 증가

5005 단어 nginx
알다 시 피 nginx 에서 set $xxx 'hello';set 명령 을 통 해 변수 xxx 에 hello 의 문자열 값 을 설정 하고 nginx 에서 값 을 호출 하면 $xxx 만 있 으 면 이 변 수 를 사용 할 수 있 습 니 다.
  그러나 nginx 에서 우 리 는 아래 의 변 수 를 직접 사용 하여 해당 하 는 값 을 얻 을 수 있 습 니 다.
$arg_매개 변수 이름   location 에서 클 라 이언 트 가 요청 한 인자 xx? name = 123 가 져 오기 그 $argname 은 대응 하 는 값 123 $args 입 니 다. 요청 한 매개 변수 문자열 입 니 다. 예 를 들 어 name = 123 & age = 24 $contentlength, HTTP 요청 메시지 의 "Content - Length" $contenttype, 요청 정보 에 있 는 "Content - type" $host, 요청 정보 에 있 는 "Host", 요청 에 Host 줄 이 없 으 면 설 정 된 서버 이름 $request 와 같 습 니 다.method, 요청 방법, 예 를 들 어 "GET", "POST" 등 $remoteaddr, 클 라 이언 트 주소 $remoteport, 클 라 이언 트 포트 번호 $remoteuser, 클 라 이언 트 사용자 이름, 인증 용; $request_filename, 현재 요청 한 파일 경로 이름 $requesturi, 요청 한 URI, 인자 $querystring, $args 와 같은 $scheme, 사용 하 는 프로 토 콜, 예 를 들 어 http 또는 https, 예 를 들 어 rewrite ^(.+)$  $scheme://example.com$1  redirect $server_protocol, 요청 한 프로 토 콜 버 전, "HTTP / 1.0" 또는 "HTTP / 1.1" $serveraddr, 서버 주소 $servername, 요청 한 서버 이름 $serverport, 요청 한 서버 포트 번호 $uri, 요청 한 URI 는 초기 값 과 다 를 수 있 습 니 다. 예 를 들 어 재 설정 같은 $http헤더 매개 변수 이름 header 의 값 을 얻 을 수 있 습 니 다. 예 를 들 어 $httpuser_에이전트 는 header 에 있 는 UA 를 가 져 오 는 것 입 니 다. 상기 변 수 는 nginx 라 고 불 리 는 내장 변수 입 니 다. 이 변 수 는 nginx 가 시 작 될 때 불 러 옵 니 다. 그리고 서로 다른 모듈 은 서로 다른 내장 변 수 를 불 러 옵 니 다.
static ngx_http_module_t ngx_http_x_module_ctx = {
    NULL, /* preconfiguration                    。*/
    ngx_http_x_post_config,      /* postconfiguration                    。*/

    NULL, /* create main configuration             http block         。        ,         。    ,  NULL。*/
    NULL, /* init main configuration              http block         。        ,  NGX_CONF_OK。    ,  NGX_CONF_ERROR      */

    NULL, /* create server configuration             http server block         ,  server block     。        ,         。    ,  NULL。*/
    NULL, /* merge server configuration               http block,      http server block 。        ,  server             server   ,
    									        http block     server block             ,            ,         ,                    ,     。              。
    								          ,  NGX_CONF_OK。    ,  NGX_CONF_ERROR      。*/

    NULL,  	/* create location configuration             location block         。         location    。       ,         。    ,  NULL。*/
    NULL    /* merge location configuration  merge_srv_conf  ,              。        ,  NGX_CONF_OK。    ,  NGX_CONF_ERROR      。*/
};
모듈 의 ctx 를 정의 할 때 post configuration 단계 에서 내 장 된 변 수 를 불 러 오 는 함 수 를 정의 합 니 다.
static ngx_http_variable_t ngx_http_x_variables[] = {//   echo     
    { ngx_string("x_request_method"), NULL,
      ngx_http_x_request_method_variable, 0,
      NGX_HTTP_VAR_NOCACHEABLE, 0 },

    { ngx_string("x_request_uri"), NULL,
      ngx_http_x_request_uri_variable, 0,
      0, 0 },
	  ...
    { ngx_null_string, NULL, NULL, 0, 0, 0 }
}  
ngx_http_variable_t 의 정 의 는 ngxhttp_variables. h 중
typedef struct ngx_http_variable_s  ngx_http_variable_t;
struct ngx_http_variable_s {
    ngx_str_t                     name;   //     
    ngx_http_set_variable_pt      set_handler;//         
    ngx_http_get_variable_pt      get_handler;//         
    uintptr_t                     data;//        
    ngx_uint_t                    flags;//flags       ,index       (     )
    ngx_uint_t                    index;
};
flag 속성 은 아래 의 몇 가지 속성 으로 조합 되 어 있 습 니 다.
#define NGX_HTTP_VAR_CHANGEABLE   1
#define NGX_HTTP_VAR_NOCACHEABLE  2
#define NGX_HTTP_VAR_INDEXED      4
#define NGX_HTTP_VAR_NOHASH       8
NGX_HTTP_VAR_CHANGEABLE
NGX_HTTP_VAR_NOCACHEABLE 는 이 변 수 는 매번 값 을 가 져 가 야 하 며, 지난번 cache 의 값 을 직접 되 돌려 주 는 것 이 아니 라 (대응 하 는 인터페이스 에 맞 춰) 값 을 가 져 가 야 한 다 는 것 을 나타 낸다.
NGX_HTTP_VAR_INDEXED 는 이 변 수 를 색인 으로 읽 었 음 을 표시 합 니 다.
NGX_HTTP_VAR_NOHASH 는 이 변수 가 해시 되 지 않 아 도 된다 는 것 을 나 타 냅 니 다.
static ngx_int_t
ngx_http_x_post_config(ngx_conf_t *cf)
{
       ...
	     var    nginx  
	ngx_http_variable_t *var, *v;

    for (v = ngx_http_x_variables; v->name.len; v++) {
        var = ngx_http_add_variable(cf, &v->name, v->flags);
        if (var == NULL) {
            return NGX_ERROR;
        }
        var->get_handler = v->get_handler;
        var->data = v->data;
    }
    return NGX_OK;//
}
post configuration 의 리 셋 에 사용자 정의 변 수 를 nginx 에 추가 하면 설정 파일 에 $x 를 직접 사용 할 수 있 습 니 다.request_uri 획득 ngxhttp_x_request_uri_variable 함수 의 반환 값.
마지막 으로 변수 값 을 가 져 오 는 함 수 를 보 겠 습 니 다.
ngx_int_t ngx_http_x_request_uri_variable(ngx_http_request_t *r,
    ngx_http_variable_value_t *v, uintptr_t data)
{
    if (r->uri.len) {
        v->len = r->uri.len;
        v->valid = 1;
        v->no_cacheable = 1;
        v->not_found = 0;
        v->data = r->uri.data;

    } else {
        v->not_found = 1;
    }

    return NGX_OK;
}

좋은 웹페이지 즐겨찾기