代理到后端服务

代理到后端服务

我需要将表单的 API 请求代理api.myserver.com/service/v1/pricing到正确的后端服务。

我是这样配置nginx的:

location /service/v1 {
         proxy_pass https://service-v1-pool/;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
         proxy_ssl_server_name on;
         proxy_http_version 1.1;
         proxy_set_header Connection "";
  }

upstream service-v1-pool {
             least_conn;
             keepalive 32;
             server 192.168.1.10:8000;
}

我在那个私人地址上设置了一个基本的服务器。

问题是,如果我向 发出请求api.myserver.com/service/v1/pricing,服务器将看到一个GET //pricing触发 的请求404 Not Found。正确的请求应该是GET /pricing。我在 NGINX 中遗漏了什么吗?问候

答案1

你错过了有关 URI 转换的部分

https://nginx.org/r/proxy_pass

请求 URI 传递到服务器如下:

  • 如果使用 URI 指定了 proxy_pass 指令,那么当请求传递到服务器时,那个部分规范化请求 URI匹配位置被替换通过指令中指定的 URI

在您的情况下,URI 是/service/v1/pricing,匹配部分是/service/v1,并且它被替换为 ,/因此您得到了//pricing

只需添加一个尾部斜杠location就可以了。

location /service/v1/ {
    proxy_pass https://service-v1-pool/;
    ...
}

答案2

解决方案是在位置块中使用正则表达式:

location ~ ^/service/v1/(.*)$ {
         proxy_pass https://service-v1-pool/$1;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
         proxy_ssl_server_name on;
         proxy_http_version 1.1;
         proxy_set_header Connection "";
  }

或者更简单,如评论中所建议的:

location /service/v1/ {
    proxy_pass https://service-v1-pool/;
    ...
}

相关内容