您现在的位置是:首页 >技术教程 >Nginx反向代理与负载均衡网站首页技术教程

Nginx反向代理与负载均衡

junchen1992 2023-06-20 20:00:03
简介Nginx反向代理与负载均衡


本教程讲述 Nginx 的关键应用场景之反向代理负载均衡。内容接上文:Nginx常见应用场景

一、反向代理

正向代理

正向代理,通常被称为代理、代理服务器或者网络代理,是一个位于一组客户端机器前面的服务器。当这些计算机向互联网上的站点和服务发出请求时,代理服务器会拦截这些请求,然后代表这些客户端与web服务器进行通信,就像一个中间人一样。

例如,我们来命名一个典型的正向代理通信中涉及的3台计算机:

A:这是用户的家庭计算机
B:这是一个正向代理服务器
C:这是一个网站的源服务器(存储网站数据的地方)

请添加图片描述

在标准的互联网通信中,计算机A会直接与计算机C建立联系,客户端向源服务器发送请求,源服务器向客户端响应。当正向代理存在时,A将会把请求发送给B,然后B再将请求转发给C。随后,C会向B发送响应,B再将响应转发回A。

为什么有人会在他们的互联网活动中添加这个额外的中间人呢?有几个原因可能会让人想使用正向代理:

绕过国家或机构的浏览限制 - 一些政府、学校和其他组织使用防火墙,使其用户只能访问受限制的互联网版本。正向代理可用于绕过这些限制,因为它们让用户连接到代理而不是直接连接到他们访问的网站。
阻止访问某些内容 - 相反,代理也可以设置为阻止一组用户访问某些网站。例如,学校网络可能配置为通过代理连接到网络,该代理启用内容过滤规则,拒绝转发来自Facebook和其他社交媒体网站的响应。
保护他们的在线身份 - 在某些情况下,普通互联网用户只是希望提高在线匿名性,但在其他情况下,互联网用户生活在政府可以对政治异见者施加严重后果的地方。在网络论坛或社交媒体上批评政府可能导致这些用户被罚款或监禁。如果这些异见者中的一个使用正向代理连接到他们发表政治敏感评论的网站,那么用于发表评论的IP地址将更难追溯到异见者。只有代理服务器的IP地址是可见的。

反向代理

反向代理是一个位于一个或多个web服务器前面的服务器,拦截来自客户端的请求。这与正向代理不同,正向代理位于客户端前面。使用反向代理时,当客户端向网站的源服务器发送请求时,这些请求会在网络边缘被反向代理服务器拦截。然后,反向代理服务器会向源服务器发送请求并接收来自源服务器的响应。

正向代理和反向代理之间的区别微妙但重要。简化来说,正向代理位于客户端前面,确保没有源服务器与特定客户端直接通信。另一方面,反向代理位于源服务器前面,确保没有客户端与该源服务器直接通信。

再次举例说明,我们来命名涉及的计算机:

D:任意数量的用户家庭计算机
E:这是一个反向代理服务器
F:一个或多个源服务器

请添加图片描述

通常情况下,来自D的所有请求都会直接发送到F,而F会直接向D发送响应。使用反向代理时,来自D的所有请求会直接发送到E,E会将请求发送给F并接收来自F的响应。然后,E将适当的响应传递给D。

以下是反向代理的一些优点:

  • 负载均衡 - 每天有数百万用户访问的热门网站可能无法用单个源服务器处理所有传入的网站流量。相反,网站可以在不同的服务器池中进行分配,所有服务器都处理相同网站的请求。在这种情况下,反向代理可以提供负载均衡解决方案,将传入流量均匀分配到不同的服务器上,防止任何单个服务器过载。如果某个服务器完全失效,其他服务器可以接手处理流量。

  • 防止攻击 - 使用反向代理后,网站或服务不需要公开其源服务器的IP地址。这使得攻击者很难对其发起针对性攻击,例如DDoS攻击。相反,攻击者只能针对反向代理,如Cloudflare的CDN,它具有更严格的安全性和更多资源来抵御网络攻击。

  • 全球服务器负载均衡(GSLB) - 在这种负载均衡形式中,网站可以分布在全球范围内的多个服务器上,反向代理会将客户端引导到离它们最近的服务器。这减少了请求和响应需要传输的距离,缩短了加载时间。

  • 缓存 - 反向代理还可以缓存内容,从而提高性能。例如,如果巴黎的用户访问了一个在洛杉矶的web服务器上使用反向代理的网站,用户实际上可能连接到巴黎的本地反向代理服务器,然后该代理服务器需要与洛杉矶的源服务器进行通信。代理服务器可以将响应数据缓存(或暂时保存)。之后,浏览网站的巴黎用户将从巴黎的反向代理服务器获取本地缓存的版本,大大提高性能。

  • SSL加密 - 为每个客户端加密和解密SSL(或TLS)通信可能会让源服务器的计算成本变得很高。反向代理可以配置为解密所有传入请求并加密所有传出响应,从而释放源服务器上的宝贵资源。

Nginx 实现反向代理

通过 Nginx 实现反向代理相对简单。假设已经按照前面的教程安装并启动了 Nginx 服务,只需要在 Nginx 配置目录 conf.d 下新建一个 reverse_proxy.conf

server {
    listen       8001;
    server_name  localhost;

    location / {
        proxy_pass http://dummyjson.com;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

然后重新加载 Nginx 配置即可:

nginx -s reload

现在,Nginx已经配置为反向代理,发送到 http://dummyjson.com 的请求会被 localhost:8001 代理。

二、负载均衡

通过Nginx实现负载均衡也是相对简单的。假设已经按照前面的教程安装并启动了 Nginx 服务,只需要在 Nginx 配置目录 conf.d 下新建一个 load_balancer.conf

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

    server {
        listen 80;
        server_name mydomain.com;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

在这个配置中,您需要将backend1.example.com、backend2.example.com和backend3.example.com替换为您的后端服务器地址。将mydomain.com替换为您要代理的域名。

upstream backend部分定义了一个名为backend的负载均衡器,其中包含三个后端服务器。默认情况下,Nginx使用轮询(round-robin)算法进行负载均衡。然而,您可以通过添加least_conn或ip_hash指令来改变负载均衡算法。

例如,如果您希望使用最少连接(least_conn)算法,请将upstream backend部分更改为:

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

然后重新加载 Nginx 配置即可:

nginx -s reload

现在,Nginx已经配置为负载均衡器,并将流量在您指定的后端服务器之间进行均衡分配。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。