【web服务_负载均衡Nginx】二、Nginx 核心技术之负载均衡与反向代理

一、负载均衡与反向代理概述​

在互联网应用场景中,随着用户访问量的不断增加,单台服务器往往难以满足性能和可靠性的需求。负载均衡与反向代理技术应运而生,成为保障高并发、稳定服务的关键技术。负载均衡旨在将大量的客户端请求合理分配到多个后端服务器上,避免单台服务器过载,提高系统的整体处理能力和可用性;反向代理则位于客户端和后端服务器之间,接收客户端请求,根据配置将请求转发到后端真实服务器,并将响应返回给客户端,同时还能提供安全防护、缓存加速等功能 。Nginx 凭借其出色的性能和灵活的配置,成为实现负载均衡与反向代理的主流选择。

二、CentOS 7 环境下 Nginx 的安装与基础配置​

2.1 安装 Nginx​

在 CentOS 7 系统中,安装 Nginx 前需先安装相关依赖包,使用以下命令:

bash 复制代码
sudo yum install -y gcc pcre-devel zlib-devel

从 Nginx 官方下载稳定版本,本文以nginx-1.23.3为例,执行以下操作:

bash 复制代码
wget https://nginx.org/download/nginx-1.23.3.tar.gz
tar -zxvf nginx-1.23.3.tar.gz
cd nginx-1.23.3

配置编译参数,指定安装路径、配置文件路径等信息:

bash 复制代码
./configure \
--prefix=/usr/local/nginx \
--conf-path=/etc/nginx/nginx.conf \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_stub_status_module

编译并安装:

bash 复制代码
make && sudo make install

2.2 启动与验证 Nginx​

安装完成后,使用以下命令启动 Nginx:

bash 复制代码
sudo /usr/local/nginx/sbin/nginx

通过查看进程或端口状态验证 Nginx 是否成功启动:

bash 复制代码
sudo netstat -tunlp | grep nginx

若出现类似下图的监听端口(默认 80 端口),则表示 Nginx 已正常运行。

三、Nginx 负载均衡技术详解​

3.1 负载均衡算法介绍​

3.1.1 轮询(Round Robin)​

轮询算法是 Nginx 默认的负载均衡策略,它按照顺序依次将请求分配到后端服务器。例如,假设有后端服务器server1、server2、server3,第一个请求分配到server1,第二个请求分配到server2,第三个请求分配到server3,第四个请求又回到server1,以此类推。这种算法适用于后端服务器性能相近的场景,能简单地实现请求的均匀分配。​

​3.1.2 加权轮询(Weighted Round Robin)

加权轮询算法考虑到后端服务器性能的差异,通过为每台服务器设置权重,性能好的服务器分配更高的权重,从而获得更多的请求。例如,server1权重为 3,server2权重为 2,server3权重为 1,那么在分配请求时,server1会获得大约一半的请求,server2获得三分之一左右,server3获得六分之一左右。​

3.1.3 IP 哈希(IP Hash)​

IP 哈希算法根据客户端的 IP 地址计算哈希值,将相同 IP 地址的请求始终分配到同一后端服务器。这对于需要会话保持的场景非常有用,比如用户登录后,后续的请求都能由同一台服务器处理,保证用户会话的连续性。​

3.1.4 最少连接(Least Connections)​

最少连接算法将请求分配到当前连接数最少的后端服务器,动态地根据服务器的负载情况分配请求,使各服务器的连接数尽量均衡。​

3.2 负载均衡配置实践​

在/etc/nginx/nginx.conf文件中,通过upstream指令定义后端服务器集群,以下是不同负载均衡算法的配置示例:​

3.2.1 轮询算法配置​
bash 复制代码
http {
    upstream backend_servers {
        server 192.168.1.100:80;
        server 192.168.1.101:80;
        server 192.168.1.102:80;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend_servers;
            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;
        }
    }
}

上述配置中,upstream backend_servers定义了名为backend_servers的后端服务器集群,包含三台服务器。在server块的location /中,通过proxy_pass将请求转发到backend_servers集群,同时设置了一些请求头信息,以便后端服务器获取客户端的真实 IP 等信息。​

3.2.2 加权轮询算法配置
bash 复制代码
http {
    upstream backend_servers {
        server 192.168.1.100:80 weight=3;
        server 192.168.1.101:80 weight=2;
        server 192.168.1.102:80 weight=1;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend_servers;
            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;
        }
    }
}

此配置为每台服务器设置了不同的权重,实现加权轮询。​

3.2.3 IP 哈希算法配置
bash 复制代码
http {
    upstream backend_servers {
        server 192.168.1.100:80;
        server 192.168.1.101:80;
        server 192.168.1.102:80;
        ip_hash;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend_servers;
            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;
        }
    }
}

添加ip_hash指令,启用 IP 哈希负载均衡算法。​

3.2.4 最少连接算法配置
bash 复制代码
http {
    upstream backend_servers {
        server 192.168.1.100:80;
        server 192.168.1.101:80;
        server 192.168.1.102:80;
        least_conn;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend_servers;
            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;
        }
    }
}

使用least_conn指令开启最少连接负载均衡策略。​

