轻松玩转Nginx:揭秘配置文件与四大负载均衡技术

276 阅读9分钟

Nginx,一款功能强大的开源 Web 服务器,兼具代理服务器的角色,以其对 正向和反向代理 的支持而著称。正向代理巧妙地遮掩了客户端的真实 IP,使其成为访问受限资源、提升访问效率的理想选择。而反向代理则深藏服务端的详细信息,其在实现负载均衡、静态资源缓存以及增强系统安全性方面发挥着关键作用。 本文简析了 Nginx 配置文件的架构,从全局配置到 events 和 http 块的具体设置,为读者提供了一份参考的指南。同时,文章还展示了 Nginx 在 负载均衡 领域的应用,详细介绍了四种主流的负载均衡策略:轮询法、IP 哈希、加权轮询以及最少连接法,为读者在实际应用中选择合适的策略提供了参考。

正向代理

image

image

正向代理扮演着客户端与目标服务器之间的中介角色。在客户端发起对目标服务器的访问请求时,该请求首先抵达正向代理服务器。代理服务器接着将请求传递给目标服务器,并在接收到目标服务器的响应后,将其反馈给客户端。通过这种方式,正向代理有效地遮蔽了客户端的真实 IP,防止目标服务器直接识别或追踪到客户端的身份。

正向代理是客户端访问代理服务器去访问目标服务器,并且对目标服务器隐藏了客户端的真实信息(IP 等信息)

正向代理的主要用途包括:

1.访问被限制的资源:当某些资源受到网络限制或访问限制时,可以使用正向代理绕过这些限制来获取资源。
2.提高访问速度:代理服务器可以缓存经常请求的资源,从而提高客户端访问资源的速度。
3.突破防火墙:正向代理可以帮助绕过企业或国家防火墙的限制,访问被封锁的网站或资源。

反向代理

image

image

反向代理作为客户端与服务器端之间的中介,扮演着重要的角色。当客户端对反向代理服务器发出访问请求,该代理服务器依据预设的规则,将请求定向转发至后端服务器群中的某一台。随后,代理服务器捕获来自该后端服务器的响应,并将其传递回客户端。这一过程中,反向代理巧妙地掩盖了后端服务器的真实身份,导致客户端无法知晓其请求被具体哪一台服务器处理。

反向代理是指代理服务器接收客户端的请求,然后反向代理将客户端的请求分发给一个或多个目标服务器,最后将响应返回给客户端,对于客户端隐藏了真实的服务端信息。

反向代理的主要用途包括:

1.负载均衡:反向代理可以根据一定的算法将请求均匀地分发给后端的多台服务器,从而实现负载均衡,提高系统的并发处理能力和稳定性。
2.缓存静态资源:反向代理可以缓存经常请求的静态资源,减少后端服务器的负载,提高网站的访问速度。
3.安全性和可靠性:反向代理可以作为防火墙和安全设备,提供安全认证、访问控制、DDoS攻击防护等功能。

正向代理 VS 反向代理总结

代理服务器在网络通信中扮演着至关重要的角色,无论是正向代理还是反向代理,它们都作为信息传递的中介。

正向代理充当客户端与互联网目标服务器之间的桥梁,客户端的请求通过代理服务器转发,同时代理服务器也保护了客户端的隐私,隐藏了其真实的 IP 地址,使得目标服务器无法识别访问来源。

反向代理则作为客户端与后端服务器集群之间的纽带,接收客户端的请求并根据预设规则将其分配给后端的某一台服务器,然后从该服务器获取响应并返回给客户端。在这个过程中,反向代理确保了服务端的匿名性,客户端无法知晓其请求被处理的具体服务器。

这两种代理的主要区别在于它们在请求流程中的位置和作用。在正向代理中,代理服务器与客户端站在同一战线,帮助客户端访问特定的网络资源。而在反向代理中,代理服务器与后端服务器站在同一阵线,协助服务端响应客户端的请求。

配置文件解析

nginx 配置文件的组成部分

