Nginx作为反向代理时传递客户端IP的设置方法

 更新时间:2014年08月16日 19:34:15   投稿:mdxy-dxy  
因为nginx的优越性,现在越来越多的用户在生产环境中使用nginx作为前端,不管nginx在前端是做负载均衡还是只做简单的反向代理,都需要把日志转发到后端real server,以方便我们检查程序的各种故障

nginx默认配置文件里面是没有进行日志转发配置的,这个需要我们自己手动来操作了,当然后端的real server不同时操作方法是不一样的,这里我们分别例举几种情况来说明一下。

nginx做前端,转发日志到后端nginx服务器:

因为架构的需要采用多级 Nginx 反向代理,但是后端的程序获取到的客户端 IP 都是前端 Nginx 的 IP,问题的根源在于后端的 Nginx 在 HTTP Header 中取客户端 IP 时没有取对正确的值。
同样适用于前端是 Squid 或者其他反向代理的情况。

首先前端的 Nginx 要做转发客户端 IP 的配置:

location / {
proxy_pass http://localhost:8000;
 
# Forward the user's IP address to Rails
proxy_set_header X-Real-IP $remote_addr;
# needed for HTTPS
# proxy_set_header X_FORWARDED_PROTO https;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}

后端的 Nginx 需要安装一个 Module: NginxHttpRealIpModule,编译的时候默认不包含此 Module,需要重新编译安装 Nginx,configure 的时候加上 –with-http_realip_module,Nginx 升级或者添加/删除 Module 时支持热切换,可以避免中断服务。

升级后配置 NginxHttpRealIpModule,set_real_ip_from 就是指前端 Nginx 或者 Squid 的 IP:

location / {
proxy_pass http://localhost:8000;
 
# Forward the user's IP address to Rails
proxy_set_header X-Real-IP $remote_addr;
# needed for HTTPS
# proxy_set_header X_FORWARDED_PROTO https;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
# NginxHttpRealIpModule
set_real_ip_from 192.168.1.0/24;
set_real_ip_from 192.168.2.1;
real_ip_header X-Real-IP;
}

最后记得 reload Nginx config

nginx做前端,转发日志到后端apache服务器:

apache日志中默认有%h来指定来访客户端你的ip地址,但是使用了nginx代理上网则%h获得的ip地址会不准。
这就需要对nginx 和apache的配置文件设定 X-Forwarded-For 参数来获取客户端真实的ip地址。对于使用了反向代理的客户端,跟踪真实的ip地址。
/usr/nginx/conf/nginx.conf 添加以下参数:

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

同时修改:

server {
   listen 80;
   server_name 域名 ;
   proxy_redirect off; 
    location / {
     proxy_set_header  X-Forwarded-For $remote_addr;
     proxy_set_header  X-Forwarded-Host $server_name;
     proxy_set_header Host $host;
     proxy_pass http://域名;
   }
   access_log off;
 }

重启nginx使配置生效。
 
apache端需要安装一个第三方模块"mod_rpaf"了, 官方网站: http://stderr.net/apache/rpaf/

wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz 
tar zxvf mod_rpaf-0.6.tar.gz 
cd mod_rpaf-0.6 
/opt/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

修改apache配置 /usr/apache2/conf/httpd.conf

LoadModule rpaf_module modules/mod_rpaf-2.0.so 
RPAFenable On 
RPAFsethostname On 
RPAFproxy_ips ip地址  #Nginx所在服务器的IP
RPAFheader X-Forwarded-For

重启apache 查看日志就可以看见日志中已经获得到真实ip了。

nginx做前端,转发日志到后端IIS服务器:

  iis 如果放在反向代理后面,日志里的ip是反向代理服务器的ip,不是真正用户的ip,想要记录用户的ip要做两件事。

1.在反向代理设置X-Forwarded-For段,以下为nginx下的配置示例:

server
{
  location
  {
  ……
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  ……
  }
}

2.在iis站点上安装下面这个isapi filter,这东西是在f5的开发论坛上找到的,按开发者的话说,是为了解决iis放在f5后记录不到用户ip的问题,-_-# 管他前端是f5还是nginx还是squid还是haproxy。都可以用。应该不错。装完之后重启下iis就搞定了。
   http://devcentral.f5.com/weblogs/Joe/archive/2009/08/19/x_forwarded_for_log_filter_for_windows_servers.aspx
   回头看下iis的日志,里面的ip已经是用户的真实ip了。

相关文章

  • 反向代理缓存的详细介绍

    反向代理缓存的详细介绍

    这篇文章主要介绍了反向代理缓存的详细介绍的相关资料,希望通过本文大家能够掌握应用反向代理缓存的使用方法,需要的朋友可以参考下
    2017-09-09
  • Nginx反向代理如何到访问者机器上(后端调试)

    Nginx反向代理如何到访问者机器上(后端调试)

    这篇文章主要介绍了Nginx反向代理如何到访问者机器上(后端调试),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • 教你在容器中使用nginx搭建上传下载的文件服务器

    教你在容器中使用nginx搭建上传下载的文件服务器

    这篇文章主要介绍了容器中使用nginx搭建支持上传下载的文件服务器,在这需要注意为了让nginx支持文件上传,需要下载并运行带有nginx-upload-module模块的容器,需要的朋友可以参考下
    2022-05-05
  • 如何解决Nginx请求转发将POST变为GET问题

    如何解决Nginx请求转发将POST变为GET问题

    这篇文章主要介绍了如何解决Nginx请求转发将POST变为GET问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Nginx解决vue项目服务器部署及跨域访问后端详解

    Nginx解决vue项目服务器部署及跨域访问后端详解

    跨域问题在前后端分离项目很常见,至于为什么会跨域,同源策略,百度各种博客都很详细,这里不再介绍,这篇文章主要给大家介绍了关于Nginx解决vue项目服务器部署及跨域访问后端的相关资料,需要的朋友可以参考下
    2022-11-11
  • Nginx服务快速入门教程

    Nginx服务快速入门教程

    这篇文章主要介绍了Nginx服务快速入门教程的的相关资料,帮助大家更好的理解和使用nginx,感兴趣的朋友可以了解下
    2021-02-02
  • nginx内存池源码解析

    nginx内存池源码解析

    内存池是在真正使用内存之前,预先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用,接下来通过本文给大家介绍nginx内存池源码,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2021-11-11
  • 详解Linux环境下使Nginx服务器支持中文url的配置流程

    详解Linux环境下使Nginx服务器支持中文url的配置流程

    这篇文章主要介绍了Linux环境下使Nginx服务器支持中文url的配置流程,文中还介绍了一个在Linux下将非UTF-8的文件名转换为UTF-8编码,的方法,需要的朋友可以参考下
    2016-04-04
  • Nginx出现403 Forbidden的几种简单解决方式

    Nginx出现403 Forbidden的几种简单解决方式

    这篇文章主要介绍了Nginx出现403 Forbidden的几种解决思路,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • nginx+apache+mysql+php+memcached+squid搭建集群web环境

    nginx+apache+mysql+php+memcached+squid搭建集群web环境

    当前,LAMP开发模式是WEB开发的首选,如何搭建一个高效、可靠、稳定的WEB服务器一直是个热门主题,本文就是这个主题的一次尝试。
    2011-03-03

最新评论