如何理解正向和反向代理

更新日期: 2024-02-21阅读: 1.5k标签: 代理

个人感觉这两个概念技术是很相似的,都是接收客户端的请求,并将这些请求转发给另一台服务器,然后将服务器的响应返回给客户端

但是他们的使用场景和目标又有很大不同的。


正向代理

正确叫法是:Forward Proxy,译为:正向代理、前置代理、前向代理、客户端代理

主要是面向客户端的。最大的特点就是,在代理的过程中隐藏了真实的请求客户端服务端不知道真实的客户端是谁。

比如我们耳熟能详的VPN做的事情,就是这个。

也就是说,必须在客户端上面做一些操作,让你的流量全部通过代理服务器去访问网络,外部识别到的都是你的代理服务器的身份,无法追踪到你的实际ip。


如上图所示, 所有客户端(Client A、B)全部都会被伪装 C 来访问访问外部网络。

很多公司为了内部网络安全,都会做网关进行管理。


反向代理

正确叫法是:Reverse Proxy,译为:反向代理、反向代理服务器、逆向代理、服务器代理

主要是面向服务端的,最大的特点就是,从客户端角度来看,并不知道真实访问的服务器是谁,只知道公开的服务器入口。


如上图所示,客户端都是去访问 google.com 但是并不知道最终的服务器实际地址。

显而易见的,这样就很轻松的将客户端请求分发到了多台服务器,实现负载均衡,并且还能保护实际服务器,当然还有一些其他的好处。

下面用Nginx来列举一些反向代理的使用场景:


1. 负载均衡

你可以使用Nginx将进入的请求分发到多台后端服务器。这在配置文件中看起来可能像这样:

http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
        }
    }
}

在这个配置中,upstream 指令定义了一个包含多个服务器的服务器组。然后,在 location 块中,proxy_pass 指令将客户端的请求转发到 backend 服务器组中的服务器。

这里默认采用的是轮询的负载均衡方法。

Nginx会按照服务器的定义顺序,依次将每个新的请求转发到不同的后端服务器。如果所有的后端服务器对于请求的处理速度都大致相同,这种方法是有效的。

加权轮询(Weighted Round Robin)

这是轮询的扩展。你可以为每个后端服务器指定一个权重(weight),权重较高的服务器将接收更多的请求。

这在后端服务器性能不均匀时很有用。配置看起来可能像这样:

http {
    upstream backend {
        server backend1.example.com weight=3;
        server backend2.example.com;
        server backend3.example.com;
    }
    ...
}

在这个例子中,backend1.example.com 由于权重设为3,将接收三倍于其他服务器的请求。

最少连接(Least Connections)

这种方法会将新的请求转发到当前活跃连接数最少的服务器,适合处理请求处理时间长短不一的情况。

配置看起来可能像这样:

http {
    upstream backend {
        least_conn;
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }
    ...
}

IP Hash

这种方法根据客户端的IP地址决定将请求发送到哪个服务器,可以用于实现会话持久性(session persistence)。

配置看起来可能像这样:

http {
    upstream backend {
        ip_hash;
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }
    ...
}

在这个例子中,ip_hash 指令让 Nginx 使用 IP Hash 的方法来分配请求。具体来说,Nginx 会根据客户端的 IP 地址计算一个哈希值,然后根据这个哈希值将请求分发给某一个特定的后端服务器。因此,来自同一个客户端 IP 的请求总是会被发送到同一台后端服务器,这样就可以实现会话保持。

还有其他一些规则,这里就不一一介绍了。


2. SSL终端

在Nginx中,你可以配置反向代理来处理所有的SSL/TLS握手过程。配置看起来可能像这样:

server {
    listen 443 ssl;

    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;

    location / {
        proxy_pass http://backend;
    }
}

在这个配置中,listen 指令让Nginx在443端口(默认的HTTPS端口)上监听请求,ssl_certificatessl_certificate_key 指定了SSL证书和私钥的位置。然后,所有的HTTPS请求都会被转发到 backend 服务器组。

简单的说,只需要在你的代理服务器上配置好SSL证书,进行https访问,访问实际服务器的时候,采用http(非加密的方式)。

这种将解密后的请求转发到后端服务器,可以大大减轻后端服务器的计算压力。


3. 缓存

Nginx也可以配置为缓存代理,将后端服务器的响应结果(如网页、图片、视频等)暂存到本地磁盘或内存中,提高对相同请求的处理速度。

当收到相同的请求时,直接从缓存中提供服务,而无需再次访问后端服务器,这可以大大提高服务的响应速度和后端服务器的处理能力。另外,反向代理还可以对响应内容进行优化,如压缩、添加缓存控制头等。

