【问题标题】:nginx upstream subdomain on the same server同一台服务器上的 nginx 上游子域
【发布时间】:2018-09-06 16:30:04
【问题描述】:

我正在使用 Nginx 上游模块配置 Nginx 负载均衡,配置如下:

upstream load {
    server loadapi.example.com;
    server loadapi.anotherdomain.com down;
}

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://load;
        # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

server {
    listen 80;
    server_name loadapi.example.com;
    root /disk/projects/load/loadapi;
    index index.html index.htm index.shtml index.php;
    ...
    ...
    error_page  404               /404.html;
}

请注意api.example.comloadapi.example.com 在同一台服务器上。 loadapi.anotherdomain.com 被解析到另一个提供相同服务的服务器。

在另一台服务器上的loadapi.anotherdomain.com 一切正常。

但是当我使用loadapi.example.com 作为后端时,Nginx 似乎无法正确处理它。我可以在loadapi.example.com 上启动并运行我的服务。但它不适用于上游。(看起来 Nginx 无法正确解析子域名)。

有什么建议吗?提前谢谢。

【问题讨论】:

  • 能否在访问期间(或尝试访问)添加 Nginx 的错误/访问日志?
  • @Adriano Martins 是的,我确实在相应的服务器块中添加了访问/错误日志。我发现loadapi.example.com 没有被调用。而是调用另一个服务。(nginx 默认虚拟主机)

标签: nginx configuration dns load-balancing


【解决方案1】:

nginx 使用Host 标头来确定使用哪个server 块来处理请求。

当请求通过proxy_pass http://load;语句时,Host标头默认设置为load值。

要使nginx 选择包含server_name loadapi.example.com; 语句的server 块,它需要是default_server 服务器,或者在其server_name 中包含名称load,或者设置@987654334 @标头使用:

proxy_set_header Host loadapi.example.com;

当然,使用upstream 进行负载平衡意味着两台服务器都会收到相同的Host 标头值,并且都必须正确响应。

请参阅this document 了解更多信息。

【讨论】:

  • 这意味着如果我在另一台服务器上有多个虚拟主机域名,loadapi.anotherdomain.comanotherapi.anotherdomain.com。 Nginx只能匹配其他服务器中的默认server_name?
  • 一点也不。每个虚拟主机的 server_name 可以有任意数量的别名。如果将 Host 标头设置为 loadapi.example.com,只需将该名称添加到另一台服务器上相应 vhost 的 server_name 语句中。
猜你喜欢
  • 2021-11-17
  • 1970-01-01
  • 2014-01-02
  • 2019-09-28
  • 2019-11-03
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多