配置完成后,通过以下命令重新加载 Nginx 配置:

bash 复制代码
sudo nginx -s reload

四、Nginx 反向代理技术详解​

4.1 反向代理原理​

反向代理服务器位于客户端和后端服务器之间,当客户端发送请求到反向代理服务器时,反向代理服务器根据配置规则,将请求转发到后端的真实服务器上。后端服务器处理请求后,将响应返回给反向代理服务器,反向代理服务器再将响应返回给客户端。对于客户端来说,它并不知道请求实际是由后端哪台服务器处理的,就像所有请求都由反向代理服务器自己处理一样。反向代理可以实现隐藏后端服务器真实 IP、负载均衡、缓存加速、请求过滤等功能。​

4.2 反向代理配置实践​

4.2.1 基础反向代理配置​

假设后端有一个 Web 应用部署在192.168.1.110:8080,通过 Nginx 将所有请求转发到该应用,在/etc/nginx/nginx.conf中配置如下:

bash 复制代码
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://192.168.1.110:8080;
        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;
    }
}

上述配置中,listen 80表示 Nginx 监听 80 端口,server_name example.com指定域名。在location /块中,proxy_pass将请求转发到后端服务器192.168.1.110:8080,同时设置请求头信息。​

4.2.2 基于 URL 路径的反向代理配置​

若要根据不同的 URL 路径将请求转发到不同的后端服务器,例如将/api/开头的请求转发到192.168.1.120:8081,其他请求转发到192.168.1.110:8080,配置如下:

bash 复制代码
server {
    listen 80;
    server_name example.com;

    location /api/ {
        proxy_pass http://192.168.1.120:8081;
        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;
    }

    location / {
        proxy_pass http://192.168.1.110:8080;
        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;
    }
}
4.2.3 反向代理缓存配置​

为提高响应速度,Nginx 可以对后端服务器的响应进行缓存。配置如下:

bash 复制代码
http {
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend_servers;
            proxy_cache my_cache;
            proxy_cache_key "$uri$is_args$args";
            proxy_cache_valid 200 302 60m;
            proxy_cache_valid 404 10m;
        }
    }
}

上述配置中,proxy_cache_path定义了缓存路径和相关参数,proxy_cache指定使用的缓存区域,proxy_cache_key定义缓存键,proxy_cache_valid设置不同响应状态码的缓存有效期。​

同样,配置完成后执行sudo nginx -s reload重新加载配置。​

五、负载均衡与反向代理的监控与维护​

5.1 监控负载均衡状态​

通过 Nginx 的http_stub_status_module模块可以查看负载均衡的状态信息。首先在编译 Nginx 时确保启用该模块(前面安装配置中已包含),然后在/etc/nginx/nginx.conf中添加以下配置:

bash 复制代码
server {
    listen 80;
    server_name example.com;

    location /status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}

上述配置在server块中新增/status路径,用于查看状态信息。stub_status on启用状态查看功能,access_log off关闭该路径的访问日志,allow和deny限制只有本地(127.0.0.1)可以访问该状态页面。​

通过浏览器访问http://example.com/status(将example.com替换为实际域名或 IP),可看到类似以下信息:

bash 复制代码
Active connections: 1 
server accepts handled requests
 1000 1000 2000
Reading: 0 Writing: 1 Waiting: 0

其中,Active connections表示当前活动连接数,server accepts handled requests分别表示接受的连接数、处理的连接数和请求总数,Reading、Writing、Waiting分别表示读取请求头、处理请求和等待响应的连接数。​

5.2 故障排查与维护​

当负载均衡或反向代理出现问题时,可通过以下步骤排查:​

1、检查 Nginx 的错误日志文件/var/log/nginx/error.log,查看是否有相关错误信息。​

2、确认后端服务器是否正常运行,可通过直接访问后端服务器的 IP 和端口进行测试。​

3、检查 Nginx 的配置文件语法是否正确,使用sudo nginx -t命令进行验证。​

4、查看网络连接状态,确保 Nginx 与后端服务器之间的网络畅通。

相关推荐
小浪学编程2 分钟前
C#学习1_认识项目/程序结构
开发语言·前端·学习·c#·游戏引擎
蓝莓味柯基4 分钟前
React:<></>的存在是为了什么
前端·javascript·react.js
涵信6 分钟前
第七节:进阶特性高频题-Vue3的ref与reactive选择策略
前端·javascript·vue.js
StrongerIrene7 分钟前
react 父子组件通信 子 直接到父, 父 forwardref子
前端·javascript·react.js
前端熊猫7 分钟前
Hooks的使用限制及原因
前端·javascript·react.js
好_快16 分钟前
Lodash源码阅读-flatRest
前端·javascript·源码阅读
好_快16 分钟前
Lodash源码阅读-compareAscending
前端·javascript·源码阅读
excel19 分钟前
webpack 运行时模版 第 三 节 /lib/RuntimeTemplate.js
前端
excel22 分钟前
webpack 运行时模版 第 二 节 /lib/RuntimeTemplate.js
前端
Watermelo61724 分钟前
vscode如何多行同时编辑,vscode快速选中多行快捷键
前端·ide·vscode·编辑器·学习方法·键盘·快捷键