前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nginx未被编译模块添加安装及日志记录负载均衡的真实客户端IP

nginx未被编译模块添加安装及日志记录负载均衡的真实客户端IP

原创
作者头像
阿湫..
发布2023-08-04 09:56:52
3220
发布2023-08-04 09:56:52
举报
文章被收录于专栏:阿湫专栏阿湫专栏

场景介绍: 有的时候nginx后续需要安装新的模块 比如服务器的nginx日志需要记录clb(负载均衡)转发过来的真实客户端ip,而不是clb的内网ip,此时需要有安装--with-http_realip_module

模块的检测安装

检测版本

nginx -V (注意是大写的V) 查看对应的nginx版本 以及当时的 configure arguments: 即当时编译安装的nginx参数项 是否有你要的 --with-http_realip_module 配置,如果有了就直接后续改配置,如果没有那就先安装对应的模块

代码语言:shell
复制
[root@xxx local]# nginx -V
nginx version: nginx/1.10.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module

模块安装

代码语言:shell
复制
#下载对应版本的nginx
cd /usr/local/src/
wget http://nginx.org/download/nginx-x.x.x.tar.gz
#解压进入对应版本的nginx源码包
tar zxf nginx-x.x.x.tar.gz
cd /usr/local/src/nginx-x.x.x
#在原配置的基础上加上你想要补充安装的模块 --with-http_realip_module
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --with-http_realip_module
#检测配置并编译(切记不需要make install)
echo $?
0
make
#编译完成后会在当前目录下生成一个 objs/nginx 二进制文件

备份源文件并替换nginx的二进制文件

代码语言:shell
复制
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
cp objs/nginx /usr/local/nginx/sbin/nginx

再次验证模块是否安装

代码语言:shell
复制
[root@xxx local]# nginx -V
nginx version: nginx/1.10.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --with-http_realip_module

配置nginx记录负载均衡代理的真实客户端IP

查看原clb的内网ip段

代码语言:shell
复制
#查看项目对应配置的access_log 文件
100.122.17.53 - - [03/Aug/2023:16:49:15 +0800] "GET / HTTP/1.1" 200 332 "-" "curl/7.68.0"
100.122.17.39 - - [03/Aug/2023:16:49:16 +0800] "GET / HTTP/1.1" 200 332 "-" "curl/7.68.0"
100.122.17.34 - - [03/Aug/2023:16:49:35 +0800] "GET / HTTP/1.1" 200 257 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
100.122.17.32 - - [03/Aug/2023:16:49:37 +0800] "GET /favicon.ico HTTP/1.1" 200 16958 "https://ht.xckeji1.cn/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
100.122.17.112 - - [03/Aug/2023:16:50:59 +0800] "GET / HTTP/1.1" 200 332 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:47.0) Gecko/20100101 Firefox/47.0"
100.122.17.35 - - [03/Aug/2023:16:51:15 +0800] "GET / HTTP/1.1" 200 257 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
...
#得知上面的clb内网ip段是  100.122.17.xx

修改配置获取真实IP

nginx.conf 中的 http 块配置日志格式

代码语言:txt
复制
http
{
    ...
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    ...
}

对应项目的 www.xxx.com.conf 中的 最后一个 location / 入口块配置set_real_ip_from,因为我的所有项目的配置最后都有加 include php.conf; 且有最后的 location 入口配置,所以我的配置写在了php.conf 中

代码语言:txt
复制
location ~ [^/]\.php(/|$)
        {
            ...
            set_real_ip_from 100.122.0.0/16;
            real_ip_header X-Forwarded-For;
            ...
        }

注意:阿里云的CLB真实的客户端源IP默认存放在HTTP头部的X-Forwarded-For字段,格式类似于 X-Forwarded-For: <用户真实IP, 代理服务器1-IP, 代理服务器2-IP,...> 如果是自建的负载均衡需要自行配置转发客户端的ip到 X-Forwarded-For 的header头中

检测真实ip获取

nginx -tnginx -s reload 检测配置并重启,而后访问你的站点再次查看对应的日志文件的ip是否是你的客户端真实ip,正常情况下此时的 $remote_addr 应该获取的就是真实ip,"$http_x_forwarded_for" 一般还是为空 这个是客户端使用了代理的情况下才记录

参考地址:

nginx添加未被编译的模块

保留客户端真实源地址

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 模块的检测安装
    • 检测版本
      • 模块安装
        • 备份源文件并替换nginx的二进制文件
          • 再次验证模块是否安装
          • 配置nginx记录负载均衡代理的真实客户端IP
            • 查看原clb的内网ip段
              • 修改配置获取真实IP
                • 检测真实ip获取
                相关产品与服务
                负载均衡
                负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档