首页 > 解决方案 > 如何让drupal看到nginx反向代理->清漆->Apache堆栈后面的客户端IP?

问题描述

我使用 nginx 作为反向代理来处理端口 80 -> 443 重定向,然后到与服务于 drupal (7.69) 站点的 Apache2.4 后端(端口 8182)对话的清漆缓存(端口 8181)。

我已将 nginx 配置为将客户端 IP 转发为:

proxy_pass            http://127.0.0.1:8181;
proxy_read_timeout    90;
proxy_connect_timeout 90;
proxy_redirect        off;
proxy_set_header      X-Real-IP $remote_addr;
proxy_set_header      X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header      X-Forwarded-Proto https;
proxy_set_header      X-Forwarded-Port 443;
proxy_set_header      X-Forwarded-Host $remote_addr;
proxy_set_header      Host $host;

在清漆 vcl_recv 我添加:

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 中,我安装了 remoteip 模块并设置了以下配置:

RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 127.0.0.1

在drupal的settings.php中我有

$conf['reverse_proxy'] = True;
$conf['reverse_proxy_header'] = 'X-Forwarded-For';
$conf['reverse_proxy_addresses'] = array('127.0.0.1');

...但是 drupal 似乎仍然只看到和登录 localhost (127.0.0.1) ip,而不是真正的客户端 IP。因此,表单被记录为不是来自真实用户而是服务器本身提交的。

我想知道我的清漆配置是否关闭,因为我也在从 nginx 代理并绕过清漆直接进入绕过drupal(它是SMF)但在相同的apache配置上运行的论坛;论坛正在记录从 nginx 发送的客户端 IP(使用相同的标头更改和 apache remoteip 配置)就好了。

我将不胜感激指导/建议。

标签: drupal-7varnishnginx-reverse-proxyapache2.4

解决方案


理论上,您的 Varnish 配置X-Forwarded-For是正确的。

实际上,您甚至不需要X-Forwarded-For在 Varnish 中进行设置,因为 Varnish 会自动执行此操作。

Drupal 配置

就 Drupal 配置而言,它可能与reverse_proxy_header. 我偶然发现了这段 Drupal 7 文档:https ://api.drupal.org/api/drupal/includes%21bootstrap.inc/function/ip_address/7.x 。

该页面上代码的关键部分如下:

$reverse_proxy_header = variable_get('reverse_proxy_header', 'HTTP_X_FORWARDED_FOR');

显然,ip_address()可以X-Forwarded-For通过配置参数使此功能知道标头。

但是,标头格式不是官方的 HTTP 格式,而是 PHP$_SERVER超全局存储它的方式。在这种情况下,格式为HTTP_X_FORWARDED_FOR.

所以请尝试$conf['reverse_proxy_header'] = 'X-Forwarded-For';$conf['reverse_proxy_header'] = 'HTTP_X_FORWARDED_FOR';.


推荐阅读