利用Nginx反向代理来访问CloseAI API服务

准备工作

  1. 一台能够被国内访问的服务器,同时这个服务器能够访问OPENAI的API。
  2. 安装Nginx

Nginx配置

配置Nginx,利用反向代理功能,实现使用我们自己的域名来访问 OPENAI 的API。配置如下:
添加一个server块:

server
    {
        listen 8001;
        server_name srv.chatgpt ;
        index index.html;
        root  /www/srv1.chatgpt;

        location / {
            proxy_pass  https://api.openai.com/;
            proxy_ssl_server_name on;
            proxy_set_header Host api.openai.com;
            proxy_set_header Connection '';
            proxy_http_version 1.1;
            chunked_transfer_encoding off;
            proxy_buffering off;
            proxy_cache off;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

现在我们修改我们的电脑hosts文件,将srv.chatgpt域名指向我们的服务器ip.

127.0.0.1 srv.chatgpt

访问我们的server测试是否能够成功访问:

curl http://srv1.chatgpt:8001
{
    "message": "Welcome to the OpenAI API! Documentation is available at https://platform.openai.com/docs/api-reference"
}

这里可以看到和我们直接请求https://api.openai.com/的结果是完全一样的。我们再实际请求接口尝试一下返回结果:

curl  http://srv.chatgpt:8001/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-my-token" \
  -d '{
    "model": "gpt-3.5-turbo",
    "messages": [
      {
        "role": "system",
        "content": "You are a helpful assistant."
      },
      {
        "role": "user",
        "content": "Hello!"
      }
    ]
  }'


{
    "error": {
        "message": "Your account is not active, please check your billing details on our website.",
        "type": "billing_not_active",
        "param": null,
        "code": "billing_not_active"
    }
}

可以看到接口请求成功,但我的账号木有钱了,至此,我们就可以通过访问我们自己的域名来请求OPENAI 的 API了。

多个账号负载

有时我们需要对外提供访问服务,单个账号的并发TOKEN非常容易超出限制,所以最容易解决这个问题的方式就是多弄几个账号换着提供服务,跟咱们经常说的负载均衡一个道理。要实现这个功能,咱们只需要再同上面一样再添加一个server(有几个账号就添加几个server),不同的地方是我们在上面的配置中,添加不同的账号认证信息,OPENAI的API使用Authorization Header来验证身份,这就非常简单了,我们在反向代理中通过 proxy_set_header指令来给不同的server设置不同的反代验证凭据,如:

proxy_set_header Authorization 'Bearer sk-my-token1';

举个例子,我们这里使用两个账号:
server1 配置同上,添加验证凭据,server2 添加token2凭据:

server
    {
        listen 8001;
        server_name srv.chatgpt ;
        index index.html;
        root  /www/srv1.chatgpt;

        location / {
            proxy_pass  https://api.openai.com/;
            proxy_ssl_server_name on;
            proxy_set_header Host api.openai.com;
            proxy_set_header Authorization 'Bearer sk-my-token1';

            proxy_set_header Connection '';
            proxy_http_version 1.1;
            chunked_transfer_encoding off;
            proxy_buffering off;
            proxy_cache off;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

server
    {
        listen 8002;
        server_name srv.chatgpt ;
        index index.html;
        root  /www/srv2.chatgpt;

        location / {
            proxy_pass  https://api.openai.com/;
            proxy_ssl_server_name on;
            proxy_set_header Host api.openai.com;
            proxy_set_header Authorization 'Bearer sk-my-token2';

            proxy_set_header Connection '';
            proxy_http_version 1.1;
            chunked_transfer_encoding off;
            proxy_buffering off;
            proxy_cache off;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

这样我们就有了监听不同端口使用不同验证凭据的的两个反代server,我们将这两个server通过轮询的方式来对我们的请求负载,所以我们需要添加一个负载均衡server:

upstream chatgpt_servers {
    server srv.chatgpt:8001;
    server srv.chatgpt:8002;
}
server
    {
        listen 80;
        server_name srv.chatgpt ;
        index index.html;
        root  /www/srv.chatgpt;

         location / {
            proxy_pass http://chatgpt_servers;
            proxy_set_header Connection '';
            proxy_http_version 1.1;
            chunked_transfer_encoding off;
            proxy_buffering off;
            proxy_cache off;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

现在我们测试下负载效果,这里我将两个反代分别代理向不同的位置便于区分:

➜  ~ curl http://srv.chatgpt
{
    "message": "Welcome to the OpenAI API! Documentation is available at https://platform.openai.com/docs/api-reference"
}
➜  ~ curl http://srv.chatgpt
srv2 response
➜  ~ curl http://srv.chatgpt
{
    "message": "Welcome to the OpenAI API! Documentation is available at https://platform.openai.com/docs/api-reference"
}                                                                                  
➜  ~ curl http://srv.chatgpt
srv2 response
➜  ~ curl http://srv.chatgpt
{
    "message": "Welcome to the OpenAI API! Documentation is available at https://platform.openai.com/docs/api-reference"
}
➜  ~ curl http://srv.chatgpt
srv2 response
➜  ~ 

可以看到,成功的实现了两个账号轮询访问服务(实际是server的轮询)。

添加新评论