首页 > 解决方案 > 有没有办法在 nginx 上添加包含代理服务器名称的响应标头?

问题描述

我们正在尝试弄清楚如何在响应标头中添加所选服务器。

现在,我们使用$upstream_addr来获取ip address 和 port,它可以工作,但是有没有办法获取服务器主机名而不是 ?(正如在“上游”块中声明的那样)

这是我们的(简化的)nginx 配置:

upstream my_upstream  {
    ip_hash;
    server production001 max_fails=2 fail_timeout=15s;
    server production002 max_fails=2 fail_timeout=15s;
}

server {
    listen       80;
    server_name  domain.com;

    location / {
        proxy_pass      http://my_upstream  ;
        add_header X-Upstream $upstream_addr always;
    }
}

这会产生以下标题作为响应:“x-upstream: XX.XX.XX.XX:XXXX”

我们想得到什么:“x-upstream:production001”

标签: nginx

解决方案


如果您知道上游服务器的 IP 地址,那么您可以使用地图

  upstream my_upstream {
    ip_hash;
    server prod1:80;
    server prod2:80;
    server prod3:80;
  }

  map $upstream_addr $upstream_name {
    ~.*192.168.1.1:80   production1;
    ~.*192.168.1.2:80   production2;
    ~.*192.168.1.3:80   production3;
    default             $upstream_addr;
  }

  server {
    listen       80;
    server_name  domain.com;

    location / {
        proxy_pass      http://my_upstream  ;
        add_header X-Upstream $upstream_name always;
    }
}

当 NGINX 尝试多个服务器时,您需要映射中的正则表达式,列表中的姓氏是响应的服务器。


推荐阅读