背景:

       公司现有一台nginx+lua程序对外提供地理位置查询,因为要上https所以打算直接放到haproxy后面,后面发现nginx+lua程序无法获取到客户端IP的问题(原nginx读的remote_addr地址,加到haproxy后台获取的是HA的地址),本计划通过x_forwarded_for头部来判断用户的真实IP但是默认haproxy会继承客户端传过来的IP(其实这个问题后来也解决了见这篇文章<<haproxy移除x-forwarded-for头>>),所以只能在在haproxy上增加自定义头X-TEST-IP将用户的IP赋予这个IP,但这样也存在问题(用户如果直接调用nginx+lua将获取不到用户真实IP),所以需要在nginx lua程序需要做一些判断来确定真实IP问题,lua脚本是如何判断用户IP呢,见下面步骤及实现的具体代码:

1、首先定义变量IP

2、判断X-TEST-IP header是否存在,如果存在则使用此IP
3、如果X-TEST-IP头没有IP的话,尝试获取请求头中x_forwarded_for变量的IP

4、如果没有x_forwarded_for头的话测获取remote_addr

具体实现代码如下:

local IP

IP = ngx.req.get_headers()["X-TEST-IP"]

if IP == nil then

    IP = ngx.req.get_headers()["x_forwarded_for"]

end

if IP == nil then

    IP = ngx.var.remote_addr

end

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注