于当下的,被称作现代的,那种分布式系统架构范围之内,这一被叫做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 连接与缓冲区优化

首要的是,于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达成快速部署,并且通过域名解析对外给予稳定服务。
定期进行配置备份和版本管理,确保在生产环境中能够快速回滚。
这一套方案,已经在每日平均拥有千万级页面浏览量的站点当中,实现了稳定的运行状态,具备着极强的、可供实际作战时参考的价值。

Comments NOTHING