将请求 IP 从 Nginx 转发到 Apache 的日志

将请求 IP 从 Nginx 转发到 Apache 的日志

我使用 nginx 作为 Apache 的前端反向代理,在 nginx 内部有以下配置:

location / {
  if (-f $request_filename) {
      add_header X-Static hit;
      access_log off;
    }

  if (!-f $request_filename) {
      proxy_pass https://127.0.0.1:8000;
      add_header X-Static miss;
    }

使用 apache 在本地监听端口 8000。当我查看 apache 的日志时,所有请求都来自 127.0.0.1:443(nginx 所在的位置)。我想将真实 IP 转发给 apache,以便它将其正确存储在日志中。

我尝试将以下几行添加到位置块,但没有成功

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

我这里是不是漏掉了一步?我需要更改 apache 的日志格式吗?它目前使用的是默认的组合日志。

答案1

您需要更改 apache 的日志格式以支持 x-forward

例如

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{X-Forwarded-For}i" combined

然后你可以使用

 CustomLog logs/access_log combined

因此,日志中的最后一项将是 nginx 为真实 IP 设置的标头。当然,您可以在 LogFormat 行中切换顺序

答案2

看看mod_rpaf apache 模块

在 deb/ubuntu 上您可以安装包名称 libapache2-mod-rpaf

安装后,将您的 nginx IP 添加到 /etc/apache2/mods-available/rpaf.conf 中的 RPAFproxy_ips 设置中

<IfModule mod_rpaf.c>
RPAFenable On RPAFsethostname 
On RPAFproxy_ips 127.0.0.1   
</IfModule>

重新启动 apache,您应该会在日志中看到正确的 IP 地址。

我也会将其保留在你的 nginx 配置中:

proxy_set_header Host $host;
proxy_set_header X-Real-IP  $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;

答案3

您只是改变了 HTTP 标头,而不是 Apache 查看连接的方式(来自 Nginx)。

相关内容