【问题标题】:HTTPSConnectionPool Max retries exceededHTTPSConnectionPool 超过最大重试次数
【发布时间】:2013-04-26 07:21:17
【问题描述】:

我有一个在 nginx/uwsgi 上运行的 django 应用程序。我们最近开始对所有连接使用 SSL。自从迁移到 SSL 后,我经常收到以下消息:

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

基本上发生的事情是我让浏览器与 django 服务器代码通信,然后使用 requests 库调用 api。它与生成错误的 api 的连接。此外,我已将所有请求移至一个会话(即请求会话)中,但这并没有帮助。

我增加了 uwsgi 侦听器的数量,因为我认为这可能是问题所在,但我们的负载并没有那么高。此外,在 SSL 之前我们从未遇到过这个问题。有人对如何解决这个问题有一些建议吗?

编辑

我如何调用 API 的代码 sn-p。我已经(大部分)逐字发布。注意它不是实际失败的代码,而是调用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)

【问题讨论】:

  • 向我们展示您的请求代码和 nginx 配置。实际上,您可以尝试设置一个静态 html 并让 nginx 指向它,使用请求显示它以验证这是与 nginx 相关,而不是 django。
  • 问题未局限于特定的代码区域。它发生在各个部分。主要在一个部分中,因为它是最常用的,但有时也在其他部分中。我已经更新了我的问题以包含一个 sn-p 代码。
  • 请求实际上是对视图提出的吗?它通过nginx吗? nginx 是否将请求交给了 Django 实例?网址有效吗?对我来说,这些都是要问的重要问题。该错误可能具有误导性,并且实际上可能无法提供失败的原因。另外,第三行url = "1.0/exam/learneranswer/" % self.api_url 你应该在字符串中有一个占位符不是吗?
  • 我修复了占位符。正如我所提到的,代码主要工作。我发现它有 2% 的时间失败了,我不确定何时或为什么。我也不确定失败的请求是否通过 nginx。我会检查服务器日志,看看是否找到与错误对应的内容。
  • 您使用的是什么版本的请求?如果不是1.2.0,请升级?

标签: ssl python-requests


【解决方案1】:

我发现当我的一个视图中的某些项目引发异常时会发生此错误。例如,当使用 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"

并且修复了它(当然,我建议添加更多错误处理,但以上是相关的子集)。

【讨论】:

    【解决方案2】:

    您必须像这样禁用验证

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

    您应该指定您的 CA。

    【讨论】:

    • 问题中的错误没有描述证书验证错误,并且在没有任何其他限制的情况下推荐verify=False 是危险的,因为它允许MITM 攻击者伪装成远程服务器。
    【解决方案3】:

    此错误是由于 python 脚本在您的 wifi 或以太网连接建立之前尝试连接到 IBM 服务而发生的。尝试/catch 进行纠正,或者如果尝试作为服务运行,则在网络建立后运行服务。

    【讨论】:

      猜你喜欢
      • 2014-08-16
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      相关资源
      最近更新 更多