使用 nginx 将真实远程 IP 转发到代理服务器

使用 nginx 将真实远程 IP 转发到代理服务器

为了隐藏我的网站 IP,我在另一个 VPS 上使用 nginx 代理了主服务器。我试图将访问者的真实 IP 发送到我的网站,以下是 conf.d 文件夹中的配置:

proxy_cache_path  /etc/nginx/cacheddata  levels=1:2   keys_zone=staticfilecache:180m  max_size=500m;
proxy_temp_path /etc/nginx/cacheddata/temp;
proxy_connect_timeout 30;
proxy_read_timeout 120;
proxy_send_timeout 120;

#IMPORTANT - this sets the basic cache key that's used in the static file cache.
proxy_cache_key "$scheme://$host$request_uri";

upstream wordpressapache {
        #The upstream apache server. You can have many of these and weight them accordingly,
        #allowing nginx to function as a caching load balancer 
        server 127.0.0.1:8080 weight=1 fail_timeout=120s;
}
server {
      listen 80;
      server_name XXXXXX.com;
      access_log off;
      error_log off;
    set_real_ip_from 0.0.0.0/0;
    real_ip_header X-Real-IP;
    real_ip_recursive on;

# gzip compression options
  gzip on;
  gzip_http_version 1.0;
  gzip_comp_level 6;
  gzip_min_length 0;
  gzip_buffers 16 8k;
  gzip_proxied any;
  gzip_types text/plain text/css text/xml text/javascript application/xml application/xml+rss application/javascript application/json;
  gzip_disable "MSIE [1-6]\.";
  gzip_vary on;


      location / {
      proxy_pass http://XXXXXX/;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass_request_headers on;
      proxy_max_temp_file_size 0;
      client_max_body_size 10m;
      client_body_buffer_size 128k;
      proxy_connect_timeout 90;
      proxy_send_timeout 90;
      proxy_read_timeout 90;
      proxy_buffer_size 4k;
      proxy_buffers 4 32k;
      proxy_busy_buffers_size 64k;
      proxy_temp_file_write_size 64k;
   }
} 

并在代理服务器上使用此代码创建了一个简单的 php 页面:

<? echo $_SERVER["REMOTE_ADDR"]; ?>

当我打开页面时,它显示 nginx 服务器 IP 而不是我的 IP。我做错了什么吗?

答案1

您需要在运行您的网站的实际服务器上配置这些选项:

set_real_ip_from 0.0.0.0/0;
real_ip_header X-Real-IP;
real_ip_recursive on;

您需要在set_real_ip_from指令中使用代理服务器的 IP 地址,以便只X-Real-IP允许该服务器的标头。

这些指令告诉 nginx,它应该使用 HTTP 标头中列出的 IP 地址而不是 TCP 连接源的 IP 地址作为连接的源 IP。

然后,在您的代理服务器中,您需要确保它使用X-Real-IP客户端 IP 地址的值设置标头,就像您的配置已经设置它一样。

总之,在代理服务器中您设置标头,在主服务器中您告诉 Web 服务器使用该标头。

答案2

转发真实远程 IP 从nginxapache实际上需要mod_remoteip 模块httpd.conf在侧面安装并启用apache

您当前的nginx配置很好,它proxy_set_header在块中有必需的选项server

server {
    ...
    proxy_set_header    X-Real-IP        $remote_addr;
    proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;
    ...
}

您应该使用以下apache命令启用所需的模块:

LoadModule remoteip_module modules/mod_remoteip.so

并设置此指令

RemoteIPHeader X-Real-IP
RemoteIPInternalProxy 127.0.0.1

127.0.0.1如果需要的话,请用你的IP替换nginx...

答案3

您将“真实” IP 存储在 中X-Real-IP,而不是 中REMOTE_ADDR

以下应该有效:

<? echo $_SERVER["X-Real-IP"]; ?>

相关内容