logo NodeSeekbeta

反代火山引擎API 404错误

我的nginx配置如下

   server {
        # HTTPS服务器块:监听端口443
        listen 443 ssl;
        server_name XXXXXXXX.com;  # 您的域名

        # SSL配置(替换为您的实际证书路径)
        ssl_certificate  /etc/letsencrypt/live/XXXXXXXX.com/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/XXXXXXXX.com/privkey.pem;
        ssl_session_timeout 1d;
        ssl_session_cache shared:MozSSL:10m;  # 共享SSL会话缓存
        ssl_session_tickets off;

        # 现代SSL协议设置(推荐)
        ssl_protocols TLSv1.3 TLSv1.2;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
        ssl_prefer_server_ciphers off;

        # HSTS设置(可选,强制浏览器使用HTTPS)
        add_header Strict-Transport-Security "max-age=15724800; includeSubDomains; preload" always;

        location / {
            # 反向代理到火山引擎API
            proxy_pass https://ark.cn-beijing.volces.com/;  # 目标API地址
            proxy_set_header Host $host;  # 传递原始Host头
            proxy_set_header X-Real-IP $remote_addr;  # 传递客户端真实IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 传递代理链
            proxy_set_header X-Forwarded-Proto $scheme;  # 传递协议
            proxy_set_header X-Forwarded-Host $host;  # 传递原始主机

            proxy_pass_request_body on;  # 传递请求体
            proxy_pass_request_headers on;  # 传递请求头

            # 超时和缓冲设置
            proxy_connect_timeout 600s;  # 连接超时
            proxy_send_timeout 600s;  # 发送超时
            proxy_read_timeout 600s;  # 读取超时
            proxy_buffer_size 128k;  # 缓冲区大小
            proxy_buffers 4 256k;  # 缓冲区数量和大小
            proxy_busy_buffers_size 256k;  # 忙碌缓冲区大小

            # SSL代理设置
            proxy_ssl_server_name on;  # 启用SSL服务器名称指示
            proxy_ssl_session_reuse on;  # 复用SSL会话

            # CORS头(可选,如果客户端是浏览器应用)
            add_header Access-Control-Allow-Origin *;  # 允许所有来源(生产环境请限制,如 add_header Access-Control-Allow-Origin "https://your-client-domain.com";)
            add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";  # 允许的方法
            add_header Access-Control-Allow-Headers "Authorization, Content-Type";  # 允许的头

            # 处理OPTIONS预检请求(如果需要CORS)
            if ($request_method = OPTIONS) {
                add_header Access-Control-Allow-Origin *;
                add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
                add_header Access-Control-Allow-Headers "Authorization, Content-Type";
                add_header Content-Length 0;
                add_header Content-Type text/plain;
                return 204;  # No Content
            }
        }

        # 错误页面处理
        error_page 502 503 504 /50x.html;  # 代理错误返回自定义页面
        location = /50x.html {
            root /usr/share/nginx/html;  # 确保此目录存在,包含50x.html文件
        }
    }

启动之后通过浏览器访问返回

{"error":{"code":"AuthenticationError","message":"the API key or AK/SK in the request is missing or invalid. request id: 021748312951337e2a9afxxxxxxxxxxxxxxxxxxxxxxxx","param":"","type":"Unauthorized"}}

到这里我以为成功了,然后我去


  curl https://XXXXXXXXXXXXXXXXXXXXX.com/api/v3/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer XXXXXXXXXXXXXXXXXXXXX" \
  -d '{
    "model": "doubao-1.5-pro-32k-250115",
    "messages": [
        {
            "role": "system",
            "content": "You are a helpful assistant."
        },
        {
            "role": "user",
            "content": "Hello!"
        }
    ]
  }'

发现不返回任何结果

所以正确的反代姿势是什么样的?

  • 根据您提供的配置和错误信息,问题可能出在反向代理的请求头传递和火山引擎API的认证处理上。以下是修正后的配置建议:

    修正后的Nginx配置关键点

    server {
        listen 443 ssl;
        server_name XXXXXXXX.com;
    
        # SSL配置保持不变...
    
        location / {
            proxy_pass https://ark.cn-beijing.volces.com;
            
            # 必须保留原始请求头(火山引擎API需要这些头)
            proxy_set_header Host ark.cn-beijing.volces.com;  # 关键修改:使用目标域名
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            
            # 特别注意Authorization头的传递
            proxy_set_header Authorization $http_authorization;  # 显式传递授权头
            proxy_pass_request_headers on;
    
            # 添加火山引擎可能需要的其他头
            proxy_set_header X-Volc-AK $http_x_volc_ak;  # 如果使用AK/SK认证
            proxy_set_header X-Volc-SK $http_x_volc_sk;
            
            # 超时设置(根据需要调整)
            proxy_connect_timeout 60s;
            proxy_read_timeout 60s;
            
            # 禁用缓冲以确保实时流式响应
            proxy_buffering off;
        }
    }
    

    关键修改说明

    1. Host头问题

      • 原配置将Host设置为客户端域名,应改为火山引擎的目标域名 ark.cn-beijing.volces.com
    2. 认证头传递

      • 显式传递 Authorization 头,确保Bearer token能到达后端
      • 如果使用AK/SK认证,需要传递 X-Volc-AKX-Volc-SK
    3. 流式响应

      • 禁用 proxy_buffering 以避免阻塞流式响应
    4. CORS调整

      • 如果前端是浏览器应用,保留CORS配置,但要确保 Access-Control-Allow-Origin 设置正确

    测试命令建议

    # 测试时添加-v参数查看详细请求过程
    curl -v https://yourdomain.com/api/v3/chat/completions \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer your_token_here" \
      -d '{"model":"doubao-1.5-pro-32k-250115","messages":[{"role":"user","content":"Hello"}]}'
    

    常见问题排查

    1. 检查火山引擎API是否需要特定路径(如 /api 是否应该包含在proxy_pass中)
    2. 确认认证方式正确(Bearer token/AKSK)
    3. 使用 curl -v 或抓包工具查看请求是否真正到达火山引擎
    4. 检查Nginx错误日志:tail -f /var/log/nginx/error.log

    如果问题仍然存在,建议先直接用curl测试火山引擎API(不经过代理),确保认证信息正确,然后再逐步调试代理配置。

    以上内容由DeepSeek-V3-0324生成。

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有63876位seeker

🎉欢迎新用户🎉