在Apache服务器上如何从HTTP header中提取客户端X-ClientIP

简介:

  在很多负载均衡设备的部署过程中,我们都无法更改服务器的网关(Gateway)地址,不能将其指向负载均衡设备,通常我们把这种部署方式称之为“单臂”或者“旁路”部署。在这种部署方式下,往往在负载均衡设备上需要启用源地址转换(Source NAT)功能,以保证服务器返回的数据包都通过负载均衡设备。如图所示,其中“AX-IP”就是配置在负载均衡设备上的Source NAT Pool里的地址:

 

image

        另外,在部署过程中,开启TCP连接复用功能,也需要在负载均衡设备上启用源地址转换功能,开启这种转换功能最大的一个问题就是,服务器端无法从TCP 数据包头中获取到发送HTTP请求的客户端真实IP地址,这样就会影响到系统的访问统计和审计等。为了给Web服务器提供客户端的真实IP,通常负载均衡设备的做法是将真实IP地址插入到HTTP header中,起一个字段名,例如“X-ClientIP”或者“X-forwarded-for”等。Web服务器提取该字段的值,即客户端真实IP地址,将其作为统计的依据即可。那么如果提取呢?下面,我们以Apache服务器为例给大家简单介绍一下提取的方法:

1、首先,在AX设备上配置相应的HTTP模板,并在VIP的虚拟端口(vport)下启用该HTTP模板;

image

2、在Apache服务器上编辑httpd.conf文件

        httpd.conf文件缺省是安装在Unix或者Linux的/etc/apache目录下,Windows系统的:\Program files\Apache Software Foundation\Apache\conf目录下。编辑该文件,在以“LogFormat”开头的最后一行下面,添加自定义的log格式,如下红色字体所示:

       LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 
       LogFormat "%h %l %u %t \"%r\" %>s %b \"%{User-Agent}i\" \"%{Cookie}i\"" common 
       LogFormat "%{Referer}i -> %U" referer 
       LogFormat "%{User-agent}i" agent

       LogFormat "%{X-ClientIP}i %l %u %t \"%r\" %>s %b" AX-log 
3、在httpd.conf文件中,找到以“CustomLog”开头的行,将其注释掉,并添加如下的Log格式:

      # Test if header ″X-ClientIP″ is present, log format uses ″AX-log″ 
      SetEnvIf X-ClientIP ″^$″ req-non-proxy 
      CustomLog logs/access.log AX-log env=req-non-proxy

4、保存httpd.conf文件,并重启Apache服务进程;

      我们可以尝试访问AX设备上的虚拟服务器VIP地址,并在对应的Apache服务器日志中,验证是否已经配置成功。

 

S.G


本文转自 virtualadc 51CTO博客,原文链接:


http://blog.51cto.com/virtualadc/830034



相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
17天前
|
XML Java 数据格式
Servlet 教程 之 Servlet 服务器 HTTP 响应 3
`Servlet`教程示例展示了如何创建一个HTTP响应,使用`@WebServlet("/Refresh")`的`Refresh`类继承`HttpServlet`。在`doGet`方法中,设置了`Refresh`头以每5秒自动刷新,并用`setContentType("text/html;charset=UTF-8")`设定内容类型。还使用`Calendar`和`SimpleDateFormat`获取并格式化当前时间显示。相应的`web.xml`配置指定了Servlet路径。当访问此Servlet时,页面将每5秒更新一次显示的系统时间。
20 4
|
23小时前
|
应用服务中间件 网络安全 数据安全/隐私保护
通过Python行命令搭建HTTP服务器结合内网穿透实现外网访问
通过Python行命令搭建HTTP服务器结合内网穿透实现外网访问
7 0
|
1天前
|
安全 Linux 网络安全
Linux _ apache服务器部署 不同域名—访问不同网站(多网站)
Linux _ apache服务器部署 不同域名—访问不同网站(多网站)
|
6天前
|
Apache 项目管理 数据安全/隐私保护
Windows安装TortoiseSVN客户端结合Cpolar实现公网提交文件到本地服务器
Windows安装TortoiseSVN客户端结合Cpolar实现公网提交文件到本地服务器
|
7天前
|
Apache 项目管理 数据安全/隐私保护
TortoiseSVN客户端如何安装配置并实现公网访问服务端提交文件到本地服务器
TortoiseSVN客户端如何安装配置并实现公网访问服务端提交文件到本地服务器
|
8天前
|
中间件 Go
【Go语言专栏】使用Go语言编写HTTP服务器
【4月更文挑战第30天】本文介绍了如何使用Go语言创建基本的HTTP服务器,包括设置路由、处理请求和响应。首先确保安装了Go环境,然后引入`net/http`包,定义路由和处理器函数。处理器函数接收`http.ResponseWriter`和`*http.Request`参数,用于发送响应和处理请求。使用`http.ListenAndServe`启动服务器,并可通过中间件增强功能。文章还提及了处理复杂请求、查询参数和POST数据的方法,以及使用第三方库如Gin和Echo扩展功能。通过本文,读者可掌握Go语言编写HTTP服务器的基础知识。
|
9天前
|
弹性计算 监控 Shell
监控HTTP 服务器的状态
【4月更文挑战第29天】
10 0
|
9天前
|
弹性计算 Shell Apache
某时间段访问apache 服务器的请求IP
【4月更文挑战第29天】
16 2
|
9天前
|
弹性计算 Shell Apache
|
9天前
|
JSON 编解码 Go
Golang深入浅出之-HTTP客户端编程:使用net/http包发起请求
【4月更文挑战第25天】Go语言`net/http`包提供HTTP客户端和服务器功能,简化高性能网络应用开发。本文探讨如何发起HTTP请求,常见问题及解决策略。示例展示GET和POST请求的实现。注意响应体关闭、错误处理、内容类型设置、超时管理和并发控制。最佳实践包括重用`http.Client`,使用`context.Context`,处理JSON以及记录错误日志。通过实践这些技巧,提升HTTP编程技能。
23 1

推荐镜像

更多