The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Проксирование Ruby On Rails через nginx с кэшироваинем в memcached (nginx memcached rails ruby web)


<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>
Ключевые слова: nginx, memcached, rails, ruby, web,  (найти похожие документы)
From: Макс Лапшин Date: Mon, 26 Jan 2008 18:21:07 +0000 (UTC) Subject: Проксирование Ruby On Rails через nginx с кэшироваинем в memcached Оригинал: http://maxidoors.ru/2007/4/24/nginx-memcached-rails Настройка nginx С этим все несложно, однако подводные камни все равно есть из-за упертого мнения nginx-а, что постить можно не куда попало, а только куда ему кажется возможным. Опишем конфигурацию при которой по-умолчанию nginx будет ходить к memcached-у, а при отдаче 404 ошибки (нет страницы), 405 (нельзя постить в memcached) или чего-то еще, пойдет к рельсам. user www-data; worker_processes 1; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; events { worker_connections 1024; use epoll; } http { upstream mongrel { server 127.0.0.1:5035; server 127.0.0.1:5036; } server { listen 80; server_name maxidoors.ru; root /var/www/maxidoors/public; location / { default_type text/html; # иначе из memcached-а потечет непойми чего. # теперь надо указать директивы для proxy, # потому что мы уже отсюда можем отправиться к монгрелам proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; # делаем хак для обхода непонятного мне поведения nginx-а if ($request_method = POST ) { proxy_pass http://mongrel; break; } set $memcached_key "totalhockey:production:$uri" # обратите внимание на формат ключа. # Рельсы сейчас используют полную херню вместо ключа, # об этом поподробнее потом. memcached_pass localhost:11211; # 404 ошибка получится, когда нет нужной страницы. # Ничего страшного, идем к рельсам. error_page 404 = /fallback; # 502 получим в том случае, если memcached отвалился. # это не повод стреляться, но сессии скорее всего хранятся тоже в нем. error_page 502 = /fallback; } # Статику отдаём nginx-ом. Аналогично вписать для стилей и яваскрипта # разница только в том, что для стилей и яваскриптов нельзя ставить # такое огромное время жизни. Они чаще меняются. location ~* images/.+\.(jpg|jpeg|gif|png)$ { root /var/www/totalhockey/current/public; access_log off; expires 30d; } location /fallback { # повторяем лабуду для прокси proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; if (!-f $request_filename) { proxy_pass http://mongrel; break; } } } } Всё, nginx настроен. Теперь начинается самое веселое и пока что недоделанное. Идем к моему тикету и забираем приложенный патч. Он для edge (1.2.3--1.2.4) рельс, но если надо его можно приспособить и для более старых версий. Плюс к этому, надо поставить memcache-client и memcache_fragments. Второй представляет из себя 10 строчек кода, которые сейчас в процессе включения в memcache-client. Плюс к этому надо еще найти строчку normalize! в actionpack/lib/action_controller/caching.rb и закомментировать её. После этого запустите memcached с ключом -vv и убедитесь, что рельсы складывают в кеш страницы ровно по тем урлам, которые приходят от клиента.
> Evgeniy > Приветствую всех. Настроил связку nginx+moingrel+memcached Всё > кэшируется отлично. Такая вот проблемка: По первому запрос не > кэшированной страницы возвращает в браузер клиента надлежащий > контент. По второму запросу этой же страницы контент берется из > кэша но выглядит он как %3Chtml%3E%0A%3Chead% и так далее... В чем > грабли? Во всём виноват ключик :raw в параметрах memcache-client. Он по-умолчанию сериализует кешируемый объект. Это надо отключить. > Evgeniy > Я уже написал маленький модуль к nginx. package unescape; use nginx; use Cache::Memcached; sub unescape{ my $r = shift; $memd = new Cache::Memcached { 'servers' => ["127.0.0.1:11211"], 'debug' => 0, 'compress_threshold' => 10_000, }; $url = $r->uri; $body = $memd->get("x.x.x.x$url"); if ( length($body) > 0 ){ $r->send_http_header; $r->print($r->unescape($body)); return OK; } else { return 404; } }

<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>

 Добавить комментарий
Имя:
E-Mail:
Заголовок:
Текст:




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру