nginx 의 http 모듈 개발-url 인 자 를 검증 하 는 예

6060 단어 nginx
본 고 는 nginx http 모듈 의 기본 적 인 개발 절 차 를 전편http://www.cnblogs.com/yjf512/archive/2013/06/10/3130890.html에서 말 한 것 과 같이 개발 의 6 단계 에 따라 작성 하고 자 한다.
프로필 및 기능
이 모듈 의 기능 은 요청 url 의 secret 매개 변수의 값 이 약 정 된 비밀 키 인지 검증 하 는 것 입 니 다.
nginx 설정 파일 은 다음 과 같 습 니 다:
worker_processes  1;

error_log logs/error.log debug;
master_process off;
daemon off;

events {
    worker_connections  1024;
}


http {
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen       8001;
        server_name  localhost;

        access_log  /tmp/access.log; 
        error_log  /tmp/error.log debug;

        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location = /mysecert {
            #      secret    secretpassword        
            # 1         “secret right”
            # 2          “secret wrong”
            #   
            # http://abc.com:8001?secret=secretpassword  
            # http://abc.com:8001?secret=123   
            mysecret secretpassword;
        }
    }

}

 
location 이/mysecret 일 때,값 이 secretpassword 인 mysecret 인 자 를 전달 해 야 합 니 다.페이지 는 200 을 되 돌려 주 고 secret right 를 표시 합 니 다.그렇지 않 으 면 페이지 가 200 을 되 돌려 주 고 secret wrong 을 표시 합 니 다.
프로필 여기 몇 군데 주의:
디 버 깅 의 편 의 를 위해 몇 곳 을 조정 했다.
worker_processes  1; 
master_process off;
daemon off;
…
access_log  /tmp/access.log; 
error_log  /tmp/error.log debug;

그리고 configure 할 때 저도--with-debug 인 자 를 추 가 했 습 니 다.
./configure --add-module=/home/yejianfeng/nginx/nginx_module/mysecret2/ --prefix=/home/yejianfeng/nginx/nginx/ --with-debug 

이렇게 하면 디 버 깅 을 더욱 편리 하 게 한다.
구체 코드
완전한 코드 를 볼 수 있 습 니 다:https://github.com/jianfengye/MyWorks/tree/master/nginx_module_mysecret
몇 가지 설명 할 부분 이 있 습 니 다.
1 이 모듈 은 설정 파일 에서 읽 은 정보 가 있 기 때문에 자신의 모듈 에 속 하 는 설정 파일 구조 가 있 습 니 다.
typedef struct {

     ngx_str_t secret;

} ngx_http_mysecret_conf_t;

그래서 자신의 프로필 이 있 습 니 다.그러면 모듈 구조 모듈 컨 텍스트 에 createloc_설정 파일 구 조 를 초기 화 하 는 단계 가 하나 더 있 습 니 다.
//컨 텍스트 를 정의 합 니 다.location 에 만 나타 나 기 때문에 모두 null 입 니 다.
static ngx_http_module_t ngx_http_mysecret_module_ctx = {
     NULL,
     NULL,
     NULL,
     NULL,
     NULL,
     NULL,
     ngx_http_mysecret_create_loc_conf,  //여기에 자신의 설정 구 조 를 사용 합 니 다.
     NULL
};
그 중 ngxhttp_mysecret_create_loc_설정 파일 초기 화
2.설정 파일 nginx.conf 의 my secret 인 자 를 설정 파일 구조 에 어떻게 넣 습 니까?
재 ngxhttp_my secret 이 명령 반전 함수 에 ngx 가 있 습 니 다.conf_set_str_slot,이것 은 nginx 가 미리 설정 한 14 개의 프로필 을 읽 는 함수 중 하나 입 니 다.이 를 호출 하면 nginx.conf 의 secrect 비밀 키 를 프로필 구조 에서 읽 을 수 있 습 니 다.
3.handler 에서 프로필 구 조 를 어떻게 가 져 옵 니까?
이제 프로필 읽 기 가 끝 났 습 니 다.프로필 구 조 를 구 축 했 습 니 다.http 요청 을 구체 적 으로 처리 하 는 단계 까지 이 구 조 를 어떻게 가 져 옵 니까?
ngx_http_mysecret_conf_t *mycf;

