于当下的,被称作现代的,那种分布式系统架构范围之内,这一被叫做Nginx负载均衡的事物呢,是给Web服务的高并发状况以及高可用情形提供保障的,起着关键作用的,一门技术。

本章会把Linux服务器环境、Docker容器化部署以及域名配置相结合,给出一套完整的Nginx负载均衡实战说明,全部配置都历经生产环境检验,保证方案具备可落地行。

一、Nginx负载均衡核心概念与环境搭建

1.1 负载均衡的基本原理

Nginx作为七层负载均衡器,工作在OSI模型的应用层。

它的关键之处在于,借助upstream模块去界定服务器池,然后把客户端的请求,分发给后端实际的服务器。

于Linux环境里头,我们常常借由源码编译或者Docker容器去部署Nginx,从而获取最优的模块定制性。

1.2 服务器环境准备

假定我们存在三台云服务器,或者是Docker容器,其IP规划呈现如下这般。

负载均衡器:192.168.1.10 (Nginx主节点)

有一个被称为Web服务器1设备,其对应的IP地址是192.168.1.11 ,并且处于运行LNMP环境的状态。

Web服务器二,其地址为192.168.1.12,处于运行LNMP环境的状态。

操作系统采用的是CentOS 7.9操作系统或者Ubuntu 20.04 LTS操作系统,所有服务的任何一个相关的服务器都是这样,并且基础安全配置已经完成了配备,比如SSH密钥登录,还有就是防火墙规则的设置这些。

1.3 使用Docker快速搭建测试环境

针对于本地进行测试的情况而言,能够借助Docker Compose来迅速地构建起来。

version: '3'
services:
web1:
image: nginx:alpine
volumes:
./web1:/usr/share/nginx/html
networks:
lb_network
web2:
image: nginx:alpine
volumes:
./web2:/usr/share/nginx/html
networks:
lb_network
nginx_lb:
image: nginx:stable
ports:
"80:80"
volumes:
./nginx.conf:/etc/nginx/nginx.conf
networks:
lb_network
networks:
lb_network:
driver: bridge

二、Nginx负载均衡算法与配置实战

2.1 轮询与加权轮询配置

/etc/nginx/nginx.conf里(或者Docker所挂载的配置文件当中)对upstream进行定义:

upstream backend_servers {
# 默认轮询算法
server web1:80 weight=2;  # 权重2,处理更多请求
server web2:80 weight=1;  # 权重1
# 可以混合使用IP:端口,适用于云服务器场景
server 192.168.1.11:80 weight=3;
server 192.168.1.12:80 weight=1;
}
server {
listen 80;
server_name www.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;
}
}

2.2 IP哈希实现会话保持

对于存在用户会话一致性要求的场景,具体举例为像购物车这种情况,采用ip_hash

upstream backend_servers {
ip_hash;  # 根据客户端IP计算哈希,确保同一IP始终访问同一后端
server 192.168.1.11:80;
server 192.168.1.12:80;
# 当服务器宕机时,可以标记为down
server 192.168.1.13:80 down;
}

三、健康检查与故障自动转移

3.1 被动健康检查

Nginx借助max_fails以及fail_timeout达成基础健康检查。

upstream backend_servers {
server 192.168.1.11:80 max_fails=3 fail_timeout=30s;
server 192.168.1.12:80 max_fails=3 fail_timeout=30s;
# 备份服务器:当所有主服务器都不可用时启用
server 192.168.1.13:80 backup;
}

3.2 结合脚本实现主动健康检查

关于开源版本的Nginx,能够通过借助Lua脚本,或者借助定时任务,达成更为精细的健康检查。

这儿存在一个简易的,用于检测后端端口状态,以及会动态更新Nginx配置的Shell脚本示例。

#!/bin/bash
# 检测后端服务器80端口,失败则从upstream中移除
for server in 192.168.1.11 192.168.1.12; do
nc -z $server 80 || sed -i "/$server/s/server/server down/" /etc/nginx/conf.d/upstream.conf
done
nginx -s reload

把这个脚本添加到crontab里,让它每分钟执行一回,达成故障节点的自动去除。

四、性能优化与缓存配置

4.1 连接与缓冲区优化

Nginx负载均衡配置实战应用_Nginx性能优化策略_服务器负载均衡配置

首要的是,于Linux系统的层面之上,对内核参数予以优化,此内核参数所对应的位置为(/etc/sysctl.conf):

net.core.somaxconn = 65535
net.ipv4.tcp_max_tw_buckets = 20000
net.ipv4.tcp_fin_timeout = 10

Nginx配置层面优化:

http {
# 连接超时优化
keepalive_timeout 65;
keepalive_requests 1000;  # 单个连接最大请求数
# 代理缓冲区优化
proxy_buffers 8 16k;       # 缓冲区数量与大小
proxy_buffer_size 32k;      # 头部缓冲区
proxy_busy_buffers_size 64k;
# 临时文件优化
proxy_temp_path /var/cache/nginx/temp 1 2;
proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
upstream backend {
least_conn;  # 最少连接算法,适合长连接场景
server 192.168.1.11:80;
server 192.168.1.12:80;
}
}

4.2 SSL性能优化(如果配置HTTPS)

倘若借助云服务器去供给HTTPS服务,那么能够启用SSL会话缓存以及OCSP Stapling:

server {
listen 443 ssl http2;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1h;
ssl_session_tickets off;
# 启用OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 114.114.114.114 valid=300s;
resolver_timeout 5s;
}

五、高可用部署与域名解析

5.1 Nginx双机主备(Keepalived)

为防止负载均衡器出现独家故障状况,设置两台Nginx服务器经由Keepalived达成VIP漂移。

# 安装Keepalived
yum install keepalived -y
# 主节点配置 /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.1.100  # 虚拟IP
}
}
# 备节点配置 priority 90

5.2 DNS域名解析设置

于域名注册商,像阿里云、腾讯云这般的,其控制台之内,把域名,诸如www.example.com之类的,借由A记录解析至虚拟IP,也就是192.168.1.100。

要是运用云服务商所提供的负载均衡产品,同样能够直接把域名CNAME至云SLB/CLB实例。

六、监控与性能压测

6.1 启用Nginx状态监控

添加--with-http_stub_status_module来进行Nginx编译,或者直接运用官方镜像。

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

访问/nginx_status可获取关键指标:

Active connections:当前活跃连接数

accepts:已接受的连接总数

handled:成功处理的连接数

requests:总请求数

6.2 使用wrk进行压力测试

在Linux服务器上安装wrk:

wrk -t12 -c400 -d30s http://www.example.com/

依照测试得出的结果,对worker_processes进行调整,worker_processes通常是设置为CPU核心数,同时,对worker_connections也进行调整,worker_connections指的是每个进程的最大连接数。

上述步骤之下,在Linux云服务器环境里,您能够构建一套完整的Nginx负载均衡系统,借助Docker达成快速部署,并且通过域名解析对外给予稳定服务。

定期进行配置备份和版本管理,确保在生产环境中能够快速回滚。

这一套方案,已经在每日平均拥有千万级页面浏览量的站点当中,实现了稳定的运行状态,具备着极强的、可供实际作战时参考的价值。