我正在尝试通过 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
,然后仅将该子表达式发送到上游。