更正nginx服务器的代理配置以访问rest API

hiz5n14c  于 2023-02-03  发布在  Nginx
关注(0)|答案(1)|浏览(130)

我有一个nginx服务器配置如下:

server {
    listen       3000;
    listen  [::]:3000;
    server_name .+;

    add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;
    
    ...

    index index.html;
    root /usr/share/nginx/html;

    location /cam/ {
        proxy_pass http://cam:8000/;
    }

    location /api {
        proxy_pass https://some_ip:some_port;
        proxy_pass_request_headers on;
        proxy_set_header X-API-KEY xxxxx;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_ssl_server_name on;
    }

    location /share/ {
        alias /usr/src/share;
    }

    location / {
        try_files $uri $uri/ /index.html;
    }

    add_header 'Access-Control-Allow-Origin' '*' always;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
    add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;

    client_max_body_size 1M;
    keepalive_timeout 10;
}

对于显示我的前端,这个配置工作正常。凸轮的代理也工作正常。
我在配置API的代理时遇到问题。api在“https://some_ip:some_port”下有一个健全检查,它只返回“200:ok”。否则,我应该能够使用提取请求进行请求,例如

const res = await fetch(`api/subaddress/${system_id.toString()}/base`, {
        method: 'POST',
        headers: {
            'Content-type': 'application/json',
            'X-API-KEY': xxxxx,
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Methods': 'HEAD, GET, POST, PUT, PATCH, DELETE',
            'Access-Control-Allow-Headers': 'Origin, Content-Type, X-Auth-Token'
        },
        body: JSON.stringify(data_body),
    });

如果成功,则返回“202:好的”。
如果我使用curl发出这样的请求,它会很好地工作(两个请求),所以API应该不是问题所在。
在当前配置下,我得到一个“200:ok”,它告诉我我已经连接到API,但是代理没有考虑我的子地址。
除了给定的配置之外,我还尝试了以下配置:

location /api {
    proxy_pass https://some_ip:some_port$request_uri;
    ...
}

它总是给我“502:网关错误”

location /api/ {
    proxy_pass https://some_ip:some_port/;
    ...
 }

它总是给我“403:禁止”

location /api {
    rewrite ^/api/(.*) /$1 break;
    proxy_pass https://some_ip:some_port/$1;
    ...
}

这会导致nginx崩溃,因为它告诉我它无法解析它。我希望避免使用解析器,除非明确必要(我以前也尝试过使用解析器,它也不起作用)。
实现这一目标的正确方法是什么?

8yparm6h

8yparm6h1#

我解决了这个问题。显然403: forbidden是由我的代理的一些配置引起的。删除这些配置后,我再也没有得到那个错误。
最后我用

location /api {
    rewrite ^/api/(.*) /$1 break;
    proxy_pass https://some_ip:some_port/$1;
    ...
}

我把它变成了

resolver 1.1.1.1 valid=30s;

位于配置文件的顶部。

相关问题