不要直接在国内访问 OpenAI API,可能会 导致封号,需要配置代理,本文介绍 Nginx 代理。
前置项
首先你得有一台美国的云主机,之前腾讯云洛杉矶的可用,但今年2月初被封了,估计是 OpenAI 知道是腾讯网段(确实通过 IP 能反查运营商),这里推荐 Linode,美国云服务商。
1. Nginx 反向代理配置
以下为 Nginx 配置。
location /gpt/ {
proxy_pass https://api.openai.com/;
proxy_ssl_server_name on;
proxy_set_header Host api.openai.com;
proxy_buffering off;
proxy_send_timeout 600s;
proxy_cache off;
chunked_transfer_encoding on;
}
这段 Nginx 配置定义了如何处理对 /gpt/
路径的请求。下面是各部分的解读:
-
location /gpt/
:这一行指定了一个位置块,用于匹配所有以/gpt/
开头的请求。这意味着任何以/gpt/
开头的请求都会被这个块内的指令处理。 -
proxy_pass https://api.openai.com/;
:这一行告诉 Nginx 将所有匹配的请求转发(代理)到https://api.openai.com/
。这意味着,如果有人请求你的服务器的/gpt/something
,Nginx 会代理这个请求到https://api.openai.com/something
。 -
proxy_ssl_server_name on;
:这个指令启用了 SSL/TLS 的服务器名称指示(SNI)支持。SNI 允许服务器在使用相同的 IP 地址和端口的情况下托管多个 SSL/TLS 网站。开启这个选项意味着在与api.openai.com
建立 SSL/TLS 连接时,Nginx 会在 TLS 握手过程中传递正确的服务器名称。 -
proxy_set_header Host api.openai.com;
:这一行设置了一个请求头,将Host
头部的值改为api.openai.com
。这对于被代理的服务器正确处理请求是必要的,尤其是当目标服务器托管多个域时。这确保了请求会被视为针对api.openai.com
,即使原始请求是发往你的服务器的。 -
proxy_buffering off;
:这个指令禁用了代理缓冲。默认情况下,Nginx 会缓冲对代理服务器的响应,直到收到完整的响应后再将其发送给客户端。关闭代理缓冲可以减少延迟,对于实时数据流或长时间运行的连接特别有用。 -
proxy_send_timeout 600s;
:这一行设置了代理发送超时时间为 600 秒(10分钟)。这意呸着如果 Nginx 尝试将请求数据发送给代理服务器(在这个例子中是api.openai.com
)时,如果超过了 600 秒还没有成功,连接将被关闭。 -
proxy_cache off;
-
作用:这个指令用于控制 Nginx 的代理缓存行为。当设置为
off
时,它告诉 Nginx 对当前位置块内的请求不使用缓存。这意味着对于每个请求,Nginx 都会直接转发到上游服务器(在这个场景中是https://api.openai.com/
),而不尝试从本地缓存中查找可能存在的响应。 -
场景:在实时或动态内容的代理中,禁用缓存是常见的做法,因为你希望用户获取到最新的数据,而不是过时的缓存数据。对于与 OpenAI API 通信这样的应用场景,实时性非常关键,因此禁用缓存是合理的选择。
-
-
chunked_transfer_encoding on;
-
作用:这个指令控制了 Nginx 是否使用分块传输编码(Chunked Transfer Encoding)发送响应。当设置为
on
时,即使服务器在开始发送响应之前不知道整个响应的大小,也可以开始传输响应。服务器会将响应分成一系列的块(chunks)依次发送,每个块前都会标明其大小,直到一个特殊的零长度块表示响应结束。 -
场景:分块传输编码在发送大量数据或者数据长度未知时非常有用,例如:流媒体、实时数据传输等。它允许客户端开始处理接收到的数据块,而不需要等待所有数据都被发送完毕。在代理配置中启用这个选项可以增加灵活性,尤其是对于动态生成的内容或者实时数据流。
-
总的来说,这段配置使得任何发送到你的服务器上 /gpt/
路径的请求都会被转发到 OpenAI 的 API 服务器上,同时确保了正确的 SSL/TLS 设置和头部信息,以便请求能够正确处理,并且有一些针对性能和超时的优化。
最后三个参数是实现代理 OpenAI API 时实现打字机效果
2. 测试
直接在国内访问 Linode 服务器提供的 Nginx 服务,验证请求是否成功
curl https://<your_domain>/gpt/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer <your_openai_secret_key>" -d '{ "model": "gpt-3.5-turbo","messages": [{"role": "user", "content": "如何显示Python的版本"}],"temperature": 0.7}'
接下来,可以在你的 GPT 应用中输入代理 URL,比如 Dify
作图测试,效果还不错。
看看原图。