mycf = ngx_http_get_module_loc_conf(r, ngx_http_mysecret_module);

이 방법 을 사용 하면 handler 에서 사용자 정의 프로필 구 조 를 얻 을 수 있 습 니 다.
설정 구 조 를 가 져 오 면 다음 문 제 는 요청 인 자 를 어떻게 가 져 오 느 냐 하 는 것 입 니 다.
ngx_http_request_t 의 args 인 자 는 요청 인 자 를 가 져 오 는 것 입 니 다.
예 를 들 면http://abc.com?a=s&b=2 그럼 args 는 ngxstring("a=s&b=2")
뒤에 nginx 사용자 정의 ngx 를 사용 할 수 있 습 니 다.strncasecmp 에서 문자 비교 등 을 했 습 니 다.
자,전체 인증 요청 인자 모듈 을 다 썼 습 니 다.
모듈 변종
nginx.conf 파일 에 불편 한 사람 이 있 을 수 있 습 니 다.인증 키 를 설정 하 는 것 은 두 단계 로 나 눌 수 있 습 니 다.
비밀 키 설정 및 검증 비밀 키
즉,프로필 이 현재 모양 으로 바 뀌 었 습 니 다.
location = /mysecert {
            #      secret    secretpassword        
            # 1         “secret right”
            # 2          “secret wrong”
            #   
            # http://abc.com:8001?secret=secretpassword  
            # http://abc.com:8001?secret=123   
            setmysecret secretpassword;
            checksecret;
 }

원래 my secret 은 두 명령 으로 setmy secret 과 checksecret 으로 바 뀌 었 습 니 다.
이 두 명령 의 기능 은 사실 다르다.setmysecret 는 설정 파일 만 읽 을 뿐 요청 에 대해 어떠한 조작 도 하지 않 는 다.checksecret 는 요청 을 직접 수정 하 는 것 이다.
사실 지난 예 를 조금 만 고치 면 이런 목적 을 달성 할 수 있다.
https://github.com/jianfengye/MyWorks/tree/master/nginx_module_mysecret2
모듈 명령 의 구 조 를 정의 하면:
static ngx_command_t ngx_http_mysecret_commands[] = {
     {
          ngx_string("setmysecret"),
          NGX_HTTP_LOC_CONF | NGX_CONF_TAKE1,
          ngx_conf_set_str_slot,
          NGX_HTTP_LOC_CONF_OFFSET,
          offsetof(ngx_http_mysecret_conf_t, secret),
          NULL,
     },
     {
          ngx_string("checksecret"),
          NGX_HTTP_LOC_CONF | NGX_CONF_NOARGS,
          ngx_http_mysecret,
          NGX_HTTP_LOC_CONF_OFFSET,
          0,
          NULL,
     },

     ngx_null_command
};

여기 setmysecret 는 nginx 가 미리 설정 한 ngx 를 직접 사용 합 니 다.conf_set_str_slot 방법 은 handler 를 정의 하 는 작업 이 필요 없습니다.사실 nginx 의 많은 모듈 은 setmy secret 와 같은 설정 파일 을 읽 는 명령(http 요청 을 하지 않 음)은 nginx 가 미리 설정 한 14 가지 방법 을 직접 사용 합 니 다.구체 적 인 사용 은 제4 장 에서 상세 하 게 설명 되 었 다.
자 연 스 럽 게 checksecret 명령 에서 인 자 를 더 이상 읽 을 필요 가 없습니다.(인자 도 없 으 니 이 명령 의 명령 형식 에 NGX 를 설정 해 야 합 니 다.CONF_NOARGS)

좋은 웹페이지 즐겨찾기