某种意义上来说我们使用的CDN服务器,采用的就是类似的做法。

配置看起来可能像这样:

http {
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m;

    server {
        listen 80;

        location / {
            proxy_cache my_cache;
            proxy_pass http://backend;
        }
    }
}

在这个配置中,proxy_cache_path 指令定义了缓存的存储路径和其他参数,proxy_cache 指令使得在 / 位置的请求启用缓存。


4. 安全

反向代理还可以提供额外的安全层,它可以隐藏后端服务器的信息,防止恶意攻击直接达到后端服务器。

同时,它还可以实施各种安全策略,如阻止来自特定IP地址的请求,限制并发连接数等。


反向代理举例

Chatapi反代


server {
    listen 443 ssl;
    server_name chatapi.xxxxx.com;

    ssl_certificate /etc/nginx/cert/chatapi.xxxxx.com.crt;
    ssl_certificate_key /etc/nginx/cert/chatapi.xxxxx.com.key;

    location / {
        proxy_pass  https://api.openai.com/;
        proxy_ssl_server_name on;
        proxy_set_header Host api.openai.com;
        proxy_set_header Connection '';
        proxy_http_version 1.1;
        chunked_transfer_encoding off;
        proxy_buffering off;
        proxy_cache off;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    access_log /www/access_nginx.log combined;
}

这样的话就可以用 chatapi.xxxxx.com 去替代 api.openai.com 了,解决了在国内直接访问的问题

还有很多其他的应用场景,这里就不一一列举了。

作者:PolarisAspire
链接:https://www.lpolaris.com/article/netproxy

链接: https://fly63.com/article/detial/12653

什么是在线代理ip网页代理

当我们需要大量IP进行快节奏完成业绩的时候,很多人都会想到去IP代理服务商那里购买IP代理,所以我相信很多人对于IP代理这个词已经有一定的认识了,那么还有一个词叫做:在线代理ip网页代理

centos7下搭建高匿HTTP代理

一般适用情况:1、两台都有外网IP,一台服务器请求资源通过另外一个服务器,本文重点讲第一种。2、两台服务器,其中一台服务器只有内网IP,另外一台服务器有公网和内网IP。

.Net Core/Framework之Nginx反向代理后获取客户端IP等数据探索

公司项目最近出现获取访问域名、端口、IP错误现象,通过排查发现, 之前项目一直通过Nginx自定义Headers信息来获取,但最近运维人员失误操作造成自定义Header信息丢失,造成项目拿不到对应的数据。

反向代理和内网穿透

反向代理看上去看深奥,其实不然,只是因为汉语言文化的差异导致它看上去深奥。一般反派感觉都比较厉害和神秘。要理解反向代理,我们就不得不说一下正向代理。正向代理代理的对象是客户端;反向代理代理的对象是服务端

反向代理Cloudflare加速网站(SNIproxy)

写在教程前:为什么要反向代理cloudflare?答:缩短路由,加快cloudflare节点到大陆用户的速度,用过cloudflare的用户应该知道,这家CDN的速度在除了大陆以外的地方访问都非常快,那么又没有什么办法使其对大陆访问良好呢?

ES6中的代理(Proxy)和反射(Reflection)

调用 new Proxy() 可常见代替其它目标 (target) 对象的代理,它虚拟化了目标,所以二者看起来功能一致。代理可拦截JS引擎内部目标的底层对象操作,这些底层操作被拦截后会触发响应特定操作的陷阱函数。

Vue多环境代理配置

多人协作模式下,修改代理比较麻烦,而且很容易某个开发人员会修改了vue.config.js文件后提交了。第一,很容易引起冲突。 第二,很容易出现代理错误,需要排查。而且现在微服务盛行

node.js代理访问

本地开发,代理访问,防止跨域(一般通过webpack配置代理即可),特殊情况如携带一些自定义的登录cookie则需要通过自己写node,作为一种server中间层,单线程异步可以缓解服务器压力

vue proxy代理跨域

changeOrigin的属性值为一个布尔值,如果设置为true,那么本地会虚拟一个NODE服务端接收你的请求并代你发送该请求(中间件)。[本质上是本地开了一个服务器dev-server,所有的请求都通过这里转发出去。]

Nginx反向代理之动静分离

我们已经知道了什么是正向代理与反向代理,这次我们就讲一下Nginx的动静分离的案例,其实质运用的就是反向代理,专门用一台服务器代理服务器上的图片资源。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!