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

私の状況では、解決策は、HttpServleRequest 経由でローカル アドレスを取得しようとするのではなく、サーバーの IP アドレスを直接取得することでした。

フィルターで使用するために、次の方法で 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 に答える