Выполнение запроса POST для внешнего URL-адреса с помощью установки django + gunicorn + nginx

Я отправляю почтовый запрос из метода внутри веб-приложения, работающего на django + nginx + gunicorn. У меня нет проблем, получающих 200 ответов от того же кода при выполнении на собственном сервере django (с использованием сервера-сервера).

try:
    response = requests.post(post_url, data=some_data)
    if response.status_code == OK and response.content == '':
        logger.info("Request successful")
    else:
        logger.info("Request failed with response({}): {}".format(response.status_code, response.content))
        return response.status_code == OK and response.content == ''
except requests.RequestException as e:
    logger.info("Request failed with exception: {}".format(e.message))
    return False

Я проверил журналы сервера в post_url, он действительно возвращает 200 ответов с этими данными. Однако, когда я запускаю приложение за оружием и nginx, я не могу получить ответ (однако запрос отправляется). Код застревает в первой строке после блока try, а рабочий-произвол истекает (через 30 секунд).

Это журнал сервера apache в post_url:

[14/Sep/2016:13:19:20 +0000] "POST POST_URL_PATH HTTP/1.0" 200 295 "-" "python-requests/2.9.1"

ОБНОВЛЕНИЕ:

Я забыл упомянуть, этот запрос занимает менее секунды для выполнения, поэтому это не проблема с таймаутом. Что-то не так с конфигурацией? У меня есть стандартная установка nginx + gunicorn, где gunicorn установлен как proxy_pass в nginx. Я предполагаю, что, поскольку я занимаюсь прокси-сервером nginx, должен ли я делать что-то другое при отправке почтового запроса из приложения?

Ответ 1

В настройках моего пушки, установка workers=2 решила эту проблему.

Когда я отправлял запрос на внешний URL-адрес, внешнее приложение отправляет запрос обратно. Этот новый запрос занял бы одного и единственного работника в приложении. Исходный запрос, который я отправил, является безработным, и поэтому он застревает. С двумя рабочими я могу одновременно отправить запрос и получить еще один запрос.

Ответ 2

У вас могут быть проблемы с Nginx, где проблема может быть nginx request entity too large. Если вы отправляете слишком большие данные на сервер, Nginx может отклонить запрос. У нас были проблемы с проблемой Nginx, когда мы пытались загрузить слишком большое изображение. Мы также используем nginx + gunicorn с django. Поэтому я подозреваю. это может быть одна и та же проблема.

Ответ 3

Это проблема тайм-аута для пушки. Вы можете увеличить тайм-аут увольнителя, указав дополнительный флаг --timeout 60 в команде, которую вы используете, чтобы выполнить gunicorn. Конечно, вы можете настроить длину таймаута в зависимости от ваших потребностей. Аргумент в секундах.