nginx 모듈 개발 입문 실례
실례 가 천 마디 보다 낫 기 때문에 나 는 이 코드 를 준비 하여 입문 에 참고 하도록 제공 하 였 다.
1. 모듈 코드 준비
2. 프로필 작성
3.. / configure 컴 파일 nginx 프로그램 실행
4. make & make install
5. 테스트 실행
가: 머리말
Nginx 의 모듈 동적 추가, 모든 모듈 은 Nginx 의 바 이 너 리 실행 파일 에 미리 컴 파일 해 야 합 니 다.
그래서... / configure, make, make install
Nginx 모듈 에는 3 가지 캐릭터 가 있 습 니 다.
1. Handlers (처리 모듈) --- --- Http 요청 처리 및 출력 내용
2. Filters (필터 모듈) --- --- Handlers 출력 을 걸 러 내 는 데 사용 되 는 내용
3. Load - balancers (부하 균형 모듈) or upstream 모듈 - 한 대의 백 엔 드 서버 가 선택 할 때 백 엔 드 서버 를 선택 하고 Http 요청 을 서버 에 전송 합 니 다.
Nginx 모듈 의 처리 절차:
클 라 이언 트 가 Nginx 서버 에 Http 요청 이 발생 했 습 니 다. - > Nginx 설정 파일 기반 처리 모듈 선택
- > 부하 균형 모듈 백 엔 드 서버 선택 - > 처리 모듈 을 선택 하고 출력 버퍼 를 첫 번 째 필터 모듈 에 올 립 니 다.
- > N 개의 필터 모듈 을 거 친 후 - > 처리 결 과 를 클 라 이언 트 에 보 냅 니 다.
한 장의 그림 이 가장 좋 지만, 텍스트 도 문 제 를 설명 할 수 있다.
나: 준비 모듈 코드
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>
#include <pthread.h>
#include <string.h>
#include <errno.h>
}
#include "ngx_http_m3u9_module.h"
u_char not_find_404[] = "<html>\
<head>\
<meta http-equiv=\"content-type\" content=\"text/html; charset=windows-1252\">\
<title>404 Not Found</title>\
</head>\
<body bgcolor=\"white\">\
<center><h1>404 Not Found</h1></center>\
<hr><center>nginx/1.4.0</center>\
\
\
</body>\
</html>";
static ngx_command_t ngx_http_m3u9_commands[] =
{
{
ngx_string("m3u9"),
NGX_HTTP_LOC_CONF | NGX_CONF_NOARGS,
ngx_http_set_handler,
0,
0,
NULL
},
ngx_null_command
};
static ngx_http_module_t ngx_http_m3u9_module_ctx =
{
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL
};
ngx_module_t ngx_http_m3u9_module =
{
NGX_MODULE_V1,
&ngx_http_m3u9_module_ctx,
ngx_http_m3u9_commands,
NGX_HTTP_MODULE,
NULL,
NULL,
&user_init_m3u9,
NULL,
NULL,
&user_uninit_m3u9,
NULL,
NGX_MODULE_V1_PADDING
};
////////////////////////////////////////////////////////////////////////////////
ngx_int_t user_init_m3u9(ngx_cycle_t* cycle)
{
// pthread_mutex_init(&read_lock, NULL);
return (ngx_int_t)0;
}
void user_uninit_m3u9(ngx_cycle_t* cycle)
{
}
ngx_int_t ngx_http_m3u9_handler(ngx_http_request_t* request)
{
// uri
char uri[256];
memset(uri,0,sizeof(uri));
strncpy(uri, (char *)request->uri_start, request->uri_end - request->uri_start);
ngx_log_stderr(0,"m3u9: request uri:%s", uri);
ngx_int_t retFilter = display_not_find(request);
return retFilter;
}
static char* ngx_http_set_handler(ngx_conf_t* cf, ngx_command_t* cmd, void* conf)
{
ngx_http_core_loc_conf_t* pclcf = NULL;
pclcf = (ngx_http_core_loc_conf_t *)ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
pclcf->handler = ngx_http_m3u9_handler;
return NGX_CONF_OK;
}
// 404 not_find
ngx_int_t display_not_find(ngx_http_request_t *request)
{
// http
request->headers_out.content_type.data=(u_char *)"text/html";
request->headers_out.content_type.len=sizeof("text/html")-1;
request->headers_out.content_length_n=sizeof(not_find_404)-1;
request->headers_out.status=NGX_HTTP_NOT_FOUND;
ngx_http_send_header(request);
// not_find html
ngx_buf_t* b = (ngx_buf_t *)ngx_pcalloc(request->pool, sizeof(ngx_buf_t));
b->memory = 1;
b->last_buf = 1;
b->pos = not_find_404;
b->last = not_find_404 + strlen((char *)not_find_404);
ngx_chain_t out;
out.next = NULL;
out.buf = b;
ngx_int_t retFilter = ngx_http_output_filter(request, &out);
return retFilter;
}
코드 요약 설명:
ngx 를 정의 해 야 합 니 다.module_t 변 수 는 모듈 구조 체 변수 로 번역 되 고 이 변수 가 있 으 면 모듈 이 있어 도 됩 니 다.쉽 죠? < @ ^ @ >
이 곳 은 ngx 라 고 명명 되 었 습 니 다.http_m3u9_module
ngx_module_t ngx_http_m3u9_module =
{
NGX_MODULE_V1,
&ngx_http_m3u9_module_ctx,
ngx_http_m3u9_commands,
NGX_HTTP_MODULE,
NULL,
NULL,
&user_init_m3u9,
NULL,
NULL,
&user_uninit_m3u9,
NULL,
NGX_MODULE_V1_PADDING
};
이 변수 에는 두 개의 변수 ngx 가 포함 되 어 있 습 니 다.http_m3u9_module_ctx, ngx_http_m3u9_commands,
모듈 상하 문 변수, 모듈 명령 변수, 읽 기 헤더 파일 의 정 의 를 추적 해 야 한 다 는 것 을 더욱 깊이 이해 합 니 다.여기 서 소홀히 하 다.
user_init_m3u 9 는 프로 세 스 생 성 시 사용자 가 입구 주 소 를 초기 화 합 니 다.
static ngx_int_t init_module_handler(ngx_cycle_t* cycle);
메모리 할당, 파일 열기 등 초기 화 코드 를 여기에 놓 을 수 있 습 니 다.
이 코드 의 역할 을 몰 랐 고 초기 화 코드 도 실행 코드 ngx 에 두 었 습 니 다.http_m3u9_handler 중.
물론 한 번 만 실행 할 수 있 도록 변수 has 를 사용 해 야 합 니 다.init 표식.
지금 은 이 인터페이스 가 생 겨 서 nginx 구조 디자인 이 아직도 매우 절실 하 다 는 것 을 알 수 있다.
user_uninit_m3u 9 는 입구 주 소 를 초기 화 합 니 다.
static ngx_command_t ngx_http_m3u9_commands[] =
{
{
ngx_string("m3u9"),
NGX_HTTP_LOC_CONF | NGX_CONF_NOARGS,
ngx_http_set_handler,
0,
0,
NULL
},
ngx_null_command
};
ngx http set handler 는 리 셋 함수 주소 입 니 다.
static char* ngx_http_set_handler(ngx_conf_t* cf, ngx_command_t* cmd, void* conf);
이 함 수 는 중요 한 것 을 얻 기 위해 한 번 호출 됩 니 다. 나중에 url 에 접근 할 때 호출 되 는 함수 주소 입 니 다.
여 기 는 ngx http m3u9 handler 로 정의 되 어 있 습 니 다.
pclcf->handler = ngx_http_m3u9_handler;
http 요청 처 리 는 ngx http m3u9 handler 에서 이 루어 집 니 다.
데모 코드 는 장 치 를 열 고 데 이 터 를 읽 고 되 돌려 줍 니 다.
404 Not Found 페이지 가 어떻게 전송 되 는 지 보 여 줍 니 다. 사실 읽 기 코드 는 잘 알 고 있 습 니 다.
1. 404 Not Found 페이지 를 문자열 로 정의 합 니 다. 이것 은 전송 을 요구 하 는 데이터 입 니 다.
u_char not_find_404[] = "...."
2. http 전송 시 머리 정 보 를 보 내야 합 니 다.
ngx_http_send_header(request);
보 내기 전에 header 데 이 터 를 준비 해 야 합 니 다.
데이터 형식, 데이터 길이 와 페이지 상 태 를 설명 합 니 다.
3. ngx chain t 변 수 를 정의 하고 다음 링크 가 비어 있 음 을 설명 합 니 다. 이 연결 데 이 터 는 b 이 고 필 터 를 호출 하여 사용자 에 게 피드백 합 니 다.
ngx_int_t retFilter = ngx_http_output_filter(request, &out);
return retFilter;
4. b 는 ngx buf t 구조 주소 입 니 다. 속성 및 메모리 에 있 는 위 치 를 설명 합 니 다.
데이터 의 시작 주 소 를 되 돌려 주 고 주 소 를 끝 내 는 것 도 우리 의 가장 큰 관심 사 입 니 다.
이상 의 절 차 를 거 쳐 서 야 메모리 의 데 이 터 를 클 라 이언 트 에 전송 할 수 있 습 니 다.
간단 한 문자열 정보 보다 훨씬 복잡 하 다 는 것 을 알 수 있 습 니 다. 왜 일 까요?
이것 은 구조 가 결정 한 것 이다.
1. 먼저 헤더, 설명 형식, 내용 길이 등 을 보 내 도록 요구 합 니 다. 바 이 너 리 나 다른 데이터 형식 을 지원 할 수 있 습 니 다.
2. 그리고 이 블록 데이터 정 보 를 채 우 고 다음 데이터 블록 을 연결 할 지 여 부 를 설명해 야 합 니 다.
프로필 작성 1. config
이 config 는 모듈 디 렉 터 리 에 있 는 파일 입 니 다. / configure 에서 사용 할 수 있 습 니 다. 내용 은 다음 과 같 습 니 다.
ngx_addon_name=ngx_http_m3u9_module
HTTP_MODULES="$HTTP_MODULES ngx_http_m3u9_module"
CORE_LIBS="$CORE_LIBS -lrt"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS \
$ngx_addon_dir/src/ngx_http_m3u9_module.c"
모듈 의 이름 은 코드 의 모듈 이름과 일치 해 야 합 니 다.
파일 의 디 렉 터 리 구 조 는 다음 과 같 습 니 다.
nginx/mymodules // dir
nginx/mymodules/config // file, need edit
nginx/mymodules/src // dir
nginx/mymodules/src/ngx_http_m3u9_module.c // file, need edit
2. nginx.conf
Nginx 프로필 의 명령 은 일반적으로 main, server, location, upstream 네 가지 로 나 뉜 다.
main: 전역 명령, 예 를 들 어 본 논문 에서 worker processes 1 등;
server: 특정 호스트 와 관련 된 설정;
location: 특정 uri 와 관련 된 설정;
upstream: 상류 서버 관련 설정, fastcgi, proxy pass 등 이 모두 사 용 될 수 있 습 니 다.
여기 서 우 리 는 location / 절 을 찾 아서 새로운 절 을 배출 할 수 밖 에 없다.
location /m3u9
{
m3u9
}
/ m3u 9 는 url 의 접근 주소 입 니 다. {} 에서 m3u 9 는 commands 가 정의 하 는 문자열 과 일치 합 니 다.
configure 를 실행 하여 Makefile 생 성
./configure --add-module=./mymodules/m3u9/
뒤의 매개 변 수 는 모듈 이 있 는 위 치 를 가리킨다.
아래 출력 을 보면 틀림 없습니다.
adding module in ./mymodules/m3u9/
+ ngx_http_m3u9_module was configured
당시 에 나 는 Makefile, how silly am I, nginx 를 손 으로 수정 하여 모두 우 리 를 위해 처리 했다.
nginx 는 c 파일 을 직접 지원 할 수 있 습 니 다. c + 코드 를 사용 했다 면 Makefile 을 수 동 으로 수정 해 야 합 니 다.
CPP 에 대한 컴 파일 을 g + + 로 바 꾸 고 링크 도 g + + 를 사용 하면 됩 니 다.
... / configure -- help 는 도움말 을 볼 수 있 습 니 다.
-- prefix 로 경 로 를 설정 할 수 있 습 니 다. -- add - module 로 모듈 을 추가 할 수 있 습 니 다.
컴 파일 및 설치
make, 당연히 통과 해 야 지.
make install, 어디 에 설치 되 었 는 지 확인 하 십시오. configure 가 표시 하 는 경로 와 일치 합 니 다.
기.
http://localhost/m3u9/abc.ts
우리 코드 로 호출 할 수 있 습 니 다. 컴퓨터 두 대 를 사용 하 는 것 이 더 좋 습 니 다.
코드 에 로 그 를 추 가 했 습 니 다. error 파일 에 로그 기록 이 있 습 니 다.
모든 것 이 간단 해 졌 습 니 다. abc. ts 는 허 지 를 말 합 니 다. 어쨌든 제 프 리 젠 테 이 션 코드 는 어떤 파일 을 요청 하 든 마음대로 2M 데 이 터 를 되 돌려 줍 니 다.
ngix. conf 에서 master process off, daemon off 를 gdb 디 버 깅 에 편리 하 게 할 수 있다 고 합 니 다.
제 코드 가 간단 하기 때문에 제 코드 는 사용자 층 에서 먼저 조정 할 수 있 습 니 다 (gdb 를 사용 할 수 있 습 니 다)
이곳 은 gdb 대 가 를 일 으 키 지 않 습 니 다. log 가 있 으 면 대처 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.