今天我将演示 OpenResty Edge 的另一项功能。通过特殊的请求头将真实的客户端 IP 地址传递给后端服务器。一般来说,后端服务器或源站看到的客户端 IP 地址不是真实的客户端 IP 地址, 而是网关或代理服务器的 IP。如果源站需要真实的客户端 IP 地址,我们需要创建一个新的请求头,并把这个真实的地址放在请求头里。这样一来,后端服务器就可以直接读取请求头。

Embeded image

为应用设置页面规则

让我们进入 OpenResty Edge 的 Admin Web 控制台。这就是我们控制台的样本部署。每个用户都有自己的本地部署。

Screenshot

我们可以继续使用之前的示例应用,test-edge.com。

Screenshot

进入该应用。

Screenshot

在之前的教程中我们已经创建了一个上游。

Screenshot

我们为这个 “my backend” 上游定义了一个后端服务器。

Screenshot

请记住这个后端服务器的 IP 地址是以 “.100” 结尾的。在后面会用到这个 IP 地址。

Screenshot

我们也已经定义好了一个页面规则。

Screenshot

该页面规则设置了一个反向代理到我们刚才看到的上游。

Screenshot

现在我们要添加一个新的页面规则,将客户 IP 设置为 “X-Forwarded-For” 请求头。

Screenshot

首先启用一个规则条件来检查 URI “/test-client-ip/”。

Screenshot

这里列出了所有我们可以选择的变量。

Screenshot

选择 “URI”。

Screenshot

我们选择的运算符是 “字符串等于”。

Screenshot

Screenshot

输入 URI “/test-client-ip/”。

Screenshot

现在添加一个新的动作。

Screenshot

这里可以使用搜索。

Screenshot

搜索 “设置代理头”。

Screenshot

选中它。

Screenshot

输入头的名称,“X-Forwarded-For”。对于这样的需求来说这是一个经常会用到的请求。也可以使用任何你喜欢的其他名称,比如 “X-Real-IP”。

Screenshot

选择值的类型。我们可以为请求指定一个字符串值。

Screenshot

或指定 OpenResty Edge 提供的内置变量。

Screenshot

这是目前支持的几个内置变量,将来会支持更多的内置变量。

Screenshot

这里我们选择 “客户端地址”。

Screenshot

点击这里确保这个规则在任何现有的正常规则之前运行。

Screenshot

保存这个页面规则。

Screenshot

像往常一样,需要发布一个新的版本来推送我们刚才的改动。

Screenshot

点击这个按钮。

Screenshot

发布!

Screenshot

新版本现在已经同步到所有的网关服务器上了。

Screenshot

现在,新的页面规则已经被推送到所有的网关集群和服务器。

Embeded video

Embeded video

这些配置的变化不需要服务器重载、重启或二进制升级。所以它是非常高效和可扩展的。

Embeded image

测试

现在让我们发送测试请求到网关服务器。然后我们检查后端服务器收到的 “X-Forwarded-For” 请求头。

Embeded image

使用终端登录到英国伦敦的一个远程服务器。

Screenshot

请记住这个服务器的IP地址是以 “.240 ” 结尾的。

Screenshot

登录到服务器上。

Screenshot

用 “curl” 命令行工具发送一个 HTTP 请求。

curl http://test-edge.com/test-client-ip/

Screenshot

所以这个请求的真实客户端 IP 也应该是以 “.240” 结尾的。

Screenshot

退出服务器。

Screenshot

现在登录 IP 地址结尾是 “.100” 的后端服务器。

Screenshot

看一下 nginx 配置文件中定义的访问日志格式。

cd /usr/local/openresty/nginx/

Screenshot

显示 nginx 配置文件的前 30 行。

Screenshot

找到 “log format” 指令。

Screenshot

注意 “X-Forwarded-For” 头的值是访问日志信息的最后一个字段。

Screenshot

检查后端服务器的访问日志文件中的最后一行。

clear
tail -1 logs/access.log

Screenshot

转发请求的 “X-Forwarded-For” 头确实是以 “.240” 结尾的 IP 地址。

Screenshot

真正的客户端的 IP 地址就在请求头中。

Embeded image

现在登录到另一台位于美国旧金山的服务器。

Screenshot

请记住这个服务器的 IP 地址是以 “.226” 结尾的。

Screenshot

登录到服务器上。

Screenshot

发送一个测试请求。

curl http://test-edge.com/test-client-ip/

Screenshot

所以这个请求的真实客户 IP 应该也是以 “.226” 结尾的。

Screenshot

退出服务器。

Screenshot

检查后端服务器访问日志文件中的最后一行。

Screenshot

不出所料,转发请求的 “X-Forwarded-For” 头确实是以 “226” 结尾的。

Screenshot

真正的客户端的 IP 地址又出现在请求头中。

有时,OpenResty Edge 网关服务器本身可能在另一个代理后面。在这种情况下,OpenResty Edge 也需要从一些特殊的请求头中读取真实的客户端 IP 地址。这个话题我们会在另外一个教程里讨论。

Embeded image

这就是我今天要讲的内容。

如果你喜欢这个教程,请订阅这个博客网站和我们的 YouTube 频道B 站频道。谢谢!

关于本文和关联视频

本文和相关联的视频都是完全由我们的 OpenResty Showman 产品从一个简单的剧本文件自动生成的。

关于作者

章亦春是开源 OpenResty® 项目创始人兼 OpenResty Inc. 公司 CEO 和创始人。

章亦春(Github ID: agentzh),生于中国江苏,现定居美国湾区。他是中国早期开源技术和文化的倡导者和领军人物,曾供职于多家国际知名的高科技企业,如 Cloudflare、雅虎、阿里巴巴, 是 “边缘计算“、”动态追踪 “和 “机器编程 “的先驱,拥有超过 22 年的编程及 16 年的开源经验。作为拥有超过 4000 万全球域名用户的开源项目的领导者。他基于其 OpenResty® 开源项目打造的高科技企业 OpenResty Inc. 位于美国硅谷中心。其主打的两个产品 OpenResty XRay(利用动态追踪技术的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最适合微服务和分布式流量的全能型网关软件),广受全球众多上市及大型企业青睐。在 OpenResty 以外,章亦春为多个开源项目贡献了累计超过百万行代码,其中包括,Linux 内核、Nginx、LuaJITGDBSystemTapLLVM、Perl 等,并编写过 60 多个开源软件库。

关注我们

如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:

我们的微信公众号

翻译

我们提供了英文版原文和中译版(本文) 。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!