Upload
redivy
View
2.000
Download
2
Embed Size (px)
Citation preview
FEERSUM ENJINNnginx: inside
Фичи nginx
●event driven●non-blocking●modular
Устройство: процессы
Nginx Master
● Мониторит воркеры● Обработка сигналов -INT — выход -HUP — переконфигурация -USR1 — log rotate
Nginx Worker
● Обработка запросов● Выполняет команды из мастер-
процесса
Cache Manager, Cache Loader
● loader: подгружает информацию о содержимом кеша
● manager: отслеживает протухание записей в кеше
HTTP Request:немного механики
Обработка запроса● Получить данные, распарсить запрос● Найти соответствующие сервер и location● Запустить обработчики фаз● Сгенерировать ответ● Применить фильтры к заголовкам и телу
ответа● Отправить клиенту то, что получилось
Фазы обработки● Post Read (например, для realip)● Rewrite & read config● Проверка доступа ● Проверка существования файлов
(если надо)● Генерация контента● Запись логов
Устройство: модули
Модули ядра
●event●http main(легко запомнить)
Основные модули
● HTTP Core● Upstream● Access● Rewrite● Charset● Log
… и другие
И ещё модули(опционально)
HTTP AdditionEmbedded PerlFLVGzip PrecompressionRandom IndexGeoIPReal IP
SSLStub StatusWebDAVGoogle PerftoolsXSLTSecure LinkImage Filter
Модуль Hello World
Что требуется?● Директивы конфига● Обработчики● Установка обработчиков● Порядок инициализации модуля● Описание модуля
Директивы конфигаstatic ngx_command_t ngx_http_hello_commands[] = {
{ ngx_string("hello"),
NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,
ngx_http_hello,
0,
0,
NULL },
ngx_null_command
};
Обработчикиstatic ngx_int_tngx_http_hello_handler(ngx_http_request_t *r){ /* То, что делает модуль - находится здесь */ return NGX_OK;}
Установка обработчиковstatic char *
ngx_http_hello(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_http_core_loc_conf_t *clcf;
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
clcf->handler = ngx_http_hello_handler;
return NGX_CONF_OK;
}
Порядок инициализации (контекст)
static ngx_http_module_t ngx_http_hello_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 configurtion */
NULL /* merge location configuration */
}
Описание модуляngx_module_t ngx_http_hello_module = {
NGX_MODULE_V1,
&ngx_http_hello_module_ctx, /* module context */
ngx_http_hello_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
};
Build It!● Файл configngx_addon_name=ngx_http_hello_module
HTTP_MODULES="$HTTP_MODULES ngx_http_hello_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_module.c"
● Configure nginx./configure --add-module=path/to/your/new/module/directory
Инструменты отладки
● Проверка memory leaks
Valgrind
● Трассировка системных вызовов● Deadlock detector
Strace
● Где упало?● Кто записал в память?● Трассировка
GDB
Работает?Grats!