Openresty配置Nginx并在ELB后获取用户真实IP,nginxelb


Openresty安装及介绍

openresty中文站:link
配置nginx环境变量:
以默认安装路径/usr/local/openresty/nginx/为例
export PATH=$PATH:/usr/local/openresty/nginx/sbin
测试是否配置成功:

[root@xxx ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/openresty/nginx/sbin

以及

[root@xxx ~]# nginx -V
nginx version: openresty/1.13.6.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/openresty/nginx --with-cc-opt=-O2 --add-module=../ngx_devel_kit-0.3.0 --add-module=../echo-nginx-module-0.61 --add-module=../xss-nginx-module-0.06 --add-module=../ngx_coolkit-0.2rc3 --add-module=../set-misc-nginx-module-0.32 --add-module=../form-input-nginx-module-0.12 --add-module=../encrypted-session-nginx-module-0.08 --add-module=../srcache-nginx-module-0.31 --add-module=../ngx_lua-0.10.13 --add-module=../ngx_lua_upstream-0.07 --add-module=../headers-more-nginx-module-0.33 --add-module=../array-var-nginx-module-0.05 --add-module=../memc-nginx-module-0.19 --add-module=../redis2-nginx-module-0.15 --add-module=../redis-nginx-module-0.3.7 --add-module=../rds-json-nginx-module-0.15 --add-module=../rds-csv-nginx-module-0.09 --add-module=../ngx_stream_lua-0.0.5 --with-ld-opt=-Wl,-rpath,/usr/local/openresty/luajit/lib --with-stream --with-stream_ssl_module --with-http_ssl_module

configure argument中介绍了openresty的安装配置参数

配置ELB

大多数ELB默认开启了真实用户ip传递功能,其中,七层默认开启,四层(TCP)需要安装TOA插件。
注意,在ELB配置监听器时,需要使用HTTP 80端口或者HTTPS 443端口,如果配置的是TCP 80端口的监听器,如果不安装TOA插件,后端是无法拿到用户真实的client ip的。

安装http_realip_module

关闭nginx:
nginx -s stop
查看是否关闭:
ps -ef|grep nginx
安装http_realip_module插件
cd 到 openresty安装包目录
./configure --with-http_realip_module
gmake
gmake install
查看插件是否安装成功:
nginx -V
如果看到末尾有 --with-http_realip_module,说明插件安装成功。

在Nginx.conf中配置获取用户真实ip

server {
        listen 80;
	    listen 8080;

        location / {
			proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

   			content_by_lua_block {
                local uri = ngx.var.uri
                --ngx.say("var uri :"..uri)

                local host = ngx.var.host

                -- take the real client ip from ELB
                
                local proxy_ip_list = ngx.var.proxy_add_x_forwarded_for
                
                if proxy_ip_list then
                    local clientipEnd = string.find(proxy_ip_list, ',', 1)
                    if clientipEnd then
                        client_ip = string.sub(proxy_ip_list, 0, clientipEnd - 1)
                    end
                end

其中,ngx.var.proxy_add_x_forwarded_for中存储的是链式结构的访问ip信息
ip1, ip2, ip3
其中ip1是访问用户的真实ip,而后续ip2, ip3均为负载均衡器ip。
通过lua代码,可以拿到真实的client_ip。

相关内容

    暂无相关文章