我有一个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)
我发现当我的一个视图中的某些项抛出异常时,会发生此错误。例如,当使用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"
并修复了它(当然,我建议添加更多的错误处理,但以上是相关的子集)。
必须像这样禁用验证
requests.get('https://google.com', verify=False)
您应该指定您的CA
此错误是由于python脚本试图在wifi或以太网连接建立之前连接到IBM服务而发生的。有一个try/catch来纠正,或者如果试图运行服务,那么在网络建立后运行服务。