Linux Nginx服务器反向代理

别说谁变了你拦得住时间么 提交于 2020-02-27 12:54:30

一、代理服务器

代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务器接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中,再发送给客户机。

举个例子: 代理 就如同生活中的专卖店~客人到adidas专卖店买了一双鞋,这个专卖店就是代理,被代理角色就是adidas厂家,目标角色就是用户。

1.1 为什么要使用代理服务器?

(1)提高访问速度:

由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次客户再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到了缓存的作用,尤其对于热门站点能明显提高请求速度。

(2)防火墙作用:

由于所有的客户机请求都必须通过代理服务器访问远程站点,因此可在代理服务器上设限,过滤某些不安全信息。

(3)通过代理服务器访问不能访问的的目标站点:

互联网上有许多开发的代理服务器,客户机在访问受限时,可通过不受限的代理服务器访问目标站点。

1.2 什么是正向代理?

一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

正向代理总结就一句话:代理端代理的是客户端。

正向代理最大的特点就:客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端。;正向代理模式屏蔽或者隐藏了真实客户端信息。

1.3 什么是反向代理?

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求,发给内部网络上的服务器并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

反向代理总结就一句话:代理端代理的是服务端。

举个例子:几乎所有人都用过淘宝,每天同时连接到淘宝网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个大家耳熟能详的名词:分布式部署;也就是通过部署多台服务器来解决访问人数限制的问题;淘宝网站中大部分功能也是直接使用nginx进行反向代理实现的,并且通过封装nginx和其他的组件之后起了个高大上的名字:Tengine
在这里插入图片描述
上图表示的是全国各地的用户在淘宝客户端发出请求,经过了Nginx 反向代理服务器,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理。

特点:此时请求的来源客户端是明确的,但是请求具体由哪台服务器处理的并不明确了。

反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息

二、Nginx反向代理获取客户端的真实IP

我们访问互联网的服务时,大多数时,客户端并不是直接访问到服务端的,而是客户端首先请求到反向代理,反向代理再转发到服务端实现服务访问。
在这里插入图片描述可以看出,nginx的反向代理实现跨域的同时也彻底改变了服务器的请求来源,隔离了用户和服务器的连接,服务端获取不到真实的客户端ip,只能获取到反向代理服务的ip,那么nginx怎样才能获取到真实的ip呢?

  • 利用Nginx中的realip模块获取用户的真实ip。将各层代理的IP排除在外,就取到了真实的用户IP,这个可以使用nginx的一个模块realip_module 来实现从XFF中抛弃指定的代理层 IP,得到一个符合规则的就是用户IP 。nginx的 realip_module 模块需要在编译nginx的时候加上参数–with-http_realip_module。

2.1 用一台服务器模拟实现获取本机ip

1、进入解压目录,添加realip_module模块,重新编译,make

 ./configure --prefix=/usr/local/nginx --with-file-aio --with-http_realip_module  
  • 1

在这里插入图片描述

在这里插入图片描述
nginx -V ,查看编译参数
在这里插入图片描述

2、添加虚拟主机: vim /usr/local/nginx/conf/nginx.conf

server {
   	 listen 80;
        server_name server1;
   	 location / {
                return 200;
        }  
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述
3、开启nginx服务且测试:200 ok说明虚拟主机添加成功 (添加本机解析)
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4、检测成功时,我们让他 回应real ip

  • ==$remote_addr:代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,并不是真实客户端IP; ==. 当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP,,除非代理将你的IP附在请求header中一起转交给web服务器
server {
  	 listen 80;
       server_name server1;
  	 location / {
               return 200 "client real ip: $remote_addr\n";
       }  
       }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

5、平滑重启nginx,再次测试:

在这里插入图片描述

6、 从X-Forwarded-For中获取到真实客户端IP ,更改配置文件:vim /usr/local/nginx/conf/nginx.conf

  • X-Forwarded-For: 简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过HTTP 代理或者负载均衡服务器时才会添加该项,正如上面所述,当你使用了代理时,web服务器就不知道你的真实IP了,为了避免这个情况,代理服务器通常会增加一个叫做x_forwarded_for的头信息,把连接它的客户端IP(即你的上网机器IP)加到这个头信息里,这样就能保证网站的web服务器能获取到真实IP。
  • XFF的格式为X-Forwarded-For: client, proxy1, proxy2。 XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP(注意:如果未经严格处理,可以被伪造)。如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息X-Forwarded-For: IP0, IP1, IP2,Proxy3 直连服务器,它会给 XFF 追加 IP2,表示它是在帮 Proxy2 转发请求,列表中并没有 IP3,IP3 可以在服务端通过 Remote Address 字段获得。
server {
  	 listen 80;                    
       server_name server1;              # 添加域名
       set_real_ip_from 172.25.2.1;    # 真实服务器上一级代理的IP地址或者IP段,可以写多行
       real_ip_header X-Forwarded-For;    # 告知Nginx真实客户端IP从哪个请求头获取
       real_ip_recursive off;                       # 是否递归解析,off表示默认从最后一个地址开始解析;on表示从前往后依次递归获取ip
  	 location / {
               return 200 "client real ip: $remote_addr\n";
       }  
       }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述
7、平滑重启nginx,再次测试:curl -H “X-Forwarded-For:1.1.1.1,172.25.2.1” server1

在这里插入图片描述
当配置文件里的参数 real_ip_recursive 为off 时:

  • real_ip_recursive :是否递归解析,off表示默认从最后一个地址开始解析;on表示从前往后依次递归获取ip

在这里插入图片描述

配置文件里的参数 real_ip_recursive 为on 时:

在这里插入图片描述

2.2 配置真正的反向代理服务器

实验环境

主机信息 主机的功能(服务)
server1(172.25.2.1) 后端服务器 (nginx+http_realip_module )
server2(172.25.2.2) 反向代理服务器
真机(172.25.2.250) 用作客户端测试

1、在server1上面进行配置,修改nginx服务器默认发布页面的内容

在这里插入图片描述
在这里插入图片描述
2、修改配置文件,添加内容
在这里插入图片描述

在这里插入图片描述

3、进行语法检测,重启服务

在这里插入图片描述
4、将server1上编译好的nginx的目录发送给server2

在这里插入图片描述
5、在server2(代理服务器)上面进行配置,代理服务器的配置参考官网
在这里插入图片描述

6、编写server2代理服务器上的配置文件

在这里插入图片描述

在这里插入图片描述
7、删除代理服务器server2上面的web资源

在这里插入图片描述8、在真机上面进行测试,写解析
在这里插入图片描述

9、可以看到访问的域名对应的是server2主机的IP,但是访问到的内容却是server1的发布页

在这里插入图片描述
在server1上查看访问日志:/usr/local/nginx/logs/access.log可以看到nginx服务器可以直接获取到客户端的ip。

注释掉nginx服务器的这两行时,获取到的ip就是代理服务器的ip
在这里插入图片描述
在这里插入图片描述

在server1上查看访问日志:/usr/local/nginx/logs/access.log可以看到nginx服务器获取的ip为代理服务器的ip。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!