首页 > 系统相关 >Nginx反向代理&记录用户IP地址企业案例

Nginx反向代理&记录用户IP地址企业案例

时间:2023-06-25 23:25:50浏览次数:43  
标签:10.0 www log IP access Nginx html 反向 IP地址

反向代理机器节点:
lb01 10.0.0.30    #lb01是反向代理服务器(包括负载均衡的功能)
www01 10.0.0.40 
www02 10.0.0.50

【演示反向代理功能】

 图片解读:

  • 使用客户端机器www01,访问负载均衡lb01(反向代理),看到了www01,www02页面信息
  • 在www01服务器上检测客户端信息,发现请求是10.0.0.30发来的,这不是lb01吗
  • 但是我们请求明明是www01发出的

这就是反向代理的含义,用户请求发送给了反向代理,反向代理再次发出一个请求

【如何解决这个问题呢,扑捉到真实的客户端的IP,而非代理服务器呢?】

X-Forwarded-For

 在反向代理请求后端节点服务器的请求头中添加获取客户端IP的字段信息,然后在后端节点可以通过程序或者相关配置接收X-Forwarded-For传过来的真实用户的IP信息。

【lb01反向代理节点配置如下】

部分nginx.conf代码如下,注意重点修改的部分

    upstream www_pools {
        server 10.0.0.40;
        server 10.0.0.50;

}

    server {
        listen       80;
        server_name  www.junwu.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://www_pools;
            proxy_set_header Host $host;
           #添加此处代码,代理服务器向后端发送HHTP请求时,请求头中添加该参数信息,用于后端服务器程序、日志等接受真实用户的IP,而非是代理服务器的IP
            proxy_set_header X-Forwarded-For $remote_addr;
}

重新加载lb01的nginx

[root@lb01 ~]# nginx -s reload

特别注意,不仅要在代理服务器配置,添加获取真实IP的字段,还要在节点服务器中添加配置,接受用户真实的IP,配置日志格式等操作。

【修改节点服务器www01的nginx.conf】

部分代码修改如下,关注重点修改的部分

http {
    include       mime.types;
    default_type  application/octet-stream;
#重点在于此处,添加结尾的参数$http_x_forwarded_for,即可在日志中获取客户端的真实IP
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
#还有此处的日志格式配置,一定一定要在后面添加main参数,才能在日志中展现客户端IP
    access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  www.bbq.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html/bbq;
            index  index.html index.htm;
 }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        }
    server {
        listen       80;
        server_name  www.mxj.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html/mxj;
            index  index.html index.htm;
        }

测试效果一

检查10.0.0.40节点的日志信息
[root@www01 ~]# tail -f /opt/nginx-1.25.1/logs/access.log 
10.0.0.30 - - [25/Jun/2023:10:56:31 -0400] "GET / HTTP/1.0" 200 46 "-" "curl/7.29.0"
10.0.0.30 - - [25/Jun/2023:10:56:33 -0400] "GET / HTTP/1.0" 200 46 "-" "curl/7.29.0"
10.0.0.30 - - [25/Jun/2023:10:56:52 -0400] "GET / HTTP/1.0" 200 46 "-" "curl/7.29.0" "10.0.0.40"
10.0.0.30 - - [25/Jun/2023:10:57:01 -0400] "GET / HTTP/1.0" 200 46 "-" "curl/7.29.0" "10.0.0.40"
#日志解析
10.0.0.30显示的是远程访客的地址,也就是lb01负载均衡发来的请求
“10.0.0.40”是通过X-Forwarded-For参数获取到的真实客户端的ip

测试效果二

我们在另外一台节点服务器10.0.0.50上访问负载均衡器
[root@www02 ~]# curl www.junwu.com
这是网站www.bbq50.com
[root@www02 ~]# curl www.junwu.com
<meta charset=utf8>
这是网站www.bbq40.com
[root@www02 ~]# curl www.junwu.com
这是网站www.bbq50.com
##然后在另一台www01节点服务器上查看日志
10.0.0.30 - - [25/Jun/2023:11:02:50 -0400] "GET / HTTP/1.0" 200 46 "-" "curl/7.29.0" "10.0.0.50"
最终通过日志,发现检测到了真实发请求的,其实是www02机器,ip为10.0.0.50

