nginx 소스 코드 학습 노트 (1) - nginx helloworld 모듈
1. nginx 모듈
먼저 nginx 와 apache 의 가장 큰 차이 점 은 nginx 의 모듈 이 동적 으로 추가 할 수 없다 는 것 입 니 다. 컴 파일 할 때 추가 할 모듈 경 로 를 지정 하고 nginx 소스 코드 와 함께 컴 파일 해 야 합 니 다.
nginx 모듈 의 처리 절차:
a. 클 라 이언 트 가 http 요청 도 nginx 서버 를 보 냅 니 다.
b. nginx 설정 파일 의 위 치 를 기반 으로 적합 한 처리 모듈 을 선택 하 십시오.
c. 부하 균형 모듈 백 엔 드 서버 선택 (역방향 프 록 시 상황 에서)
d. 처리 모듈 을 처리 하고 출력 버퍼 를 첫 번 째 필터 모듈 에 놓 습 니 다.
e. 첫 번 째 필터 모듈 처리 후 두 번 째 필터 모듈 에 출력
f. 그리고 두 번 째 여과 모듈 에서 세 번 째 여과 모듈 까지
g. N 번 째 필터 모듈...
h. 처리 결 과 를 클 라 이언 트 에 게 발송
2. nginx 모듈 작성
a. 모듈 폴 더 만 들 기
mkdir -p /opt/nginx_hello_world
cd /op/nginx_hello_word
b. 모듈 프로필 생 성
vi /opt/nginx_hello_word/config
다음 내용 을 기록 합 니 다:
ngx_addon_name=ngx_http_hello_world_module
HTTP_MODULES="$HTTP_MODULES ngx_http_hello_world_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_world_module.c"
CORE_LIBS="$CORE_LIBS -lpcre"
c. 모듈 메 인 파일 만 들 기
vi /opt/nginx_hello_world/ngx_http_hello_world_module.c
다음 내용 을 기록 합 니 다:
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>
static char *ngx_http_hello_world(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
/* Commands */
static ngx_command_t ngx_http_hello_world_commands[] = {
{ ngx_string("hello_world"),
NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,
ngx_http_hello_world,
0,
0,
NULL },
ngx_null_command
};
static u_char ngx_hello_world[] = "hello world";
static ngx_http_module_t ngx_http_hello_world_module_ctx = {
NULL, /* preconfiguration */
NULL, /* postconfiguration */
NULL, /* create main configuration */
NULL, /* init main configuration */
NULL, /* create server configuration */
NULL, /* merge server configuration */
NULL, /* create location configuration */
NULL /* merge location configuration */
};
/* hook */
ngx_module_t ngx_http_hello_world_module = {
NGX_MODULE_V1,
&ngx_http_hello_world_module_ctx, /* module context */
ngx_http_hello_world_commands, /* module directives */
NGX_HTTP_MODULE, /* module type */
NULL, /* init master */
NULL, /* init module */
NULL, /* init process */
NULL, /* init thread */
NULL, /* exit thread */
NULL, /* exit process */
NULL, /* exit master */
NGX_MODULE_V1_PADDING
};
static ngx_int_t
ngx_http_hello_world_handler(ngx_http_request_t *r)
{
ngx_int_t rc;
ngx_buf_t *b;
ngx_chain_t out;
/* Http Output Buffer */
r->headers_out.content_type.len = sizeof("text/plain") - 1;
r->headers_out.content_type.data = (u_char *) "text/plain";
b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));
out.buf = b;
out.next = NULL;
b->pos = ngx_hello_world;
b->last = ngx_hello_world + sizeof(ngx_hello_world);
b->memory = 1;
b->last_buf = 1;
r->headers_out.status = NGX_HTTP_OK;
r->headers_out.content_length_n = sizeof(ngx_hello_world);
ngx_http_send_header(r);
return ngx_http_output_filter(r, &out);
}
static char *
ngx_http_hello_world(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_http_core_loc_conf_t *clcf ;
/* register hanlder */
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
clcf->handler = ngx_http_hello_world_handler;
return NGX_CONF_OK;
}
d. nginx 소스 패 키 지 를 다운로드 합 니 다. 저 는 nginx - 1.0.13. tar. gz 를 다운로드 합 니 다.
helloworld 모듈 을 컴 파일 하기 전에 먼저 nginx 가 독립 적 으로 컴 파일 에 성공 할 수 있 는 지, 필요 한 모든 모듈 이 설치 되 어 있 는 지 확인 하 십시오.
helloworld 모듈 과 함께 nginx 를 컴 파일 합 니 다:
./configure --prefix=/usr/local/nginx --add-module=/opt/nginx_hello_world/
make
make install
e, nginx. conf 설정
location= /hello {
hello_world;
}
f. nginx 시작, 접근
http://localhost/hello
작성 한 helloworld 모듈 에서 출력 한 문 자 를 볼 수 있 습 니 다.
3. hello World 모듈 분석
a.ngx_command_t 함 수 는 모듈 명령 을 포함 하 는 정적 배열 ngx 를 정의 하 는 데 사 용 됩 니 다.http_hello_world_commands
static ngx_command_t ngx_http_hello_world_commands[] = {
{ ngx_string("hello_world"), // , , ngx_str_t 。
NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS, // , :location , 。
ngx_http_hello_world,// , (ngx_conf_t *cf,ngx_command_t *cmd, void *conf)
0,// ,
0,
NULL },
ngx_null_command
};
b.static u_char ngx_hello_World [] = "hello World" 는 화면 에 출력 되 는 문자열 입 니 다.
c.ngx_http_module_t 구조 체 ngx 정의http_hello_world_module_ctx:
static ngx_http_module_t ngx_http_hello_world_module_ctx = {
NULL, /* */
NULL, /* */
NULL, /* */
NULL, /* */
NULL, /* */
NULL, /* */
NULL, /* */
NULL /* */
};
d.ngx_module_t 정의 구조 체 ngxhttp_hello_world_module
ngx_module_t ngx_http_hello_world_module = {
NGX_MODULE_V1,
&ngx_http_hello_world_module_ctx, /* module context */
ngx_http_hello_world_commands, /* module directives */
NGX_HTTP_MODULE, /* module type */
NULL, /* init master */
NULL, /* init module */
NULL, /* init process */
NULL, /* init thread */
NULL, /* exit thread */
NULL, /* exit process */
NULL, /* exit master */
NGX_MODULE_V1_PADDING
};
그 는 모듈 의 주요 내용 과 명령 의 집행 부분 을 포함 하고 있 으 며, 다음 절 에 상세 하 게 설명 할 것 이다.
e. 처리 함수, ngxhttp_hello_world_handler 도 hello World 모듈 의 핵심 부분 입 니 다.
static ngx_int_t
ngx_http_hello_world_handler(ngx_http_request_t *r)//ngx_http_request_t *r
{
ngx_int_t rc;
ngx_buf_t *b;
ngx_chain_t out;
/* Http Output Buffer */
r->headers_out.content_type.len = sizeof("text/plain") - 1;
r->headers_out.content_type.data = (u_char *) "text/plain";
b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));
out.buf = b;
out.next = NULL;
b->pos = ngx_hello_world;
b->last = ngx_hello_world + sizeof(ngx_hello_world);
b->memory = 1;
b->last_buf = 1;
r->headers_out.status = NGX_HTTP_OK;
r->headers_out.content_length_n = sizeof(ngx_hello_world);
ngx_http_send_header(r);
return ngx_http_output_filter(r, &out);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Exception in thread main java.lang. NoClassDefFoundError 오류 해결 방법즉,/home/hadoop/jarfile) 시스템은 Hello World 패키지 아래의class라는 클래스 파일을 실행하고 있다고 오인하여 시스템의 CLASSPATH 아래 (일반적으로 현재 디렉터리를 포함) Hell...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.