- PVSM.RU - https://www.pvsm.ru -
Технические работы неожиданно случаются у всех проектов и площадок — избежать нельзя, можно только подготовиться. В этом обзоре собран наш опыт перевода front фермы на автономный режим работы — без хранилища и backend.
Это самый простой способ — положить статичную страничку на локальный диск по всей ферме и настроить rewrite на нее всех запросов.
server {
listen 80;
location / {
rewrite ^.*$ /maintance.html;
}
location /maintance.html {
alias .../maintance.html;
}
}
Преимущества
Проблемы
Долго так продолжаться конечно же не могло и, перед следующим плановым downtime на 8 часов, нам поставили задачу
откручивать рекламу любой ценой
Для понимания масштаба — у нас в сутки около полутора миллионов уников на двух сотнях новостных проектов, десятки (близко к ста) миллионов хитов на разный контент на front ферму, большая часть графики и видео лежит на CDN. Front ферма состоит из трех nginx узлов, над которыми стоит аппаратный балансировщик.
На время проведения работ в ферму был включен nginx-night со следующими настройками
location / {
proxy_pass http://nginx-farm;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass_header X-Accel-Redirect;
proxy_pass_header X-Accel-Expires;
proxy_ignore_headers X-Accel-Redirect;
set $store_path ---$request_uri---$query_string;
if ($store_path ~ "(.*)(.{1})(.{2})"){
set $new_store_path $3/$2/$store_path;
}
proxy_store /data/cache/store/$host/$new_store_path;
}
location ~ .(flv|asf|mp4)$ {
proxy_pass http://nginx-farm;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
В час Х основные узлы были выведены из балансировки, конфиг nginx-night изменен на примерно такой
location / {
root /data/cache/store/$host/;
set $store_path ---$request_uri---$query_string;
if ($store_path ~ "(.*)(.{1})(.{2})"){
set $new_store_path $3/$2/$store_path;
}
rewrite ^.*$ /$new_store_path break;
expires 1m;
}
location ~ css {
default_type text/css;
root /data/cache/store/$host/;
set $store_path ---$request_uri---$query_string;
if ($store_path ~ "(.*)(.{1})(.{2})"){
set $new_store_path $3/$2/$store_path;
}
rewrite ^.*$ /$new_store_path break;
expires 1m;
}
По сравнению с заглушкой это был огромный шаг вперед, но
По итогам у нас даже было желание решить найденные проблемы самописным решением, но на глобальные задачи не набралось приоритета, а площадка тем временем успела немного измениться
И тут нам снова хотят на восемь часов отключить внутренний мир сайтов, в том числе перевозят сетевые устройства. Proxy_store использовать уже не было желания и мы попытались перейти на следующий уровень.
На всех проектах выставлен
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
Директива указывает nginx отдавать из кеша данные в случае ошибок, даже если данный элемент кеша уже считается устаревшим.
Дополнительно к этому
И далее идет штатная эксплуатация всей площадки до момента Х, когда проводятся следующие манипуляции
Во время учений перед работами техподдержка радовала закрытием тикетов фразой «жалоб со стороны пользователей не поступало». В боевом режиме — девять часов автономной работы, схема оправдала все ожидания — новости читались, видео смотрелось, реклама крутилась. Хотя конечно и здесь нашлись некоторые проблемы
В качестве приятного бонуса после всех доделок мы получили возможность переключать любой проект в статичный режим, если возникнет такая необходимость.
Для следующего шага основной целью станет научиться говорить «ДА» в ситуации «все пропало, нам срочно надо откатить проект на 15/30 минут назад, можете ли вы это сделать, а мы пока исправим причины» )
proxy_store [1]
proxy_cache_use_stale [2]
proxy_cache_path [3]
Memcache::set [4]
Автор: woyager
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/nginx/22837
Ссылки в тексте:
[1] proxy_store: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_store
[2] proxy_cache_use_stale: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_use_stale
[3] proxy_cache_path: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_path
[4] Memcache::set: http://php.net/manual/en/memcache.set.php
[5] Источник: http://habrahabr.ru/post/162949/
Нажмите здесь для печати.