LINUX.ORG.RU

Написание своего модуля для Nginx

 


0

2

По работе пришлось дописывать модуль для nginx, никогда раньше подобным не занимался, поэтому возникла проблема, гугление сорцов nginx не дает результата. На данном этапе у меня происходит следующая ситуация, есть location с директивой proxy_pass, я в тот же location дописываю некую свою директиву и случается следующее. Переход на этот location кидает в мой обработчик, а мой обработчик уже внутри себя вызывает обработчик proxy_pass и следит за состоянием. Если 404 или какая-другая ошибка, то ничего не делаем. Если все ок, то совершаем действие. Но тут nginx возвращает какие-то странные результаты.

Ниже приведен лог, который пишет мой хендлер, nginx запускался с нулевым кешем!

http://pastebin.mozilla.org/7971626

Данные в логи имет следующую структуру:

2014/12/13 14:35:39 [debug] 5649#0: *1 REQUEST PREPROXY HANDLER: /1.jpg //это на какой URL пришел запрос
2014/12/13 14:35:39 [debug] 5649#0: *1 PROXY CODE: -4 //какой ngx_int_t вернула обработчик proxy_pass
2014/12/13 14:35:39 [debug] 5649#0: *1 RESPONSE PREPROXY HANDLER: 0 //r->headers_out.status после вызова proxy_pass обработчика
Если интересно, то вот код непостредственно обработчика
ngx_int_t ngx_http_proxy_uri_save_mem_tree_handler(ngx_http_request_t* r){
    ngx_http_cache_purge_loc_conf_t  *cplcf;
    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "REQUEST PREPROXY HANDLER: %V", &(r->uri));
    cplcf = ngx_http_get_module_loc_conf(r, ngx_http_cache_purge_module);
    ngx_int_t code = cplcf->proxy_handler(r);
    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "PREPROXY PROXY CODE: %d", code);
    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "RESPONSE PREPROXY HANDLER: %d", r->headers_out.status);
    return code;
}

Мне непонятно следующее, почему nginx пишет в заголовок то 200, то 304. Видно что запрос на /1.jpg первый раз вернул 0, а затем сразу стал возвращать 304, а /1.gif первый раз вернул 0, а затем всегда 200. Также не понятно почему функция всегда возвращает -4. Что это вообще за -4? Искал в исходниках - ничего, не понятно что это значит.

Большое спасибо

Видно что запрос на /1.jpg первый раз вернул 0, а затем сразу стал возвращать 304, а /1.gif первый раз вернул 0, а затем всегда 200.

Очевидно что jpg у тебя закэширован, а gif - нет. Что в конфиге на эту тему написано?

alozovskoy ★★★★★ ()
Ответ на: комментарий от alozovskoy

Я лично перед запуском удалил весь кеш, так что они в равных условиях.

Сейчас посмотрел файлы кеша,

KEY: /1.gif
HTTP/1.1 200 OK
Server: nginx/1.6.1
Date: Sat, 13 Dec 2014 11:52:14 GMT
Content-Type: image/gif
Content-Length: 16071844
Last-Modified: Tue, 09 Dec 2014 03:39:11 GMT
Connection: close
ETag: "54866edf-f53ca4"
Expires: Thu, 31 Dec 2037 23:55:55 GMT
Cache-Control: max-age=315360000
Cache-Control: public
Accept-Ranges: bytes

KEY: /1.jpg
HTTP/1.1 200 OK
Server: nginx/1.6.1
Date: Sat, 13 Dec 2014 11:44:53 GMT
Content-Type: image/jpeg
Content-Length: 35688
Last-Modified: Wed, 26 Nov 2014 00:15:12 GMT
Connection: close
ETag: "54751b90-8b68"
Expires: Thu, 31 Dec 2037 23:55:55 GMT
Cache-Control: max-age=315360000
Cache-Control: public
Accept-Ranges: bytes
Chubakur ★★ ()
Последнее исправление: Chubakur (всего исправлений: 1)

Посмотри ещё заголовки запроса. Я не помню подробностей, но это завязано не на кэш nginx, а на кэш браузера. В первом случае браузер запрашивает новый файл. Во втором случае браузер спрашивает - «а не обновился ли файл, который у меня уже есть?»

update: во втором случае браузер добавляет заголовок

«If-Modified-Since Fri, 12 Dec 2014 13:15:06 GMT»

И если не modified, то веб-сервер вернёт не 200 и тело файла, а просто 304

router ★★★★★ ()
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от Chubakur

Хотя походу gif закеширован после того как был запрос, если смотреть по времени

Chubakur ★★ ()

Что это вообще за -4?

-4 это NGX_DONE.

вызывает обработчик proxy_pass и следит за состоянием. Если 404 или какая-другая ошибка, то ничего не делаем. Если все ок, то совершаем действие.

IMHO, header filter тут больше подходит. Не надо будет возиться с обработчиками.

i-rinat ★★★★★ ()
Ответ на: комментарий от router

Спасибо, дело действительно именно в этом. При тестировании с curl - все время ответ 200. А в чем может быть дело с -4? Что это за константа?

Chubakur ★★ ()
Ответ на: комментарий от i-rinat

А где можно почитать на тему фильтров? На самом деле суть этого всего в том, чтобы строить в оперативке карту закешированных файлов, чтобы можно было делать сложную инвалидацию кэша по регулярным выражениям

Chubakur ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.