所处之地为基于Linux系统的生产环境,在此环境里面,进行高可用架构的部署作业,这一部署作业乃是保障业务连续性得以顺利维持的基石根基之处哦。
先把Nginx布置在Docker容器里头,并关联云服务器以及域名服务,如此一来,我们能够搭建起一套拥有弹性伸缩本事的负载均衡系统。
以下将从环境搭建到上线运维,提供一套完整的落地实施方案。
一、环境准备:云服务器与域名解析
在主流云服务商之中,像阿里云,还有腾讯云,去挑选两台以上,操作系统是CentOS 7.9或者Ubuntu 22.04的云服务器,建议这种云服务器的配置弄成2核4GB,它们要分别去承担Nginx节点以及后端应用服务器的角色。
upstream backend_pool {server 192.168.1.10:80 weight=5;server 192.168.1.11:80 weight=3;server 192.168.1.12:80 backup;least_conn; # 最少连接数算法keepalive 32; # 长连接复用}
达成购买操作之后,面向服务器关联弹性公网IP,并且开展安全组规则予以配置,使80(HTTP)、443(HTTPS)以及22(SSH)端口实现开放。
登录,关于云控制台的,那个提供域名解析所需的服务,在其中添加,一种称作A记录的内容,把业务方面所涉及的域名,就像那个代码呈现的www.example.com,解析到Nginx服务器的公网,具有特定指向性的IP。
若需启用HTTPS,可提前申请SSL证书并上传至服务器。
二、基于D快速部署Nginx环境
1. 安装Docker与Docker Compose:
SSH登录服务器后,执行以下命令安装Docker:
curl -fsSL https://get.docker.com | bash -s docker
systemctl enable --now docker
随后安装Docker Compose以管理多容器:
curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
2. 编写Nginx配置文件:
创建这样一个目录结构,它是/data/nginx/conf.d ,并且,在/data/nginx/conf.d/upstream.conf里,去定义后端服务器池。
譬如,设置加权轮询算法,把百分之八十的流量引向性能更为强劲的服务器A,百分之二十的流量导向服务器B。
upstream backend {
server 10.0.1.10:8080 weight=8; # 后端服务器内网IP
server 10.0.1.11:8080 weight=2;
keepalive 32; # 长连接优化
}
3. 使用Docker Compose启动容器:
在位于/data/nginx/的路径里,去创建名为docker-compose.yml这样的文件内容呢。
version: '3.8'
services:
nginx:
image: nginx:1.25-alpine
container_name: nginx_lb
ports:
"80:80"
"443:443"
volumes:
/data/nginx/conf.d:/etc/nginx/conf.d
/data/nginx/ssl:/etc/nginx/ssl
/data/nginx/logs:/var/log/nginx
restart: always
network_mode: host # 使用host网络模式以获得更好性能
执行docker-compose up -d启动容器。
三、核心配置与调度算法实践
对于配置虚拟主机,是在/data/nginx/conf.d/default.conf里面操作的,而调度策略的配置同样也是在该文件里进行。
例如,为需要会话保持的电商应用配置ip_hash算法:
upstream cart_backend {
ip_hash;
server 10.0.1.10:8080;
server 10.0.1.11:8080;
}
server {
listen 80;
server_name www.example.com;
location /cart/ {
proxy_pass http://cart_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
server {location / {proxy_pass http://backend_pool;proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;proxy_connect_timeout 5s;proxy_read_timeout 30s;}}
配置弄好后,借由docker exec nginx_lb nginx -t去查验语法,没差错后运行docker exec nginx_lb nginx -s reload来重新加载配置。
四、健康检查与动态权重调整
1. 主动健康检查:
将健康检查参数加入到upstream块之中,以此来保证让出现故障的节点能够自动地被摘除。
upstream backend {
server 10.0.1.10:8080 max_fails=3 fail_timeout=30s;
server 10.0.1.11:8080 max_fails=3 fail_timeout=30s;
}
local backend_status = {["192.168.1.10"] = {load=0.3, connections=120},["192.168.1.11"] = {load=0.7, connections=180}}local upstream_conf = [[upstream dynamic_pool {]]for ip, stats in pairs(backend_status) dolocal weight = math.floor(10 / (stats.load * 0.5 + stats.connections / 200))upstream_conf = upstream_conf .. string.format(" server %s weight=%d;n", ip, weight)endupstream_conf = upstream_conf .. "}"-- 通过ngx.shared.DICT或文件写入更新配置

2. 借助OpenResty实现动态权重:
采取拉取OpenResty镜像的操作,使之对原生Nginx予以替换,借助Lua脚本,从Redis那里读取实时权重。
local weight = redis:get("server_weight_" .. server_ip)
if weight then
return weight
end
return 1 -- 默认权重
# Nginx状态页配置location /nginx_status {stub_status on;access_log off;allow 192.168.1.0/24;deny all;}# Prometheus监控配置示例scrape_configs:- job_name: 'nginx'static_configs:- targets: ['nginx:9113']
五、性能监控与日志分析
在宿主机那儿,去部署Prometheus,还要部署Node Exporter来采集服务器的指标,并且要集成nginx_exporter。
更改Nginx编译进行添加,添加那个标记为--with-http_stub_status_module的模块,在配置里面开启状态页面标点符号:
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
对于日志这一方面,会把Nginx容器的日志,挂载到宿主机的这个`/data/nginx/logs`路径上,然后运用GoAccess或者ELK开展实时分析。
借助docker logs nginx_lb,能够迅速查看容器运行期间出现的错误。
六、故障排查与应急处理
一出现502错误,便依次去排查后端服务状态,具体做法是:curl -I http://10.0.1.10:8080。
upstream emergency_pool {server 192.168.1.20:80; # 备用服务器server 192.168.1.21:80 backup;}
要是后端处于正常状态,那就去检查Nginx跟后端之间的网络,具体命令是:docker exec nginx_lb ping 10.0.1.10。
遇流量突增时,临时启用限流模块:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=100r/s;
location / {
limit_req zone=mylimit burst=20 nodelay;
}
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;server {location / {limit_req zone=one burst=20;proxy_pass http://backend_pool;}}
当下达紧急要执行切流操作之际,针对upstream配置,去更改有注释的故障服务器IP,而后开展执行nginx -s reload这个操作。
七、进阶部署:HTTPS与四层负载均衡
配置Let's Encrypt SSL证书自动化续签。
于宿主机那儿运行Certbot容器来获取证书,将其映射到Nginx容器的SSL目录之中。
map $http_user_agent $backend_server {default backend_pool;~"Mobile" mobile_pool;~"Android" android_pool;}upstream mobile_pool {server 192.168.1.30:80;}
就TCP/UDP协议而言像数据库读写分离这种情况,于stream块当中进行配置:
stream {
upstream mysql_backend {
server 10.0.1.10:3306;
server 10.0.1.11:3306;
}
server {
listen 3306;
proxy_pass mysql_backend;
}
}
八、最佳实践总结
stream {upstream tcp_pool {server 192.168.1.40:3306 weight=5;server 192.168.1.41:3306 weight=3;}server {listen 3306;proxy_pass tcp_pool;proxy_connect_timeout 1s;}}
有着这样一种情况,把Nginx配置、SSL证书打包成为Docker镜像,借助Kubernetes或者Docker Compose达成版本控制以及快速回滚,这被称作容器化部署标准化。
域名管理自动化强>:借着云厂商的API来动态改良DNS解析功能,达成在出现故障之际能够自动将流量切换至备用的Nginx节点。
应用安全的强化举措:于Nginx里开展配置操作,将add_header X-Frame-Options SAMEORIGIN进行设置,把server_tokens予以使用限制来隐匿版本编号,并且按照固定周期对容器镜像的安全漏洞展开扫描、排查。
经过上述那些步骤所构建的,基于Linux服务器以及Docker容器化部署的Nginx负载均衡系统,它不但能够全面地利用云原生所具备的优势,而且还能够借助精准无误的域名控制以及配置管理,达成业务的稳定运行。
提议每三个月搞一回全链路压力测试,联合云监控服务(像CloudWatch、CloudMonitor这样的)去变动后端服务器规格,保障架构能够镇定自若地应对业务洪峰的时候。

Comments NOTHING