使用上游时 NGINX 无响应

使用上游时 NGINX 无响应

我正在尝试通过 nginx 对 Web 应用程序进行负载平衡,对于所有使用子路径调用服务的 Web 应用程序来说,这都可以正常工作。

例如它有效

http://example.com/luna/ 

但不是

 http://example.com/luna/sales

我的 nginx.conf

user  nobody;
worker_processes  auto;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

     map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    upstream lunaups {
        server myhostserver1.com:8080;
        server myhostserver2.com:8080;
    }


    server {
        listen       80;
        server_name  example.com;

        proxy_pass_header Server;

        location = / {
             rewrite ^ http://example.com/luna redirect;
         }

        location /luna {
            rewrite ^$/luna/(.*)/^ /$1 redirect;
            proxy_pass http://lunaups;
            #add_header  X-Upstream  $upstream_addr;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

我的 Web 应用程序调用带有附加子路径(如 /luna/sales)的服务时无法返回响应。我这里遗漏了什么?

如果我从上游删除一个主机服务器,它就会起作用,但是当我在上游添加第二个主机时,它无法返回响应。

我的重写规则有误还是我的整体配置有误?

答案1

您的重写规则将 Web 浏览器从/luna/sales重定向到/sales。这意味着 Web 浏览器对 发出新的 HTTP 请求/sales,但是您没有location匹配的块,/sales因此您会收到 404 错误。

我相信您真正想要做的是更改代理到上游的 URI。如果是这样,您可以尝试更改您的location块:

location ~ /luna(?<upstream_uri>(/.*)?) {
    proxy_pass http://lunaups/$upstream_uri;
}

这将匹配或/luna/luna/whatever将匹配的子表达式绑定为$upstream_uri,然后仅将该子表达式发送到上游。

相关内容