Разработчик Nginx Игорь Сысоев был задержан по уголовному делу, сфабрикованному на основе безосновательной претензии Рамблера, пытающегося осуществить рейдерский захват Nginx. Без Nginx большинство сайтов в Интернете не смогли бы существовать, так как сайты являются быстрыми не в последнюю очередь благодаря производительности веб-сервера Nginx.
Для информирования людей о ситуации и моральной поддержки Игоря Сысоева предлагается 15 декабря в 12:00 на полчаса отключить свои сайты (на них ведь наверняка работает Nginx, да?) и заменить их на заглушку с информацией.
Данная заглушка написана на Python+aiohttp, и основное её предназначение — мимикрировать под стандартную браузерную страницу ошибки. Сервер выбирает шаблон страницы по юзерагенту, поддерживает многоязычность, возвращает ошибку 503 (или любую другую, прописанную в настройках), выставляет HTTP-заголовок Server.
Оригинальная идея: https://habr.com/ru/post/480204/
Требуется Python 3.5+ и pip.
git clone https://github.com/andreymal/nginx-blackout-python.git
cd nginx-blackout-python
virtualenv env # Необязательно, но рекомендуется
. env/bin/activate
pip install .
cp config.example.toml config.toml
nginx_blackout
По умолчанию будет запущен aiohttp-сервер по адресу http://127.0.0.1:8000/
;
вы можете изменить это, отредактировав файл config.toml
.
Для обновления версии:
git pull
pip install --upgrade .
Не забудьте перезапустить после обновления или изменения настроек.
Вариант с полной заменой всего сайта на сабж (поместите в секции server
):
location / {
proxy_pass http://127.0.0.1:8000;
server_tokens off;
proxy_pass_header Server;
}
Вариант с редиректом 15 декабря с 12:00 до 12:30 по московскому времени (автор):
location = /nginx-blackout {
proxy_pass http://127.0.0.1:8000;
server_tokens off;
proxy_pass_header Server;
}
location / {
if ($time_iso8601 ~ ^2019-12-15T09:[0-2][0-9]:[0-9][0-9] ) {
return 302 /nginx-blackout;
}
# ... usual location config
}
Можно вести простенький подсчёт кликов путём редиректа на свой адрес, который отредиректит на страницу с информацией:
# config.toml
[general]
button_url = "/nginx-blackout-info"
# nginx
location = /nginx-blackout-info {
return 302 https://m.habr.com/ru/company/itsumma/blog/479942/;
}
После этого можно будет погрепать /nginx-blackout-info
в access.log
.
В файле конфигурации (по умолчанию config.toml
) в разделе general
можно прописать следующие настройки:
-
host
(по умолчанию"127.0.0.1"
) — какой адрес будет слушать сервер; -
port
(по умолчанию8000
) — какой порт будет слушать сервер (TCP); -
unix_socket
— путь к сокет-файлу; если указан, будет использоваться вместо TCP-порта; -
templates_dirs
— список путей к каталогам с шаблонами, в которых вы можете написать свои собственные Jinja2-шаблоны вместо стандартных из каталогаtemplates
; -
locales
— (по умолчанию["en", "ru"]
) — список доступных на сайте языков (тех, для которых есть шаблон видаnginx_blackout_{lang}.html
). По HTTP-заголовку Accept-Language будет выбран самый подходящий язык для клиента; если подходящего не найдётся, будет использован первый язык из списка (по умолчанию английский); -
status_code
(по умолчанию200
) — каким кодом ответа HTTP отвечать; -
browser_cache_max_age
(по умолчанию0
) — на сколько времени (в секундах) страница будет закэширована в браузере; -
server_header
— значение HTTP-заголовка Server, которое будет прописано вместо стандартного aiohttp (не забудьте прописатьserver_tokens off
иproxy_pass_header Server
в настройках вашего nginx); -
site_name
— название сайта, которое будет написано вместо слова «этот» в тексте сообщения. Можно прописать несколько значений для каждого языка (см. пример в файлеconfig.example.toml
); -
button_url
— ссылка, на которую ведёт кнопка «Что случилось?». Можно прописать несколько значений для каждого языка; -
button_text
— текст кнопки «Что случилось?». Можно прописать несколько значений для каждого языка; -
favicon_url
— ссылка на фавиконку сайта, которая пропишется в мета-теге и на которую будет редирект со страницыfavicon.ico
(если не указать, то вместоfavicon.ico
будет ошибка 404). Можно прописать несколько значений для каждого языка; -
favicon_type
(по умолчанию"image/x-icon"
) — тип фавиконки для прописывания в мета-теге. Можно прописать несколько значений для каждого языка; -
random_delay_ms_min
иrandom_delay_ms_max
— делает случайную задержку перед ответом в миллисекундах из этого диапазона для имитации тормознутости интернета, в котором не было бы nginx (по умолчанию отсутствует); -
metrika
— если true, то в конце страницы будет добавлен скрипт Яндекс.Метрики (точнее, содержимое шаблонаmetrika.html
); -
yandex_metrika_id
— идентификатор счётчика Яндекс.Метрики (игнорируется, если метрика отключена).