Nginx 反向代理 - 显示真实 IP

Nginx 反向代理 - 显示真实 IP

我配置了一个 nginx 作为反向代理。我想通过以下两个地址访问一个网站:

  1. 统计测试网
  2. test.com/stats

test.com 和 stats.test.com 位于 2 个不同的服务器上。我的问题是,当客户端通过 stats.test.com 访问网站时,一切正常,nginx 显示客户端 ip。但是当客户端通过 test.com/stats 访问网站时,nginx 会显示 Nginx 反向代理服务器 IP。stats.test.com 的前端配置:

upstream stats.test.com{
  server 192.168.0.130;
}

server {
  include /etc/nginx/default_server_settings;
  server_name  stats.test.com;

  location / {
    include /etc/nginx/default_location_settings;
    proxy_pass http://stats.test.com;
  }
}

test.com/stats 的前端配置:

upstream test.com{
  server 192.168.0.11;
}

upstream stats{
  server 192.168.0.130;
}

server {
  listen 80 default;
  include /etc/nginx/default_server_settings;
  server_name test.com;

  location / {
    include /etc/nginx/default_location_settings;
    proxy_pass http://test.com;
  }

  location /stats/ {
    proxy_pass http://stats/;
  }
}

统计的后端配置:

server {
   listen   80 default;

   access_log  /var/log/nginx/stats_access.log;
   error_log   /var/log/nginx/stats_error.log;

   # Disable all methods besides HEAD, GET and POST.
   if ($request_method !~ ^(GET|HEAD|POST)$ ) {
     return 444;
   }

   root /var/www/stats/public_html;
   index index.php index.html index.htm;

   server_name stats stats.test.com;

   location / {
     try_files $uri $uri/ /index.html;
   }

   location /doc/ {
     alias /usr/share/doc;
     autoindex on;
     allow 127.0.0.1;
     deny all;
   }

   location ~* \.(js)$ {
     expires 14d;
   }

   # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
   location ~\.php$ {
     fastcgi_split_path_info ^(.+\.php)(/.+)$;

     fastcgi_pass unix:/var/run/php5-fpm.sock;
     fastcgi_index index.php;
     include fastcgi_params;
   }

   # Return a 404 for all text files.
   location ~* ^/(?:README|LICENSE[^.]*|LEGALNOTICE)(?:\.txt)*$ {
     return 404;
   }
}

我在 nginx.conf 中设置了这个:

set_real_ip_from 192.168.0.2;
real_ip_header X-Forwarded-For

192.168.0.2是nginx反向代理服务器ip。

答案1

在 php 中,您可以使用 $_SERVER['HTTP_X_FORWARDED_FOR'] 代替 $_SERVER["REMOTE_ADDR"],并且如果您使用 nginx,则会出现客户端的 ip,而不是反向代理。

答案2

我可能错了,但您的 stats.exemple.com 网站包括以下内容:

include /etc/nginx/default_location_settings;

您的基于 URI 的服务器不是,我敢打赌,包含 default_location_settings 文件包含这样的 proxy_header 和代理设置,可以像 real_ip_header X-Forwarded-For 一样完成这个技巧

相关内容