Skip to content

Latest commit

 

History

History
146 lines (103 loc) · 7.78 KB

README.md

File metadata and controls

146 lines (103 loc) · 7.78 KB

nginx-blackout-python

Разработчик 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 .

Не забудьте перезапустить после обновления или изменения настроек.

Пример настройки nginx

Вариант с полной заменой всего сайта на сабж (поместите в секции 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 — идентификатор счётчика Яндекс.Метрики (игнорируется, если метрика отключена).