ProxyError,尝试在代理后面查询普罗米修斯时
Posted
技术标签:
【中文标题】ProxyError,尝试在代理后面查询普罗米修斯时【英文标题】:ProxyError, when trying to query prometheus behind the proxy 【发布时间】:2021-12-11 07:06:45 【问题描述】:我正在编写一个模块,该模块需要查询 Prometheus 的功能,此时 Prometheus 位于代理后面并且模块正在从我的本地环境中进行查询。我的开发环境在虚拟机中,具有正确的环境变量和 DNS 设置,并且能够与代理后面的 Prometheus 进行通信,例如访问前端 GUI。
我已经测试了我的 requests.get() 方法,当它在代理后面的网络上执行并且它返回正确的值时,我非常肯定代理导致了问题,出于某种原因我没有让程序尊重我为请求提供的代理字典。我正在使用 Visual Studio Code 和 Python 3.9.7。
在执行这篇文章底部的代码时,我收到很多错误,其中最后一个是这个:(由于隐私原因,清除了一些值,例如代理服务器、url 和查询,它们在我的代码中是正确且就地的)
requests.exceptions.ProxyError: HTTPSConnectionPool(host='', port=443): Max retries exceeded with url: / (Caused by ProxyError('Cannot connect to proxy.', RemoteDisconnected('Remote end closed connection without response')))
相关Python代码:
import requests
import json
http_proxy = ''
https_proxy = ''
ftp_proxy = ''
proxies =
"http" : http_proxy,
"https" : https_proxy,
"ftp" : ftp_proxy
headers =
'Content-Type': 'application/json',
response = requests.get(url='' + '/api/v1/query', verify=False, headers=headers, proxies=proxies, params='query': '').text
j = json.loads(response)
print(j)
非常感谢任何帮助!
【问题讨论】:
【参考方案1】:对于 Python 请求(例如:#4871、#5000)缺少对 no_proxy
的支持存在一些错误。
目前 AFAICS 唯一的解决方案是在如下函数中编码缺失的逻辑:
import json
import requests
import tldextract
http_proxy = "http://PROXY_ADDR:PROXY_PORT"
https_proxy = "http://PROXY_ADDR:PROXY_PORT"
no_proxy = "example.net,.example.net,127.0.0.1,localhost"
def get_url(url, headers=, params=):
ext = tldextract.extract(url)
proxy_exceptions = [host for host in no_proxy.replace(' ', '').split(',')]
if (ext.domain in proxy_exceptions
or '.'.join([ext.subdomain, ext.domain, ext.suffix]) in proxy_exceptions
or '.'.join([ext.domain, ext.suffix]) in proxy_exceptions):
proxies =
else:
proxies =
"http" : http_proxy,
"https" : https_proxy,
response = requests.get(url=url,
verify=False,
headers=headers,
params=params,
proxies=proxies)
return response
url = "https://example.net/api/v1/query"
headers =
'Content-Type': 'application/json',
response = get_url(url, headers)
j = json.loads(response.text)
print(j)
【讨论】:
我的真实代码中有正确的代理服务器,但在本例中,出于隐私原因,我将它们删除了。抱歉,我会将其编辑为原始帖子。 好的 :) 我同时添加了一个更完整的答案。 非常感谢您的帮助!我仍然收到错误消息。在你建议的修改之后。我现在尝试使用 .env -variables,并从那里加载代理设置,但没有运气。我开始认为这与外部环境有关,而不是代码或代理本身...继续调查。 这很奇怪,no_proxy
选项似乎被忽略了...所以我看到的唯一选项是通过设置 proxies = None
来禁用本地地址的代理。
@marjakuusi 我的新答案包含一些代码来解决 Python 请求中缺少对 no_proxy
的支持的问题。以上是关于ProxyError,尝试在代理后面查询普罗米修斯时的主要内容,如果未能解决你的问题,请参考以下文章