apache-2.2 – 来自后端的301的nginx负载均衡问题

前端之家收集整理的这篇文章主要介绍了apache-2.2 – 来自后端的301的nginx负载均衡问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我遇到了一个奇怪的问题,我不确定它是配置问题还是Nginx中的错误.我的设置是一个Nginx反向代理,它有Apache2后端服务器.负载平衡器非常基本类似于example from the wiki,例如简化:

http {
  upstream myproject {
    server 127.0.0.1:8000;
  }

  server {
    listen 80;
    location / {
      proxy_pass http://myproject;
    }
  }
}

现在,例如当我尝试在Apache中请求目录时,会出现问题,而在URL的末尾没有尾部斜杠.例如,客户端请求:

http://apache.myserver.com/somedirectory

Apache将使用HTTP 302进行回复以将客户端重定向

http://apache.myserver.com/somedirectory/

注意,url最后有一个斜杠,注意它是一个目录.另请注意,通过在重定向标头中使用传入请求主机名,Apache是​​“智能”的.到目前为止都很好.但是,当使用具有负载平衡的Nginx时,将301发送到客户端,而不将Nginx上游名称转换回实际的服务器/域.所以客户将收到以下内容

GET http://Nginx.myserver.com/somedirectory
HTTP 301 Moved Permanently
...
Location: http://myproject:8000/somedirectory/

myproject是Nginx上游后端的名称.它不是客户端可以解析的实际主机.在我看来,客户端应该被重定向

http://Nginx.myserver.com/somedirectory/  

即应该在响应头中替换上游后端的名称.这是Nginx中的错误还是我做错了什么?

最佳答案
原来Nginx有很多proxy redirect选项来处理这类问题.我最终使用了这样的东西:

location / {
    proxy_pass  http://myproject;
    proxy_set_header Host myproject;
    proxy_redirect http://myproject/ $scheme://$host/;
    proxy_redirect http://myproject:8000/ $scheme://$host/;
}

这基本上用$host替换了上游名称删除了端口.这在我的情况下工作,因为我在HTTP / HTTPS的默认端口上托管Nginx.如果Nginx在非默认端口上运行,则需要这样的东西:

    proxy_redirect http://myproject/ $scheme://$host:$server_port/;
    proxy_redirect http://myproject:8000/ $scheme://$host:$server_port/;

猜你在找的Nginx相关文章