随着政策的调整,Dify 在国内无法直接访问 AWS 的 Bedrock 服务及其 Claude 模型。此情况下,Dify 面临一个迫切的问题:如何在不采取迁移数据中心等方式的前提下,确保对 Claude 模型的正常调用。这将影响到 Dify 提供服务的稳定性和用户体验,因此需要寻找切实可行的解决方案。
在全面分析后,提出以下两个主要方案:
Dify 迁移至海外地区
优点:通过代理服务器将请求转发至 AWS 服务,速度和响应时间更容易控制。此方式能够保留 Dify 现有架构,使用起来更为灵活。
缺点:需要额外配置代理服务以及处理相关的 SSL/TLS 问题。
Dify 使用代理模式
优点:理论上直接使用 AWS 服务,避免任何网络连接层面的干扰。
缺点:由于 Dify 已经集成了其他模型与服务,迁移到海外不仅会增加额外的复杂性,也可能引起整体访问速度的显著下降,影响用户体验。
选择方案2
补充原因:选择使用代理模式主要基于以下几点考虑:
影响最小:不影响dify上面其它模型的使用,用户访问dify也会更流畅些。
实现成本:相较于迁移,配置和维护代理的成本更低,更易于快速实施。
实现代理功能目前可选的有以下2种:
初步考虑使用 Squid 作为正向代理,但Dify未找到适合的配置入口来指定代理地址,因此实际上未能成功实施。
使用 Nginx 进行反向代理。Nginx 的反向代理具有高性能、灵活性和稳定性,仅需 Dify 更新 hosts 文件以绑定代理 IP 即可实现对 Claude 模型的访问,避免了端用户的复杂配置。
因此最终选择nginx反向代理来解决
获取 Claude 的访问地址
Claude 模型的访问地址可从 AWS 官方文档中获取,确保使用的是最新的服务地址。这些地址包括:
在实施 Nginx 反向代理时,要特别关注 HTTPS 的访问问题。由于 Claude 的接口为 HTTPS,必须处理 SSL/TLS 相关的问题。
主要涉及以下步骤:
使用stream模式,因为我们没有claude的ssl证书,使用http模式无法处理证书加解密
配置 ssl_preread 模块,在接收 SSL/TLS 请求时读取 SNI 信息,这样能根据域名来实现反向代理到不同的claude endpoint
upstream 通过变量的方式动态配置,配合resolver 来实现dns动态解析
参考配置如下:
因为dify是通过docker compose 部署的,因此需要修改docker-compose.yml
找到api,worker服务的部分,添加hosts配置
重启服务
扫码关注 了解更多