#user  nobody;   是用来指定 Nginx 进程运行的用户和用户组的配置项。 在 Linux 系统中,各个进程需要以某个用户的身份来运行,以限制权限并提高安全性
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       8080;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

nginx 配置文件有三部分组成

  1. 第一部分 全局块
  2. 第二部分 events 块
  3. 第三部分 http 块

全局块

比如上面第一行配置的:

 worker_processes  1;

这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是 会受到硬件、软件等设备的制约。

events 块

events {
    worker_connections  1024;
}

events 块涉及的指令 主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work_process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work_process 可以同时支持的最大网络连接数等。

上述例子就表示每个 work process 支持的最大连接数为 1024. 这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

http 块

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       8080;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

值得注意的是,HTTP 块不仅包括通用的配置指令,还可以嵌入 server 块。

在 HTTP 全局块中,我们可以设置多种指令,如引入配置文件、定义 MIME 类型、自定义日志格式、设定连接的超时时长以及限制单个连接的最大请求数量等。

对于 server 块,它与虚拟主机的概念紧密相连。从用户的角度来看,虚拟主机就如同一个独立的物理服务器。这项技术的出现,旨在减少互联网服务器的硬件成本。

每个 HTTP 块能够包含多个独立的 server 块,每个 server 块代表一个虚拟主机。而每个 server 块内部,又可以进一步划分为全局 server 配置和多个 location 定义块。

Nginx 常用的实现负载均衡的 4 种方式

Nginx 提供了多种方式实现负载均衡,以下是其中几种常用的方式:

轮询(Round Robin):

这是默认的负载均衡算法,Nginx 按照请求的顺序依次将请求分配给后端的服务器。每个服务器按照其权重来处理请求,然后按顺序循环分配。这种算法简单且平均地将负载分配给后端服务器,适用于后端服务器配置相同、处理能力相当的场景。

http {
    upstream backend {
        server 192.168.1.101:8080;
        server 192.168.1.102:8080;
        server 192.168.1.103:8080;
    }

    server {
        listen 80;

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

IP 哈希(IP Hash):

Nginx 根据客户端的IP 地址进行哈希运算,并根据计算结果将请求分配给固定的后端服务器。这种算法保证了相同的客户端 IP 每次请求都会被分配到相同的服务器,适用于需要保持会话状态的应用。

http {
    upstream backend {
        ip_hash;
        server 192.168.1.101:8080;
        server 192.168.1.102:8080;
        server 192.168.1.103:8080;
    }

    server {
        listen 80;

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

加权轮询(Weighted Round Robin):

Nginx 根据每个后端服务器的配置权重将请求分配给服务器。权重越高的服务器,处理的请求就越多。这种方式适用于后端服务器之间配置不同、处理能力不同的情况下

http {
    upstream backend {
        server 192.168.1.101:8080 weight=3;
        server 192.168.1.102:8080 weight=2;
        server 192.168.1.103:8080 weight=1;
    }

    server {
        listen 80;

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

最少连接(Least Connections):

Nginx 会统计每个后端服务器当前的活动连接数,并将请求分配给活动连接数最少的服务器,以实现负载均衡。这种算法适用于后端服务器配置和处理能力不同、连接持续时间不均衡的场景

http {
    upstream backend {
        least_conn;
        server 192.168.1.101:8080;
        server 192.168.1.102:8080;
        server 192.168.1.103:8080;
    }

    server {
        listen 80;

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

负载均衡简析

在高并发的情况下,一台服务器的负载承受不住,我们就需要使用服务器集群来解决高并发,但是又会出现另一个问题,就是客户端的请求如何分配给多个服务器,所以在服务器集群中,需要一个服务器充当一个【负载均衡器-Nginx】【NameServer-也可以是一个集群】的作用,用户的所有请求都会都会由负载均衡器【NameServer】进行接收,调度者根据每台服务器的负载情况通过负载均衡算法将请求分配给某一台后端服务器进行处理。

image

image