HTTPSConnectionPool Максимальное количество попыток превышено

У меня есть работающее приложение django, работающее на nginx/uwsgi. Недавно мы начали использовать SSL для всех наших соединений. После перехода на SSL я часто получаю следующее сообщение:

HTTPSConnectionPool(host='foobar.com', port=443): 
    Max retries exceeded with url: /foo/bar

По сути, у меня есть браузер, взаимодействующий с кодом сервера django, который затем использует библиотеку запросов для вызова API. Это соединение с API, которое генерирует ошибку. Кроме того, я переместил все наши запросы в один сеанс (то есть сеанс запросов), но это не помогло.

Я увеличил количество слушателей uwsgi, так как думал, что это может быть проблемой, но наша нагрузка не так высока. Кроме того, у нас никогда не было этой проблемы до SSL. Есть ли у кого-нибудь совет, как решить эту проблему?

Изменить

Фрагмент кода того, как я вызываю API. Я опубликовал его (в основном) дословно. Обратите внимание, что это не код, который на самом деле терпит неудачу, а библиотека запросов, которая выдает исключение при вызове self.session.post

def save_answer(self):
    logger.info("Saving answer to question")
    url = "%s1.0/exam/learneranswer/" % self.api_url
    response = {'success': False}

    data = {'questionorder': self.request.POST.get('questionorder'),
            'paper': self.request.POST.get('paper')}
    data['answer'] = ",".join(self.request.POST.getlist('answer'))
    r = self.session.post(url, data=simplejson.dumps(data))
    if r.status_code == 201:
        logger.info("Answer saved successfully")
        response['success'] = True
    elif r.status_code == 400:
        if r.text == "Paper expired":
            logger.warning("Timer has expired")
            response['message'] = 'Your time has run out'
        if r.text == "Question locked":
            response['message'] = \
                'This question is locked and cannot be answered anymore'
        else:
            logger.error("Unknown error")
            self.log_error(r, "Unknown Error while saving answer")
    else:
        logger.error("Internal error")
        self.log_error(r, "Internal error in api while saving answer")
    return simplejson.dumps(response)

person Gevious    schedule 26.04.2013    source источник
comment
Покажите нам код ваших запросов и конфигурацию nginx. На самом деле, вы можете попробовать настроить статический HTML и указать на него nginx, использовать запросы для его отображения, чтобы убедиться, что это как-то связано с nginx, а не с django.   -  person CppLearner    schedule 26.04.2013
comment
Проблема не локализована в определенной области кода. Бывает на разных порциях. В основном в одном разделе, потому что он наиболее часто используется, но иногда и в других разделах. Я обновил свой вопрос, включив в него фрагмент кода.   -  person Gevious    schedule 26.04.2013
comment
Действительно ли запрос был направлен на просмотры? Он прошел через nginx? Передал ли nginx запрос экземпляру Django? URL работает? Для меня это важные вопросы. Эта ошибка может вводить в заблуждение и на самом деле не может объяснить причину сбоя. Кроме того, в третьей строке url = "1.0/exam/learneranswer/" % self.api_url у вас должен быть заполнитель в строке, не так ли?   -  person CppLearner    schedule 26.04.2013
comment
Я исправил заполнитель. Как я уже говорил, код в основном работает. Я считаю, что это терпит неудачу в 2% случаев, и я не уверен, когда и почему. Я также не уверен, проходит ли неудачный запрос через nginx. Я проверю журналы серверов, чтобы увидеть, не найду ли я что-нибудь, соответствующее ошибке.   -  person Gevious    schedule 26.04.2013
comment
Какую версию запросов вы используете? Если не 1.2.0, пожалуйста, обновите?   -  person Ian Stapleton Cordasco    schedule 26.04.2013
comment
спасибо сигмавирус24. Я обновил и буду развертывать этот avi и посмотреть, будет ли это иметь значение.   -  person Gevious    schedule 27.04.2013


Ответы (3)


Я обнаружил, что эта ошибка возникает, когда какой-либо элемент в одном из моих представлений вызывает исключение. Например, при использовании фреймворка django 'requests' для отправки данных на другой URL:

r = requests.post(url, data=json.dumps(payload), headers=headers, timeout=5)

На нисходящем сервере были проблемы с подключением, что вызвало исключение, которое всплыло и дало мне ошибку, которую вы указали выше. Я заменил на это:

try:
    r = requests.post(url, data=json.dumps(payload), headers=headers, timeout=5)
except requests.exceptions.ConnectionError as e:
    r = "No response"

И это исправило это (конечно, я бы предложил добавить больше обработки ошибок, но приведенное выше является соответствующим подмножеством).

person JayCrossler    schedule 11.07.2014

Вы должны отключить проверку, как это

requests.get('https://google.com', verify=False)

Вы должны указать свой ЦС.

person Haydar Dehghan    schedule 08.07.2019
comment
Ошибка в вопросе не описывает ошибку проверки сертификата, и рекомендовать verify=False без каких-либо других ограничений опасно, поскольку это позволяет злоумышленнику MITM маскироваться под удаленный сервер. - person Tim Smith; 06.04.2021
comment
это отлично сработало для моего локального тестирования - person Ramesh; 14.04.2021

Эта ошибка возникает из-за того, что скрипт Python пытается подключиться к службе IBM даже до того, как будет установлено подключение к Wi-Fi или Ethernet. Попробуйте исправить ошибку, или, если вы пытаетесь запустить службу, запустите службу после того, как сеть будет установлена.

person Veer Ganesh    schedule 21.01.2020