modelscope中,线上服务报错怎么处理?

"requests.exceptions.SSLError: HTTPSConnectionPool(host='dashscope.aliyuncs.com', port=443): Max retries exceeded with url: /api/v1/services/aigc/text-generation/generation (Caused by SSLError(SSLZeroReturnError(6, 'TLS/SSL connection has been closed (EOF) (_ssl.c:1129)')))
modelscope中,线上服务报错怎么处理?"

展开
收起
小小爱吃香菜 2024-03-19 16:19:28 821 分享 版权
阿里云 AI 助理回答

根据您提供的错误信息 requests.exceptions.SSLError: HTTPSConnectionPool,以及结合知识库中的相关资料,以下是针对该问题的详细分析和解决方案:


问题分析

  1. 错误描述
    错误提示表明在尝试通过 HTTPS 访问 dashscope.aliyuncs.com 时,SSL/TLS 握手失败,导致连接被关闭。具体表现为:

    • Max retries exceeded:请求重试多次后仍然失败。
    • SSLZeroReturnError:TLS/SSL 连接被意外关闭。
  2. 可能原因
    根据知识库内容,以下几种情况可能导致此问题:

    • 证书验证失败:客户端无法验证服务器返回的 SSL/TLS 证书。
    • SNI 配置问题:如果使用了 IP 地址直接访问 HTTPS 服务,可能会导致 SNI(Server Name Indication)扩展未正确传递域名信息,从而无法匹配正确的证书。
    • 网络环境限制:某些网络环境(如 VPC 内部或代理环境)可能对 HTTPS 请求进行了限制。
    • 服务端问题:目标服务可能存在临时性故障或配置错误。

解决方案

1. 检查证书验证问题

  • 原因:默认情况下,requests 库会验证服务器的 SSL/TLS 证书。如果证书链不完整或证书无效,会导致握手失败。
  • 解决方法

    • 确保您的 Python 环境中安装了最新的根证书包(如 certifi)。
    • 如果确认目标服务的证书可信,可以临时禁用证书验证(仅用于调试):

      import requests
      
      response = requests.get(
         "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation",
         verify=False  # 禁用证书验证
      )
      print(response.text)
      

      注意:生产环境中不建议禁用证书验证,应确保使用有效的证书。

2. 解决 SNI 配置问题

  • 原因:如果通过 IP 地址直接访问 HTTPS 服务,可能会导致 SNI 扩展未正确传递域名信息,从而无法匹配正确的证书。
  • 解决方法

    • 使用自定义的 HostHeaderSSLAdapter 来确保在请求中正确传递 Host 头部信息。参考知识库中的代码示例:

      import requests
      from urllib.parse import urlparse
      
      class HostHeaderSSLAdapter(requests.adapters.HTTPAdapter):
         def __init__(self, resolved_ip):
             super().__init__()
             self.resolved_ip = resolved_ip
      
         def send(self, request, **kwargs):
             connection_pool_kwargs = self.poolmanager.connection_pool_kw
             result = urlparse(request.url)
      
             if result.scheme == 'https' and self.resolved_ip:
                 request.url = request.url.replace(
                     'https://' + result.hostname,
                     'https://' + self.resolved_ip,
                 )
                 connection_pool_kwargs['server_hostname'] = result.hostname
                 request.headers['Host'] = result.hostname
             else:
                 connection_pool_kwargs.pop('server_hostname', None)
      
             return super().send(request, **kwargs)
      
      def access_url(url, resolved_ip):
         session = requests.Session()
         parsed_url = urlparse(url)
         hostname = parsed_url.hostname
      
         session.mount('https://' + hostname, HostHeaderSSLAdapter(resolved_ip))
         try:
             r = session.get(url)
             print("success" + ", resp: " + r.text)
         except Exception as e:
             print("err: " + str(e))
      
      if __name__ == "__main__":
         access_url("https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation", "47.116.XX.XX")
      

3. 检查网络环境

  • 原因:某些网络环境(如 VPC 或代理)可能会对 HTTPS 请求进行限制。
  • 解决方法
    • 确保您的网络环境允许访问 dashscope.aliyuncs.com 的 443 端口。
    • 如果使用了代理,请检查代理配置是否正确。
    • 在 Linux 云服务器上测试时,确保防火墙规则未阻止 HTTPS 流量。

4. 检查服务端状态

  • 原因:目标服务可能存在临时性故障或配置错误。
  • 解决方法
    • 联系阿里云技术支持,确认 dashscope.aliyuncs.com 服务是否正常运行。
    • 检查 API 文档,确保请求的 URL 和参数符合要求。

重要提醒

  • 安全性:在生产环境中,务必启用证书验证以确保通信安全。
  • SNI 支持:如果必须通过 IP 地址访问 HTTPS 服务,请确保正确配置 SNI 扩展。
  • 调试工具:可以使用 curlopenssl 工具手动测试 HTTPS 连接,排查问题根源:
    openssl s_client -connect dashscope.aliyuncs.com:443 -servername dashscope.aliyuncs.com
    

总结

通过上述步骤,您可以逐步排查并解决 requests.exceptions.SSLError 问题。如果问题仍未解决,请提供更详细的错误日志或上下文信息,以便进一步分析。您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!欢迎加入技术交流群:微信公众号:魔搭ModelScope社区,钉钉群号:44837352

还有其他疑问?
咨询AI助理