代理服务器可分为正向代理服务器反向代理服务器

正向代理

      正向代理服务器是一个位于客户端与原服务器之间的服务器。为了从原服务器中获得数据,客户端向代理服务器发送请求并指定目标,然后代理服务器向原始服务器转交请求,并将获得的内容返回客户端。比如我们使用代理科学上网。
      正向代理服务器一般作用在客户端,并且在客户端需要进行相关配置。
正向代理

反向代理

      反向代理服务器作用在服务端,它在服务器端接收互联网中的连接请求,然后将请求转发给内部网络中的服务器,并将从服务器中得到的结果返回给互联网中请求连接的客户端。
      反向代理对外是透明的,在客户端不需要任何配置,所以访问者并不知道自己访问的是一个反向代理服务器。

如果我们的服务器开放的端口数量不足,可以使用反向代理来解决

反向代理

常使用反向代理实现负载均衡

请输入图片描述

正向代理实验

实验说明

      实验的网络图如下所示:
请输入图片描述

      基于 Nginx 的内置变量 $remote_addr 查看访问者IP。在两台服务器上修改原有的log_format。

log_format main 'client send request=> clientIP=$remote_addr serverIP=$host';

      未使用正向代理服务器之前,客户端直接访问服务器,日志中记录了访问者的 IP 为客户端 IP 。

client send request=> clientIP=192.168.233.1 serverIP=192.168.233.130
client send request=> clientIP=192.168.233.1 serverIP=192.168.233.130

实现正向代理

      正向代理服务器上的配置如下:

resolver 8.8.8.8;# 设置DNS的IP 用来解析 proxy_pass 中的域名
location / {
    proxy_pass http://$host$request_uri;
}

      客户端需要配置我们的正向代理服务器地址。就像我们科学上网时需要配置VPN一样。步骤如下:
请输入图片描述

请输入图片描述

请输入图片描述

      现在我们直接访问目标服务器,查看访问日志可以发现此时的客户端IP不是原来的客户端IP了,而是正向代理服务器的IP。

client send request=> clientIP=192.168.233.131 serverIP=192.168.233.130
client send request=> clientIP=192.168.233.131 serverIP=192.168.233.130
client send request=> clientIP=192.168.233.131 serverIP=192.168.233.130

反向代理实验

实验说明

      实验网络拓扑图和正向代理的差不多,只是中间的服务器变为了反向代理服务器而已。
请输入图片描述

深入反向代理

      Nginx 的反向代理模块的指令是由 ngx_http_proxy_module 模块进行解析的,该模块是默认安装的。反向代理中的常用指令有: proxy_passproxy_set_headerproxy_redirect

proxy_pass

      该指令用来设置被代理服务器地址,可以是主机名称、IP地址加端口号的形式。

语法: proxy_pass URL; # URL包含传输协议、主机名称或IP地址加端口号、URI等要素
默认: —
上下文: location

      反向代理服务器上的配置如下:

location / {
    proxy_pass http://192.168.233.130;
}

      与正向代理实验不同,我们需要访问反向代理服务器,可以发现最后居然展示的是目标服务器的页面。

展示一个坑

      请问如下两种 proxy_pass 配置有什么区别呢?

proxy_pass http://192.168.233.130;
proxy_pass http://192.168.233.130/;

      表面上看只是结尾是否加 '/' 的区别,但是这里有一个小坑。若 proxy_pass 所在的 location/,万事大吉,相安无事!可是,如果 location 后的路径加上了其他玩意,完了,区别大大的。如下配置所示:

# 不加/
location /test {
    proxy_pass http://192.168.233.130;
}

# 加上/
location /test {
    proxy_pass http://192.168.233.130/;
}

      使用前者配置直接 404 Not Found, 尴尬。后者配置没毛病!
请输入图片描述

结论:如果不加/,location后的路径会直接拼接上,加上/则不拼接。

proxy_set_header

      顾名思义,该指令可以更改Nginx服务器接收到的客户端请求的请求头信息,然后将新的请求投发送给代理的服务器。

语法: proxy_set_header field value;
默认: proxy_set_header Host $proxy_host
      proxy_set_header Connection close;
上下文: http, server, location

注意:若想要查看结构,则需要在被代理的服务器上查看头信息。

      被代理服务器(131)配置如下:

server {
    listen 8080;
    server_name localhost;
    default_type text/plain;
    return 200 $http_username;# 返回传递过来的username
}

      反向代理服务器(130)配置如下:

server {
    listen 8080;
    location / {
        proxy_pass http://192.168.233.131:8080/;
        proxy_set_header username CatWing;
    }
}

请输入图片描述

proxy_redirect

      该指令用来重置头信息中的"Location"和"Refresh"的值。

语法: proxy_redirect redirect replacement;
      proxy_redirect default;
      proxy_redirect off;
默认: proxy_redirect default;
上下文: http, server, location

      被代理服务器(131)配置如下:

server {
    listen 8081;
    server_name localhost;
    #if (!-f $request_filename){
    #    return 302 http://192.168.233.131/;
    #}
    location / {
        root   /usr/local/nginx/html;
        index  index.html index.htm;
        if (!-f $request_filename){ # 如果访问路径不存在,跳转到欢迎页
            return 302 http://192.168.233.131/;
        }
    }
}

      反向代理服务器(130)配置如下:

server {
    listen 8081;
    server_name localhost;
    location / {
        proxy_pass http://192.168.233.131:8081/;
    }
}

      访问如下地址:http://192.168.233.130:8081/abc.html(此路径不存在)。页面没有展示404 Not Found,似乎已经达到了我们的需求,可是,目标服务器的地址却暴露了,这可不是我们希望的。
请输入图片描述

请输入图片描述

      通过curl命令可以发现请求头中的Location为131, 借助proxy_redirect可以将其修改。修改反向代理服务器配置如下:

server {
    listen 8081;
    server_name localhost;
    location / {
        proxy_pass http://192.168.233.131:8081/;
        proxy_redirect http://192.168.233.131 http://192.168.233.130;
    }
}

请输入图片描述
      额!地址是变化了,可是欢迎页不是目标服务器的呀!还需要配置一个反向代理。

server {
    listen       80;
    server_name  localhost;
    location / {
        proxy_pass http://192.168.233.131/;
    }
}

请输入图片描述

请输入图片描述

完美!

Last modification:April 18th, 2021 at 05:08 pm
如果觉得我的文章对你有用,请随意赞赏