1

使用 Apache 后面的 Tomcat 设置,如何轻松确定服务器的 id(理想情况下为 IP 地址)?

具体情况是在负载均衡器后面设置了多个服务器,因此传入的请求主机名不唯一,不足以识别特定服务器以进行日志记录。不幸的是,使用HttpServletRequest.getLocalAddr()返回相同的主机名而不是预期的 IP 地址(我假设这与这里的这个非常老的问题有关:https ://issues.apache.org/bugzilla/show_bug.cgi?id=46082 ) .

有没有办法getLocalAddr()按照记录执行,或者是否需要其他方法来查询服务器的 IP 地址?

4

3 回答 3

2

在我们的项目中,我们使用 JMX 来获取所有配置信息。它需要几个步骤,因为它就像在 server.xml 文件中向下导航这个链接有一些信息: http: //oss.wxnet.org/mbeans.html

如果你想要的只是 IP,这可能是矫枉过正,但我​​想我会把它扔在那里。

  MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
  Set<ObjectName> theConnectors = mbeanServer.queryNames(
      new ObjectName("Catalina:type=Connector,*"),
      null);
  if (theConnectors != null)
  {
      for (ObjectName nextConnectorName : theConnectors)
      {
        InetAddress theInetAddress = (InetAddress) mbeanServer.getAttribute(
          nextConnectorName,
          "address");
        if (theInetAddress != null)
        {
          ipAddress = theInetAddress.getHostAddress();
        }
        if (!StringUtil.isEmpty(ipAddress))
        {
          // found the IP address
          break;
        }
      }
  }
于 2013-02-08T19:52:20.037 回答
1

对于我的情况,解决方案是直接获取服务器的 IP 地址,而不是尝试通过 HttpServleRequest 获取本地地址。

我通过以下方式缓存了 IP 以在我的过滤器中使用:

private static final String serverIp;
static {
    String addressString = null;
    try
    {
        InetAddress address = InetAddress.getLocalHost();
        addressString = address.getHostAddress();
    } catch (Exception e)
    {
        logger.error("Exception while attempting to determine local ip address",e);
    }

    if (addressString != null) serverIp = addressString;
    else serverIp = "unknown";
}
于 2013-02-08T22:31:36.443 回答
1

我最近有一个类似的问题(在最初的问题之后几年)并找到了这个问题和答案。就我而言,问题是ServletRequest#getLocalAddr()实现返回的是远程地址而不是本地地址。该问题是由 Tomcat v9.0.22 中的回归引起的。它已在 v9.0.23 中修复。在此处查看问题和答案:

https://stackoverflow.com/a/57725039/9602527

于 2019-08-30T10:36:57.347 回答