`504 Gateway Time-out` при отправке писем с Djoser и Django в продакшене
Я столкнулся с проблемой в своей производственной среде Django при использовании Djoser для регистрации пользователей и управления логинами. Когда пользователь запрашивает создание учетной записи, API занимает около минуты, а затем возвращает ошибку 504 Gateway Time-out
. В моей локальной среде процесс работает корректно, и письмо с активацией отправляется без проблем.
Что я пробовал:
Увеличение опций таймаута в Nginx. (без эффекта)
server { listen ${LISTEN_PORT}; location /static { alias /vol/web/static; } location / { uwsgi_pass ${APP_HOST}:${APP_PORT}; include /etc/nginx/uwsgi_params; client_max_body_size 10M; # new code uwsgi_read_timeout 120; proxy_read_timeout 300s; proxy_connect_timeout 300s; proxy_send_timeout 300s; } }
Добавлены логи в функцию отправки электронной почты, и функция, похоже, вызывается правильно.
class ActivationEmail(email.ActivationEmail): template_name = "user/email/activation.html" def send(self, to, *args, **kwargs): print(f"Sending activation mail to {to}") try: super().send(to, *args, **kwargs) except: print(f"Couldn't send mail to {to}") raise print(f"Activation mail sent successfully to {to}")
Я также проверил переменные окружения, чтобы убедиться, что они соответствуют локальной и производственной средам. Конфигурация электронной почты одинакова как в локальной, так и в производственной среде. Однако в производственной среде письмо не попадает в папку входящих сообщений, и ошибка 504 сохраняется.
Я думаю, что ошибка исходит от nginx, поскольку локально у меня нет конфигурации nginx. Это основное различие между двумя средами. Изменения, которые я сделал в опциях таймаута в nginx, не дали никакого эффекта, так как API всегда ждет одну минуту, чтобы ответить с ошибкой таймаута.
Вопрос:
Что может быть причиной ошибки 504 при отправке электронной почты в производстве? Есть ли дополнительные конфигурации, которые я должен проверить в Nginx или в настройках электронной почты? Как я могу диагностировать и решить эту проблему?