所处之地为基于Linux系统的生产环境,在此环境里面,进行高可用架构的部署作业,这一部署作业乃是保障业务连续性得以顺利维持的基石根基之处哦。

先把Nginx布置在Docker容器里头,并关联云服务器以及域名服务,如此一来,我们能够搭建起一套拥有弹性伸缩本事的负载均衡系统。

以下将从环境搭建到上线运维,提供一套完整的落地实施方案。

一、环境准备:云服务器与域名解析

在主流云服务商之中,像阿里云,还有腾讯云,去挑选两台以上,操作系统是CentOS 7.9或者Ubuntu 22.04的云服务器,建议这种云服务器的配置弄成2核4GB,它们要分别去承担Nginx节点以及后端应用服务器的角色。

  1. upstream backend_pool {
  2. server 192.168.1.10:80 weight=5;
  3. server 192.168.1.11:80 weight=3;
  4. server 192.168.1.12:80 backup;
  5. least_conn; # 最少连接数算法
  6. keepalive 32; # 长连接复用
  7. }

达成购买操作之后,面向服务器关联弹性公网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 "";
}
}

  1. server {
  2. location / {
  3. proxy_pass http://backend_pool;
  4. proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
  5. proxy_connect_timeout 5s;
  6. proxy_read_timeout 30s;
  7. }
  8. }

配置弄好后,借由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;
}

  1. local backend_status = {
  2. ["192.168.1.10"] = {load=0.3, connections=120},
  3. ["192.168.1.11"] = {load=0.7, connections=180}
  4. }
  5. local upstream_conf = [[
  6. upstream dynamic_pool {
  7. ]]
  8. for ip, stats in pairs(backend_status) do
  9. local weight = math.floor(10 / (stats.load * 0.5 + stats.connections / 200))
  10. upstream_conf = upstream_conf .. string.format(" server %s weight=%d;n", ip, weight)
  11. end
  12. upstream_conf = upstream_conf .. "}"
  13. -- 通过ngx.shared.DICT或文件写入更新配置

负载均衡Nginx配置_服务器负载均衡配置_Nginx高可用架构设计

2. 借助OpenResty实现动态权重

采取拉取OpenResty镜像的操作,使之对原生Nginx予以替换,借助Lua脚本,从Redis那里读取实时权重。

local weight = redis:get("server_weight_" .. server_ip)
if weight then
return weight
end
return 1  -- 默认权重

  1. # Nginx状态页配置
  2. location /nginx_status {
  3. stub_status on;
  4. access_log off;
  5. allow 192.168.1.0/24;
  6. deny all;
  7. }
  8. # Prometheus监控配置示例
  9. scrape_configs:
  10. - job_name: 'nginx'
  11. static_configs:
  12. - 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

  1. upstream emergency_pool {
  2. server 192.168.1.20:80; # 备用服务器
  3. server 192.168.1.21:80 backup;
  4. }

要是后端处于正常状态,那就去检查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;
}

  1. limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
  2. server {
  3. location / {
  4. limit_req zone=one burst=20;
  5. proxy_pass http://backend_pool;
  6. }
  7. }

当下达紧急要执行切流操作之际,针对upstream配置,去更改有注释的故障服务器IP,而后开展执行nginx -s reload这个操作。

七、进阶部署:HTTPS与四层负载均衡

配置Let's Encrypt SSL证书自动化续签。

于宿主机那儿运行Certbot容器来获取证书,将其映射到Nginx容器的SSL目录之中。

  1. map $http_user_agent $backend_server {
  2. default backend_pool;
  3. ~"Mobile" mobile_pool;
  4. ~"Android" android_pool;
  5. }
  6. upstream mobile_pool {
  7. server 192.168.1.30:80;
  8. }

就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;
}
}

八、最佳实践总结

  1. stream {
  2. upstream tcp_pool {
  3. server 192.168.1.40:3306 weight=5;
  4. server 192.168.1.41:3306 weight=3;
  5. }
  6. server {
  7. listen 3306;
  8. proxy_pass tcp_pool;
  9. proxy_connect_timeout 1s;
  10. }
  11. }

有着这样一种情况,把Nginx配置、SSL证书打包成为Docker镜像,借助Kubernetes或者Docker Compose达成版本控制以及快速回滚,这被称作容器化部署标准化。

域名管理自动化:借着云厂商的API来动态改良DNS解析功能,达成在出现故障之际能够自动将流量切换至备用的Nginx节点。

应用安全的强化举措:于Nginx里开展配置操作,将add_header X-Frame-Options SAMEORIGIN进行设置,把server_tokens予以使用限制来隐匿版本编号,并且按照固定周期对容器镜像的安全漏洞展开扫描、排查。

经过上述那些步骤所构建的,基于Linux服务器以及Docker容器化部署的Nginx负载均衡系统,它不但能够全面地利用云原生所具备的优势,而且还能够借助精准无误的域名控制以及配置管理,达成业务的稳定运行。

提议每三个月搞一回全链路压力测试,联合云监控服务(像CloudWatch、CloudMonitor这样的)去变动后端服务器规格,保障架构能够镇定自若地应对业务洪峰的时候。