Плохой шлюз Django 502 вызывает многократную отправку почты - PullRequest
0 голосов
/ 01 февраля 2019

У меня запущено приложение Django с uwsgi, обслуживаемое nginx.Тот же самый env, который я использую для многих приложений (https://github.com/abidibo/cookiecutter-django). У меня есть Postfix, настроенный на получение на localhost, и Django, настроенный на отправку электронной почты через него.

У меня есть представление, которое при получении запроса POST создаетнекоторые файлы и отправляет электронную почту.

То, что произошло после обработки запроса POST, сервер вернул 502 страницы, и было отправлено несколько сообщений электронной почты (почти 60 сообщений электронной почты).Это случается каждый раз, только несколько, и я не могу воспроизвести ошибку в моем локальном окружении.

Я не могу понять, что случилось, я имею в виду, произошел ли какой-то тайм-аут между Django и uwsgi или postfixсам, тогда зачем отправлять все это электронное письмо, почему код был выполнен несколько раз?

В журналах приложений я вижу, что рабочий умер:

- *** HARAKIRI ON WORKER 4 (pid: 8836, try: 1) ***
- HARAKIRI !!! worker 4 status !!!
- HARAKIRI [core 7] 188.92.61.228 - POST /xxx/xxx/xxx/4/ since 1549027535
- HARAKIRI !!! end of worker 4 status !!!
DAMN ! worker 4 (pid: 8836) died, killed by signal 9 :( trying respawn ...
Respawned uWSGI worker 4 (new pid: 21942)

В журнале ошибок nginxЯ вижу:

 [error] 2565#2565: *19983 upstream prematurely closed connection while reading response header from upstream, client: xx.xx.xx.xx, server: xxx.xxx.com, request: "POST /xxx/xxx/xx/4/ HTTP/1.1", upstream: "uwsgi://unix:/tmp/uwsgi_xxx.sock:", host: "xxx.xxx.com", referrer: "http://xxx.xxx.com/xxx/xxx/xx/4/"

Обновление

Это выдержка из функции просмотра сообщений

def post(self, request, pk):
# stuff...
    try:
    # stuff...
        if request.POST.get('send_mail', False) and request.POST.get(
                'destinatari', ''):
            send_invoice_mail(fattura, [
                e.strip()
                for e in request.POST.get('destinatari', '').split(',')
            ])

        messages.add_message(
            request, messages.SUCCESS,
            'Nota di Credito cliente generata con successo')
        messages.add_message(
            request, messages.SUCCESS,
            'La nota di credito è stata correttamente inserita in prima nota'
        )
        if request.POST.get('send_mail', False):
            messages.add_message(request, messages.SUCCESS,
                                 'E-mail correttamente inviata')

        return redirect('/admin/fatture/notacreditouscitacliente/')

    except Exception as e:
        # stuff...
        messages.add_message(request, messages.WARNING, str(e))
        return redirect(
            '/admin/fatture/notacreditoentratafornitoreprodotti')

Как я могу отладить это?

...