总结

  • nginx的access.log日志,其日志格式里$remote_addr变量,表示远程客户端的IP地址(可能是代理IP地址)
  • $http_x_forwarded_for变量,是接收了在反向代理中配置的proxy_set_header X-Forwarded-For $remote_addr,获取了用户真实的IP(躲在代理IP后)

当然这里的X-Forwarded-For并不是万能的,所谓道高一尺魔高一丈,对于代理的形式还有很多种。

 

标签:10.0,www,log,IP,access,Nginx,html,反向,IP地址
From: https://www.cnblogs.com/junwured/p/17504128.html

相关文章

  • Nginx 优化
    目录一、Nginx隐藏版本号1.访问网站查看版本号2.隐藏方法3.刷新网页二、Nginx更改版本号1.修改Nginx源码文件2.重新编译安装3.将隐藏版本号设置打开4.刷新网页三、Nginx日志分割1.编写shell脚本2.运行脚本3.创建定时任务四、Nginx压缩页面1.更改配置文件2.清空......
  • Ingress-Nginx 灰度(金丝雀)发布
    使用Ingress-Nginx进行灰度(金丝雀)发布Ingress-NginxCanary介绍NginxIngressController作为项目对外的流量入口和项目中各个服务的反向代理。官方文档概述:Annotations-Ingress-NginxController(kubernetes.github.io)NginxAnnotations的几种Canary规则:Annota......
  • nginx
    Nginx是一种高性能的Web服务器软件,它可以作为反向代理服务器、负载均衡器、HTTP缓存、静态资源服务器等用途。Nginx的主要作用包括:静态资源服务器:Nginx支持快速、高效地响应静态文件的请求,包括HTML页面、CSS文件、图片等。它可以快速地将静态资源缓存起来,提高Web应用的访问速度......
  • 反向传播算法的理解
    反向传播算法--求偏导速度大大提升(一次求解)https://zhuanlan.zhihu.com/p/250816711用计算图来解释几种求导方法:1.1计算图式子e=(a+b)∗(b+1) 可以用如下计算图表达:令a=2,b=1则有:      所以上面的求导方法总结为一句话就是:路径上所有边相乘,所有......
  • Nginx https配置http的图片服务
    1.在Nginx配置网站的https服务#HTTPSserver#server{listen443ssl;server_namelocalhost,10.11.1.68;ssl_certificateca.crt;ssl_certificate_keyca.key;ssl_session_cacheshared:SSL:1m;......
  • Keepalived+Nginx 高可用集群架构
                                  Keepalived+Nginx高可用集群(主从模式)                                             ......
  • 【Nginx】- 优化实践
    Nginx的优化Linux安装Nginx安装依赖包//一键安装下面四个依赖gcc/zlib/prec-devel/opensslyum-yinstallgcczlibzlib-develpcre-developensslopenssl-devel因为Nginx依赖于gcc的编译环境,所以,需要安装编译环境来使Nginx能够编译起来yuminstallgcc-c++Nginx......
  • Nginx的stub_status
    Nginx的stub_status模块是一个官方提供的一个用于实时监控Nginx服务器状态信息的模块。它通过HTTP接口提供了一个简单的页面,展示了当前Nginx服务器的关键性能指标和连接状态。启用stub_status模块后,可以通过访问特定的URL来获取Nginx的状态信息。默认情况下,该URL为http://y......
  • 如何在nginx增加健康检查接口?
    在docker中部署的nginx或者在nginx部署的nginx一般是需要一个健康检查接口的 这样的话,就可以确定容器当前的状态是否是健康的 那么,如何给nginx增加一个健康检查的接口呢? 接下来呢,我们就演示一个在nginx中如何增加健康检查的接口 1、打开nginx的配置文件(nginx.conf) ......
  • k8s 创建nginx
    1、在kubenetes集群中创建一个pod创建nginx,拉取镜像kubectlcreatedeploymentnginx--image=nginx2、查看镜像是否下载成功kubectlgetpodstatus为running表示拉取完成 3、暴露Nginx端口kubectlexposedeploymentnginx--port=80--type=NodePort4、查看Nginx端口......