在我的一生中,我无法在我的Apache访问日志中获取mod_remoteip来获取客户端IP。我正在使用安装在Apache 2.4.7之前的Varnish 4的Virtualmin安装程序。您如何使其正常工作?

最佳答案

我终于在日志中获得了客户端IP,在这里找到了最后一步:

以下是使其正常工作的步骤:

  • 获取Varnish以将 header 与客户端IP传递给Apache。您可以通过在vcl_recv的开始处包含以下代码(在answer中找到)来做到这一点:
    if (req.restarts == 0) {
      if (req.http.X-Forwarded-For) {
        set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
      } else {
        set req.http.X-Forwarded-For = client.ip;
      }
    }
    
  • 现在在Apache中启用mod_remoteip。
  • 编辑您的Apache配置,以告诉mod_remoteip哪个头包含客户端IP(来自Apache docs)。我正在使用X-Forwarded-For,但我想只要它与您配置的Varnish传递的内容相匹配,它就可以是任何东西:
    RemoteIPHeader X-Forwarded-For
  • 如果您现在立即重新启动Apache和Varnish,我敢打赌Apache现在将在所有地方引用客户端IP,而不是127.0.0.1。除了我一直在检查的访问日志中。要获取访问日志以显示客户端IP,我们需要修改它正在使用的Apache的日志格式。就我而言,这是“组合”格式。这是我的突破,我发现它here链接到了这个出色的information以达到我们的目的。

  • 这是我的合并日志格式:
    LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
    

    我只是将%a替换为%h所在的位置,这是这样的:
    LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
    

    最后,这是我的Apache配置文件的一个块的样子(在它之前装载mod_remoteip):
    # Note that the use of %{X-Forwarded-For}i instead of %h is not recommended.
    # Use mod_remoteip instead.
    RemoteIPHeader X-Forwarded-For
    
    LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
    

    09-20 02:14