Nginx之正、反向代理

什么是代理

A同学在Ai大时代背景下开启他的创业之路,目前他遇到的最大的一个问题就是启动资金,于是他决定去找马云爸爸借钱,可想而知,最后碰一鼻子灰回来了,情急之下,他想到一个办法,找关系开后门,经过一番消息打探,原来A同学的大学老师王老师是马云的同学,于是A同学找到王老师,托王老师帮忙去马云那借500万过来,当然最后事成了。不过马云并不知道这钱是A同学借的,马云是借给王老师的,最后由王老师转交给A同学。这里的王老师在这个过程中扮演了一个非常关键的角色,这就是代理,也可以说是正向代理,王老师代替A同学办这件事,这个过程中,真正借钱的人是谁,马云是不知道的,这点非常关键。

正向代理

我们常用的VPN,一般为正向代理。

正向代理特点为隐藏真实的客户端,服务端不知道请求的客户端是谁,客户端请求的服务都是代理服务器代替请求。

举个例子,国内的用户想要访问 Google 时,会被阻挡。 于是我们可以在国外搭建一台代理服务器(可以访问 Google 的服务器),让代理帮我去请求google.com,代理把请求返回的相应结构再返回给我。

Nginx之正、反向代理_第1张图片

当出现多个客户端时,是这样的:

Nginx之正、反向代理_第2张图片

Nginx正向代理配置

通过proxy_pass配置代理地址http://google.com。当我们请求www.example.com将会被转发至http://google.com。

    server {
        server_name www.example.com;
        listen 80;
        location / {
            proxy_pass http://google.com;     #设定代理服务器的协议和地址 
            proxy_set_header HOST $host;
        }
    }

小结

正向代理代理的对象是客户端,正向代理真正服务的是客户端。不论是一对一,还是多对一,客户端与服务端请求的过程始终隐藏了客户端IP,服务端不清楚客户端是谁。

以客户端的角度来看它有以下优点:

  • 可以突破访问限制,由此我们可以访问外网,如:YouTube、Google。它是由客户端控制的代理(想开就开、不想开就不开),做到科学上网

  • 正向代理可以隐藏自己的真实IP,只有代理服务器才能知道客户端的IP

  • 提高访问速度,代理服务器可以缓存资源,当多个用户访问同一资源时,代理服务器直接把缓存的资源返回,没有必要向目标服务器重复请求同一份资源

反向代理

很久以前,老王去饭店吃饭,需要先到饭店,七荤八素点好菜,坐等饭菜上桌,然后大快朵颐,不亦乐乎。

有了第三方订餐外卖平台(代理),老王懒得动身前往饭店,老王打个电话或用APP,先选好某个饭店,再点好菜,外卖小哥会送上门来。

由于某个品牌的饭店口碑特别好,食客络绎不绝涌入,第三方订餐电话也不绝于耳,但是限于饭店接待能力有限,无法提供及时服务,很多食客等得不耐烦了,纷纷铩羽而归,饭店老总看着煮熟的鸭子飞走了,心疼不已。

痛定思痛,老总又成立了几个连锁饭店,形成一个集群,对外提供统一标准的菜品服务,电话订餐电话400-xxx-7777,当食客涌入饭店总台,总台将食客用大巴运到各个连锁店,这样食客既不需要排队,各连锁店都能高速运转起来,一举两得,老总乐开了花,并为此种运作模式,起名为"反向代理"。

在互联网中,单个服务器处理客户端请求能力有限,当客户端发送的请求过多,会造成服务器忙不过来。这时,我们可以设置多个服务器来共同分担请求,这些服务器提供相同的服务,对于用户来说,根本感觉不到差别。我们只需要知道反向代理服务器是谁就好了。如:www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。Nginx就是性能非常好的反向代理服务器,用来做负载均衡

Nginx之正、反向代理_第3张图片

当出现多个客户端(多对多)时,是这样的:

Nginx之正、反向代理_第4张图片

Nginx反向代理配置

不考虑复杂的配置,仅仅是完成一个 http 反向代理

nginx.conf配置文件如下:

conf/nginx.conf 是 nginx 的默认配置文件。你也可以使用 nginx -c 指定你的配置件

    
    //省略
    http {
        #连接超时时间
        keepalive_timeout  120;
        tcp_nodelay        on;
    
    
        #设定实际的服务器列表
        upstream my_server{
            server 127.0.0.1:8089;
        }
    
        #HTTP服务器
        server {
            #监听80端口,80端口是知名端口号,用于HTTP协议
            listen       80;
    
            #定义使用www.xx.com访问
            server_name  www.baidu.com;
    
    		#编码格式
    		charset utf-8;
            #反向代理的路径(和upstream绑定),location 后面设置映射的路径
            location / {
                proxy_pass http://my_server;
            }
            
            //省略
        }
    }

上述例子中,代理仅指向一个服务器。然而,网站在实际运营过程中,多数是以集群的方式运行,这时需要使用负载均衡来分流。

    
    //省略
    http {
        keepalive_timeout  120;
        tcp_nodelay        on;
        #设定实际的服务器列表
        upstream my_server{
            #weigth参数表示权值,权值越高被分配到的几率越大
            server 192.168.1.11:80   weight=5;
            server 192.168.1.12:80   weight=1;
            server 192.168.1.13:80   weight=6;
        }
    
        server {
            listen       80;
            server_name  www.baidu.com;
    		charset utf-8;
            location / {
                proxy_pass http://my_server;
            }
            
            //省略
        }
    }

Nginx提供了多种负载均衡策略,这里不再过多描述。

小结

反向代理代理的对象是服务端,反向代理真正服务的是服务端。不论是一对多,还是多对多,客户端与服务端请求的过程始终隐藏了服务端IP,客户端不清楚服务端是谁。

以服务端的角度来看它有以下优点:

  • 隐藏服务端IP

  • 负载均衡,反向代理服务器可以根据负载情况,将请求分发到不同的真实服务器上

  • 安全防护,反向代理服务器可以作为应用层防火墙,为网站提供对基于Web的攻击行为的防护

总结

反向代理与正向代理区别:

  • 正向代理和反向代理面向的服务群体不同,正向代理代理的对象是客户端,反向代理代理的是服务端

  • 正向代理和反向代理中各自的“视野”不同,正向代理下服务端不知道客户端真实IP,反向代理下客户端不清楚服务端真实IP。

参考资料

https://github.com/dunwu/nginx-tutorial
https://zhuanlan.zhihu.com/p/500768064
https://zhuanlan.zhihu.com/p/25707362

你可能感兴趣的:(nginx,代理模式,前端,后端)