Программы
Увеличиваем таймауты uwsgi+nginx (обходим 504 Gateway Time-out)

Увеличиваем таймауты uwsgi+nginx (обходим 504 Gateway Time-out)

Если на вашем веб-сервере есть запросы, которые выполняются дольше 60 секунд, вы что-то делаете не так. Даже секунда на запрос — это ужасно долго, а 60 — те, что по умолчанию в nginx — просто ужас. Однако, есть ряд случаев, когда это необходимо/допустимо.

Если на вашем веб-сервере есть запросы, которые выполняются дольше 60 секунд, вы что-то делаете не так. Даже секунда на запрос — это ужасно долго, а 60 — те, что по умолчанию в nginx — просто ужас. Однако, есть ряд случаев, когда это необходимо/допустимо.

Поэтому "--yes-run-as-root", больше предупреждать и отговаривать не буду.

В конфиге uwsgi.ini увеличим время harakiri (до 10 минут):

harakiri = 600

В конфиге nginx увеличим timeoutы:

proxy_connect_timeout       600;
proxy_send_timeout          600;
proxy_read_timeout          600;
send_timeout                600;
uwsgi_read_timeout          600;

— в блоке location, который отвечает за uwsgi_pass.

После этого

systemctl restart uwsgi
systemctl reload nginx

Ну или как вы делаете перезапуск юнитов/тасков uwsgi, nginx.

Альтернативы увеличению тайм-аутов

Если у вас каждый запрос выполняется более 60 секунд — было бы неплохо посмотреть, где тратится время. Поискать debug-toolbarы под ваш фреймворк, посмотреть explain sql-запросов (если используете sql базу данных).

Если это разовые операции / пересчёт статистики / выгрузка данных, то есть 2 простых способа сделать эти запросы менее «вредными» для работы сервиса.

Отложенное выполнение в очереди, отсылка по почте

Часто менеджеры / маркетологи довольны наличию выгрузок / пересчёту статистики не из веб-интерфейса, а, например, из почты.

Тогда можно оставить в покое веб-интерфейс и сделать всё через воркеры. В этом случае нам потребуется очередь задач. Такие очереди обычно основаны на Redis или RabbitMQ (и прочих AMQP реализациях). В частности, для python можно воспользоваться python-rq. Для django есть его обёртка — django-rq, в которой можно даже смотреть на кол-во задач в очереди и перезапускать упавшие задачи.

Отправлять результаты можно, например, по почте.

Это вариант предоставления информации после запроса. Очередной пример масштабирования по времени.

Выполнение по cron, сохранение на сервере

С другой стороны, может быть ситуация, когда несколько менеджеров будут пользоваться статистикой. Сама же статистика их устраивает за предыдущий день. Тогда будет рационально предгенерировать файлы статистики. Выбираем наименее нагруженное для сервера время, добавляем в cron задачу (программу, которую мы написали) по генерации статических файлов отчётов. Ну и добавляем для них правило в nginx.

Это вариант предоставления информации до запроса (прогрев кеша). Также является примером масштабирования по времени.

Также может быть вам интересно:

Как поставить новый Wine 2 в Ubuntu / Linux Mint

В Ubuntu репозиториях лежат не самые свежие версии. А бывают нужны возможности из новых версий…

Читать »

10 хороших примеров работы в Linux, FreeBSD и прочих Unix. Часть 5 — длинные команды

Используйте эскейп-символы, чтобы управлять отображением длинных команд. Это пятая «хорошая привычка» из статьи «Learn 10 good UNIX usage habits» от IBM.

Читать »
Фото Как настроить отправку почты из Django

Как настроить отправку почты из Django

Письма об ошибках, отчёты на почту, восстановление паролей - всё это полезно при работе с сайтом. Django предоставляет удобный способ это сделать с минимумом настроек!

Фото Добавляем поддержку медиа-файлов в Django проект

Добавляем поддержку медиа-файлов в Django проект

Современные сайты редко ограничиваются только текстом и вёрсткой. Часто в заметках красуются фотографии, а рядом с описанием товаров - их изображения.

Фото Настройка журналирования (логирования) в Python с примерами

Настройка журналирования (логирования) в Python с примерами

Во время работы программы часто нужно сохранять некоторые важные записи о процессе выполнения команды. В Python есть довольно мощный модуль для работы с логами - давайте разберёмся с тем, как его использовать.

Фото Шаблон разработки ПО — Model View Controller (MVC)

Шаблон разработки ПО — Model View Controller (MVC)

MVC - один из самых распространённых архитектурных шаблонов разработки. Часто используется в различных фреймворках. В том числе и в Django.

Фото Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

В Django вы можете передавать данные в шаблоны посредством контекстов. Контекст передаётся из контроллера (view в терминах Django), однако, если одни и те же данные нужны в разных местах, лучше сделать свой контекст-процессор.

Фото Пример своей консольной команды в Django проекте

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать свои команды для управления проектом.

Фото Разграничение прав доступа на Django сайте

Разграничение прав доступа на Django сайте

Почти на любом веб-сайте необходимо разделять пользователей на группы и предоставлять им разные возможности. В Django есть довольно серьёзная система прав доступа для пользователей - давайте её рассмотрим!

Фото Пользователи и их создание в Django - своя регистрация на сайте

Пользователи и их создание в Django - своя регистрация на сайте

Если вашим сайтом должны активно пользоваться несколько человек, то полезно их различать, а значит - надо уметь создавать пользователей, либо предоставлять возможность регистрации Django пользователей.