Nginx和Apache共存环境下apache获得真实IP

自从Nginx出现以后,我们都喜欢让 Nginx 跑在前方处理静态文件,然后通过 proxy 把动态请求过滤给 apache。
这么有个问题,跑在后方 apache 上的应用获取到的IP都是Nginx所在服务器的IP ,或者是本机 127.0.0.1 。
最明显就是查看 apache 的访问日志。就会见到来来去去都是内网的IP。
如果你的应用有诸如,“单个IP不能重复登陆”,“单个IP注册相隔n分钟”... 之类用于IP判别的安全规则。
这么就麻烦了....
但还好,你可以通过修改 nginx proxy 的参数令后端应用获取到 Nginx 发来的请求报文获取到外网的IP。
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 日志上所获取的ip依然还是本地。
搜寻了一下,发现了apache这一个来自第三方的mod 配合Nginx proxy 使用。
说明:http://stderr.net/apache/rpaf/
下载: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
Apache 的目录按自己的环境修改,并选择相应的安装方式:
#/usr/local/apache/bin/apxs -i -a -c mod_rpaf.c Apache 1.3.x 的安装方式
#/usr/local/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c Apache 2.x 的安装方式
完成后会在 http.conf 的 LoadModule 区域 为你多加了一行。
LoadModule mod_rpaf-2.0.so_module modules/mod_rpaf-2.0.so

经 apache 2.2.6 的实验,使用这一行启动 apache 的时候会报错的。
所以改为:
LoadModule rpaf_module modules/mod_rpaf-2.0.so
并在下方添加
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 192.168.10.2 # 填写Nginx所在的内网IP。
RPAFheader X-Forwarded-For
保存退出后重启apache
再看看 apache 的日志内容? 呵,不再是来来去去的那几个IP了吧。

转载自http://blog.sina.com.cn/s/blog_4560b80b0100m79m.html

时间: 2024-10-09 06:58:43

Nginx和Apache共存环境下apache获得真实IP的相关文章

多路由器环境下路由器的入口IP地址及DHCP设置探讨

多路由器环境下路由器的入口IP地址及DHCP设置探讨 这里把路由器的LAN口管理IP地址称为路由器的入口地址,把直接接入互联网的路由器称为主路由器,其他路由器称为从路由器.在多路由器环境下路由器的设置个人认为应当遵循以下原则: 1.如果主路由器入口地址为192.168.1.1,那么从路由器最后设置为192.168.x.1,2≤x≤254. 2.如果主路由器LAN口→有线→从路由器的WAN口,那么从路由器可以开启DHCP功能,从路由器下挂电脑从从路由器获取IP地址.主路由器→无线→从路由器WDS

Nginx 内置变量,细化规则,真实IP获取及限制连接请求

希望下周测试之后能用起来!!!感觉很有用的. http://www.bzfshop.net/article/176.html http://www.cr173.com/html/19761_1.html http://blog.pixelastic.com/2013/09/27/understanding-nginx-location-blocks-rewrite-rules/ 你 Google 不到的配置 很多时候,我们的网站不是简单的  普通用户IE浏览器  ——->  你的服务器  的结构

linux环境下Apache+Tomcat集群配置

写在前面 apache配置多个tomcat,实现请求分流,多个tomcat服务均衡负载,增加服务的可靠性.最近研究了一下,遇到许多问题,记录一下,方便以后查阅,不喜欢apache,nginx也是可以做到的. 准备 版本很重要,我就是由于版本原因,一直报错 linux 使用 #lsb_release -a查看当前linux系统版本. 本例:CentOS Linux release 7.0.1406 (Core) jdk 使用 # java -version查看当前版本,如果没有,先装好.downl

Linux环境下Apache配置多个虚拟主机挂载多站点同时运行

这样一种场景:我们有一台服务器:但是想挂多个网站:那么Apache下配置虚拟主机可以满足这个需求: 比较简单的是基于主机名的配置步骤如下: 示例环境 ip:115.28.17.191 域名:baijunyao.com thinkbjy.com 目录  /var/www/html/baijunyao /var/www/html/thinkbjy 1:修改hosts文件 [[email protected] /]# ifconfig;              //查看ip并记录自己的ip地址 [[

多网卡环境下Eureka服务注册IP选择问题

一.问题场景 服务器上分别配置了eth0, eth1和eth2三块网卡,只有eth1的地址可供其它机器访问,eth0和eth2的 IP 无效.在这种情况下,服务注册时Eureka Client会自动选择eth0作为服务ip, 导致其它服务无法调用. 二.问题原因 由于官方并没有写明Eureka Client探测本机IP的逻辑,所以只能翻阅源代码.Eureka Client的源码在eureka-client模块下,com.netflix.appinfo包下的InstanceInfo类封装了本机信息

让nginx反向代理能够记录来自客户端的真实IP地址

上一节,我们说到了让Nginx能够正确识别用户到底访问的是哪个虚拟主机的域名,本章,我们讨论一下,如何让Nginx能够记录来自客户端的真实IP地址. 1.首先,我们看一下httpd的访问日志,看看客户端的IP地址是哪一个? 192.168.1.6 - - [29/Apr/2015:07:51:07 +0800] "GET / HTTP/1.0" 200 13 192.168.1.6 - - [29/Apr/2015:07:51:07 +0800] "GET / HTTP/1.

使用Nginx自带的Realip模块获取用户真实IP

(一)简要说明 如果你的Web服务器前端有代理服务器或CDN时日志中的$remote_addr可能就不是客户端的真实IP了.比较常用的解决方法有以下三几种,本文将主要介绍如何使用Nginx自带realip模块来解决这一问题 : 1,用CDN自定义IP头来获取 2,通过HTTP_X_FORWARDED_FOR获取IP地址 3,使用Nginx自带模块realip获取用户IP地址 ngx_realip模块究竟有什么实际用途呢?为什么我们需要去改写请求的来源地址呢?答案是:当Nginx处理的请求经过了某

Windows7环境下Apache连接MySQL提示“连接已重置”的解决办法

win7下手动搭建wamp环境,碰到的几个坑总结下, 1.能正常访问php和html类型文件,但是访问项目文件时老是连接被重置,后来总结是数据库的问题,就写测试用例测试php能否成功调用数据库, 1 <?php 2 echo "mysql"; 3 4 $mysql_conf = array( 5 'host' => '127.0.0.1', 6 'db' => 'drupal628', 7 'db_user' => 'root', 8 'db_pwd' =>

Win7环境下Apache+mod_wsgi本地部署Django

django基础已经掌握的同学可以尝试将项目发布已寻找些许成就感,以鼓励自己接下来进行django的进阶学习 以前你总是使用python manage.py runserver进行服务启动,但是却不知: runserver是单线程服务,Apache支持多线程,性能不再一个等级 runserver在debug模式下才能使用静态文件,而debug模式下运行会留存很多debug信息,时间长了内存爆炸 runserver挂了就GG,但是Apache很稳定,就算挂了,也只挂掉wsgi线程 runserve