- 更新:2023-06-05 10:16:11
- 首发:2023-04-30 11:59:48
- 教程
- 8168
在本教程中,我们将介绍如何使用Nginx反向代理访问OpenAI API,并提供相应的测试方法。主要目标是保证Server-sent events (SSE)类型响应的流畅输出,从而提供良好的用户体验。
步骤1:安装最新版Nginx
首先,我们需要安装最新版的Nginx。在Ubuntu上,可以使用以下命令安装:
echo "deb http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
curl -o /tmp/nginx_signing.key https://nginx.org/keys/nginx_signing.key
sudo mv /tmp/nginx_signing.key /etc/apt/trusted.gpg.d/nginx_signing.asc
sudo apt update
sudo apt install nginx
对于使用的Debian系统,请按照以下步骤操作:
使用文本编辑器打开
/etc/apt/sources.list
并在底部添加以下内容:deb http://nginx.org/packages/mainline/debian/ stretch nginx
导入软件源的签名密钥,并将其添加到apt:
sudo wget http://nginx.org/keys/nginx_signing.key sudo apt-key add nginx_signing.key
安装Nginx:
sudo apt update sudo apt install nginx
在安装完成后,可以使用以下命令启动并设置Nginx服务为开机自启:
sudo systemctl enable nginx --now
步骤2:配置Nginx
接下来,我们配置Nginx来反向代理OpenAI API。在Nginx的配置文件(/etc/nginx/conf.d/openai.conf
)中添加以下内容:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
ssl_certificate /home/azureuser/.acme.sh/example.com_ecc/fullchain.cer;
ssl_certificate_key /home/azureuser/.acme.sh/example.com_ecc/example.com.key;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
charset utf-8;
location / {
proxy_pass https://api.openai.com;
proxy_ssl_name api.openai.com;
proxy_ssl_server_name on;
proxy_set_header Host api.openai.com;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
chunked_transfer_encoding off;
proxy_set_header X-Real-IP [your_us_server_ip];
proxy_read_timeout 3600;
proxy_buffering off;
proxy_cache off;
proxy_redirect off;
proxy_hide_header Cache-Control;
}
location /v2 {
return 404;
}
}
listen 443 ssl http2;
和listen [::]:443 ssl http2;
:监听IPv4和IPv6的443端口,启用SSL和HTTP/2。server_name example.com;
:指定服务器名称,将其更改为您的实际域名。ssl_certificate
和ssl_certificate_key
:分别指定SSL证书和私钥的路径。ssl_ciphers
和ssl_protocols
:定义支持的加密套件和SSL/TLS协议。ssl_prefer_server_ciphers on;
:表示服务器优先选择的加密套件。ssl_session_cache
和ssl_session_timeout
:配置SSL会话缓存和超时时间。add_header Strict-Transport-Security "max-age=31536000";
:添加HSTS头,要求浏览器在给定的时间内(这里是1年)只使用HTTPS访问服务器。charset utf-8;
:设置字符集为UTF-8。location / {...}
:定义一个location块,用于处理根路径的请求。proxy_pass https://api.openai.com;
:将请求代理到OpenAI API。proxy_ssl_name
和proxy_ssl_server_name on;
:设置与后端服务器建立SSL连接的相关参数。proxy_set_header
:设置传递给后端服务器的请求头。chunked_transfer_encoding off;
:禁用分块传输编码,以确保SSE消息不会被切割。proxy_set_header X-Real-IP [your_us_server_ip];
:设置实际客户端IP地址,将[your_us_server_ip]
替换为您的美国服务器IP地址。proxy_buffering off;
和proxy_cache off;
:禁用缓冲和缓存,以确保实时消息能够及时传递给客户端。proxy_redirect off;
:禁用代理重定向,确保服务器响应不会因重定向而更改。location /v2 {...}
:定义另一个location块,用于处理以/v2
开头的请求。return 404;
:针对这些请求,直接返回404状态码表示未找到资源。
在本Nginx配置中,重点是确保对OpenAI API的请求能够流畅地通过反向代理。这包括正确地转发请求,处理响应以及针对SSE的特殊处理(使用stream参数请求API时流程稳定的打字机效果,相关博文:《对接ChatGPT3.5/4的API实现打字机效果》)。
请将配置中的example.com
替换为您实际使用的域名,并将[your_us_server_ip]
替换为您的美国服务器IP地址。如果使用Azure OpenAI接口,只需要替换api.openai.com
为你的Azure OpenAI Endpoint
的Host。
在nginx.conf
中,添加以下配置:
client_max_body_size 1000M;
client_body_buffer_size 1024M;
keepalive_timeout 3600;
解释:
client_max_body_size
设置允许客户端请求的最大单个文件体积。client_body_buffer_size
设置客户端请求体缓冲区大小。keepalive_timeout
设置长连接超时时间。
步骤3:测试反向代理
接下来,您可以使用以下方法测试反向代理:
首先设置环境变量:
export OPENAI_API_KEY=sk-xxxxx export OPENAI_API_ORG=org-xxxx
测试模型列表:
curl https://example.com/v1/models \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -H "OpenAI-Organization: $OPENAI_API_ORG"
测试ChatGPT生成文本:
curl https://example.com/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -d '{ "model": "gpt-4", "messages": [{"role": "user", "content": "Hello!"}] }'
通过以上方法,您可以测试和验证Nginx反向代理配置是否正确。本教程向您展示了如何使用Nginx反向代理访问OpenAI API,并提供了相应的测试方法。主要目标是保证Server-sent events (SSE)类型响应的流畅输出,从而提供良好的用户体验。
暂无内容
老师你好,我希望能用一个openwrt路由器实现IPv4和IPv6的桥接,请问我该如何实现?我尝试了直接新增dhcpv6的接口,但是效果不甚理想(无法成功获取公网的ipv6,但是直连上级路由的其他设备是可以获取公网的ipv6地)
![%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE20241205230845.png](https://cdn.wyr.me/visitor-files/2024-12-05/1733411344287屏幕截图 2024-12-05 230845.png)你好
,为什么我这里是0039 813C 0600 0075 16xx xx xx,只有前6组是相同的,博客中要前8位相同,这个不同能不能照着修改呢?我系统版本是Win1124H2
大神你好,win11专业版24h2最新版26100.2033,文件如何修改?谢谢
win11专业版24h2最新版26100.2033,Windows Feature Experience Pack 1000.26100.23.0。C:\Windows\System32\termsrv.dll系统自带的这个文件,39 81 3C 06 00 00 0F 85 XX XX XX XX 替换为 B8 00 01 00 00 89 81 38 06 00 00 90。仍然无法远程连接。原来是win11 21h2系统,是可以远程链接的。共享1个主机,2个显示器,2套键鼠,各自独立操作 各自不同的账号,不同的桌面环境。
博主,win11专业版24h2最新版,C:\Windows\System32\termsrv.dll系统自带的这个文件,找不到应该修改哪个字段。我的微信:一三五73二五九五00,谢谢