使用带有 proxy_pass 的 Nginx 上游主机

使用带有 proxy_pass 的 Nginx 上游主机

下面是最基本的 Nginx 配置,它直接演示了我遇到的问题。“真实世界”的设置有多个上游和多个条件检查,为了清晰起见,这里省略了。

upstream barhost {
  server example.com;
}

server {
  listen 8080;

  location / {

    # this works fine if used directly:
    # proxy_pass http://example.com/;

    # this doesn't work, returns 404:
    proxy_pass http://barhost/;
  }
}

结果:

  • 使用proxy_pass http://example.com/;效果很好,返回200
  • 使用proxy_pass http://barhost/;(使用upstream)它返回404

一些背景信息:

我在这里做错了什么?


一些相关的帖子:


更新:

感谢评论中一位热心的用户,我调查了此场景中代理到 example.com 的请求标头。它被设置为barhost服务器将给出无效响应的对象。这是问题的根本原因。

因此,了解这一点后,我想Host正确设置标题。

设置上游名称以匹配所需的Host标头名称确实有效:

upstream example.com {
  server example.com:80;
}

硬编码Host标头proxy_set_header似乎也有效:

upstream barhost {
  server example.com;
}

server {
  listen 8080;

  location / {

    # This works:
    proxy_set_header Host example.com;

    # None of these work:
    # proxy_set_header Host $host;
    # proxy_set_header Host $http_upstream_host;
    # proxy_set_header Host $proxy_host;

    proxy_pass http://barhost/;
  }
}

然而,在我的特定用例中,最好使用proxy_set_header变量来动态设置它 -那可能吗?

相关内容