4

Nginx反向代理OpenAI API

 1 year ago
source link: https://www.wyr.me/post/743
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在本教程中,我们将介绍如何使用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系统,请按照以下步骤操作:

  1. 使用文本编辑器打开 /etc/apt/sources.list 并在底部添加以下内容:

    deb http://nginx.org/packages/mainline/debian/ stretch nginx
    
  2. 导入软件源的签名密钥,并将其添加到apt:

    sudo wget http://nginx.org/keys/nginx_signing.key
    sudo apt-key add nginx_signing.key
    
  3. 安装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_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_certificatessl_certificate_key:分别指定SSL证书和私钥的路径。

  • ssl_ciphersssl_protocols:定义支持的加密套件和SSL/TLS协议。

  • ssl_prefer_server_ciphers on;:表示服务器优先选择的加密套件。

  • ssl_session_cachessl_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_nameproxy_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:测试反向代理

接下来,您可以使用以下方法测试反向代理:

  1. 首先设置环境变量:

    export OPENAI_API_KEY=sk-xxxxx
    export OPENAI_API_ORG=org-xxxx
    
  2. 测试模型列表:

    curl https://example.com/v1/models \
      -H "Authorization: Bearer $OPENAI_API_KEY" \
      -H "OpenAI-Organization: $OPENAI_API_ORG"
    
  3. 测试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)类型响应的流畅输出,从而提供良好的用户体验。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK