Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Nginx之正、反向代理 #58

Open
CatsAndMice opened this issue Aug 3, 2023 · 0 comments
Open

Nginx之正、反向代理 #58

CatsAndMice opened this issue Aug 3, 2023 · 0 comments
Labels

Comments

@CatsAndMice
Copy link
Owner

什么是代理

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

正向代理

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

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

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

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

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反向代理配置

不考虑复杂的配置,仅仅是完成一个 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant