= Настройка «тыптыща» =

С этим все несложно, однако подводные камни все равно есть из-за упертого мнения 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_fo
rwarded_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_fo
rwarded_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 и убедитесь, что рельсы складывают в кеш страницы ровно по тем урлам, которые приходят от клиента.

Геморройно, но я сейчас все эти изменения пытаюсь пробить в рельсы.

Sidebar