LINUX.ORG.RU

Nginx получения буфера html контента

 , , ,


0

1

Добрый день. Предо мной стоит задача получения и кэширования статического контента прямо в Redis. Для взаимодействия с Redis -ом использую nginx модуль http_redis_module (http://wiki.nginx.org/HttpRedis). Как известно nginx написан на чистом С. Поковырялся в исходниках но никак не смог найти то место где получается html контент сайта. Как я могу положить в буфер этот чертов html контент ? Спасибо.

Что-то я не понял: писать контент в редис нужно прямо из нгинкса? Если да, то зачем? Кстати, непохоже, чтобы упомянутый модуль это умел. Не лучше ли делать это на бэкенде?

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

Да нужно прямо из нгинкса, потому что редис находится в озу и поэтому работает быстрее чем файловая система. Этот модуль только проверяет если в редисе есть такой url то возвращает его контент, то есть в этом модуле реализован только метод гет а сет -а нет.

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

Если контент статический, то можно единократно положить его в редис, разве нет?

Если динамический, то, как я уже говорил, лучше делать это на бэкенде.

Если хочется непременно средствами нгинкса, то получить контент респонса можно, например, с помощью луа модуля. Другие способы так сходу не вспоминаются. Лучше всего запилить свой модуль, подсмотрев, как это реализовано в том же луа.

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

Логически как минимум должно существовать способ для однократной записи в редис, но вся моя проблема в том что не получается найти где именно делается этот запись в редис. В модуле все функции работают только с редисом вот эти функции

 static ngx_int_t ngx_http_redis_create_request(ngx_http_request_t *r);
static ngx_int_t ngx_http_redis_reinit_request(ngx_http_request_t *r);
static ngx_int_t ngx_http_redis_process_header(ngx_http_request_t *r);
static ngx_int_t ngx_http_redis_filter_init(void *data);
static ngx_int_t ngx_http_redis_filter(void *data, ssize_t bytes);
static void ngx_http_redis_abort_request(ngx_http_request_t *r);
static void ngx_http_redis_finalize_request(ngx_http_request_t *r,
    ngx_int_t rc);

static ngx_int_t ngx_http_redis_add_variables(ngx_conf_t *cf);
static void *ngx_http_redis_create_loc_conf(ngx_conf_t *cf);
static char *ngx_http_redis_merge_loc_conf(ngx_conf_t *cf,
    void *parent, void *child);

static char *ngx_http_redis_pass(ngx_conf_t *cf, ngx_command_t *cmd,
    void *conf);

static char *ngx_http_get_content(ngx_conf_t *cf, ngx_command_t *cmd,
    void *conf);
neutrino ()

Я не понимаю почему ты хочешь из nginx класть что-то в редис. Nginx только забирать должен, а класть должен бэкенд. Если у тебя типичный сайт то сделай так. Пусть nginx пытается забрать из редис страницу. Если её там нет то пусть шлёт запрос на бэкенд. А бекенд пусть кладёт запрос в редис. Ну и что-то отдаёт nginx.

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

где именно делается этот запись в редис

Думаю что нигде, там нет такого функционала. А ты хотел чтобы nginx сам складывал в редис кэш?

Я бы не заморачивался с redis, а кэшировал на tmpfs. Для этого в nginx есть все батарейки. Это моё имхо.

true_admin ★★★★★ ()

Кстати, ОС сама кэширует файлы в оперативе (page cache). Я бы заморачивался с redis только если бы был уверен что этот подход действительно создаёт проблемы в вашем сценарии.

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

ngx_http_redis_process_header

Вот здесь уже есть ответ от backend'а, но он ещё не отослан клиенту.

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

Спасибо, ваш ответ очень помог мне. Хотя у меня и хороший опыт в С/С++, но в вебе я новичок и многое пока мне не так понятно. Я прохожу интерншип в одной компании и они дали мне это задание и вот спросил я тимлида по поводу бекенда и он мне сказал что в качестве бекенда у нас выступает node.js и тут сразу вот такой вопрос напрашивается: та часть кода, где nginx пытается забрать страницу из редис реализовано в вышеупомянутой мной модуле (http_redis_module) и когда оказывается что запрашиваемая страница отсутствует нужно сделать запрос бэкенду, то есть node.js, но как я могу из С кода модуля http_redis_module сделать запрос node.js что бы тот записал эту страницу в redis ?

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

Что-то ты не то делаешь. Это делается на уровне конфига. В сырцы лезть вообще не надо. Пример конфига который делает всё как ты хочешь лежит вот тут: http://wiki.nginx.org/HttpRedis . Вместо backend подставь URL бэкенда. Что-то типа http://localhost:8080 или путь к fcgi-сокету...

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

Огромное спасибо вам, вы мне очень помогли, жаль тут нет возможности поставить рейтинг

neutrino ()

А что за проект. я ищу технологичный проект для участия

Помогите найти стартап или любой проект с применением технологий. redis, mongodb, nodejs, nginx, haskell python короче не просто фреймворк на php.. Если кто знает ссылки подскажите. Из своих более менее тезхнологичных проектов могу назвать чат три года назад писал - jQuery, polling . Comet не использовал. для поддержки эмуляции постоянного соединения использовались известные темы.

prog90 ()
Ответ на: комментарий от neutrino

А мне неважно местоположение. я бы удаленно принял участие.

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