首页 > 系统相关 >基于 Nginx 的大型互联网集群架构与实战方案

基于 Nginx 的大型互联网集群架构与实战方案

时间:2024-10-10 21:02:50浏览次数:1  
标签:架构 nginx Keepalived Nginx 集群 proxy 服务器 com

1. Nginx 负载均衡基础配置

首先,搭建一个基础的 Nginx 负载均衡器,用于将流量分发到多个后端服务器上。

步骤 1.1:安装 Nginx

在每台要作为负载均衡器的服务器上,安装 Nginx。可以使用包管理工具进行安装,例如在 Ubuntu 上执行以下命令:

sudo apt update
sudo apt install nginx

步骤 1.2:配置 Nginx 负载均衡

Nginx 的核心是配置文件 nginx.conf,我们可以在其中定义后端服务器池以及负载均衡策略。以下是一个简单的 Nginx 负载均衡配置:

# 定义一个名为 backend 的后端服务器池
upstream backend {
   server backend1.example.com weight=5;  # 设置权重
   server backend2.example.com weight=3;
   server backend3.example.com weight=2;
   
   # 启用健康检查(需要 Nginx Plus 支持开箱配置,开源版本需要第三方模块)
   # Nginx Plus 示例:
   health_check interval=10s fails=3 passes=2;
}

# 配置 HTTP 服务器
server {
   listen 80;
   server_name loadbalancer.example.com;

   location / {
       proxy_pass http://backend;
       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),并为各服务器分配了不同的权重,Nginx 根据权重将流量按照比例分发到后端服务器。

  • 健康检查:此配置会定期检查后端服务器是否可用,确保当某个服务器宕机时,不会继续向其发送请求。

  • proxy_pass:将客户端请求代理到后端服务器池。

步骤 1.3:启动和测试 Nginx

确保配置无误后,启动或重启 Nginx 服务:

sudo nginx -t  # 测试配置文件是否正确
sudo systemctl restart nginx  # 重启 Nginx

测试:通过访问 http://loadbalancer.example.com,验证请求是否被均匀分发到后端服务器。

2. 高可用性配置(Keepalived + Nginx)

单独使用 Nginx 进行负载均衡仍然会面临单点故障问题。如果前端的 Nginx 宕机,整个服务将不可用。因此,我们需要通过 Keepalived 实现高可用的 Nginx 集群。

步骤 2.1:安装 Keepalived

在每台 Nginx 服务器上安装 Keepalived。以 Ubuntu 为例:

sudo apt install keepalived

步骤 2.2:配置 Keepalived

Keepalived 通过虚拟 IP 地址(VIP)实现故障转移。当主服务器宕机时,VIP 自动切换到备用服务器,确保服务的高可用性。

在主 Nginx 服务器上,编辑 Keepalived 的配置文件 /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 123456  # 密码
  }
  virtual_ipaddress {
       192.168.0.100  # 虚拟IP地址
  }
  track_script {
      chk_nginx  # 监控 Nginx 状态的脚本
  }
}

在备用 Nginx 服务器上,将 state 设置为 BACKUP,并将 priority 设置为较低的值,例如 90。

步骤 2.3:监控 Nginx 状态

Keepalived 可以通过监控 Nginx 的运行状态来决定是否切换 VIP。创建一个监控脚本 /etc/keepalived/check_nginx.sh

#!/bin/bash
if ! pidof nginx > /dev/null
then
  systemctl stop keepalived  # 如果 Nginx 停止,关闭 Keepalived 以触发 VIP 切换
fi

将此脚本添加为可执行:

sudo chmod +x /etc/keepalived/check_nginx.sh

在 Keepalived 的配置文件中添加监控脚本:

vrrp_script chk_nginx {
  script "/etc/keepalived/check_nginx.sh"
  interval 2
}

步骤 2.4:启动 Keepalived

完成配置后,启动或重启 Keepalived 服务:

sudo systemctl restart keepalived

测试:关闭主服务器的 Nginx,VIP 应该自动切换到备用服务器,确保服务不中断。

3. Nginx 健康检查和动态扩展

Nginx 可以结合健康检查功能,确保只有状态正常的服务器参与负载均衡。另外,动态扩展是应对突发流量的关键。以下是相关配置和实战方案。

步骤 3.1:配置健康检查(开源版本)

Nginx 开源版本不自带健康检查模块,可以通过第三方模块(如 ngx_http_healthcheck_module)实现健康检查。假设已安装此模块,配置如下:

upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;

# 使用第三方模块实现健康检查
check interval=5000 rise=2 fall=5 timeout=2000;
}

步骤 3.2:动态扩展后端服务器

结合容器化技术(如 Docker 或 Kubernetes),可以根据流量自动扩展后端服务器。例如,在 Kubernetes 集群中可以使用 Horizontal Pod Autoscaler (HPA) 自动扩展应用服务的副本数。

以下是在 Kubernetes 中配置自动扩展的示例:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: backend-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: backend
minReplicas: 3
maxReplicas: 10
targetCPUUtilizationPercentage: 70 # 当 CPU 利用率超过 70% 时扩容

通过这种方式,后端服务可以根据负载动态扩展,Nginx 通过配置服务发现机制可以自动识别新的后端服务器。

4. Nginx SSL/TLS 配置

在生产环境中,启用 HTTPS 是必不可少的。以下是启用 SSL/TLS 的配置:

步骤 4.1:生成或获取 SSL 证书

使用 Let's Encrypt 生成免费的 SSL 证书:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com

步骤 4.2:配置 Nginx 使用 SSL

server {
listen 443 ssl;
server_name yourdomain.com;

ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

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

# 自动将 HTTP 请求重定向到 HTTPS
server {
listen 80;
server_name yourdomain.com;
return 301 https://$host$request_uri;
}

总结

通过 Nginx 的负载均衡、Keepalived 实现高可用、动态扩展后端服务器以及健康检查,构建了一个高效、可扩展且高可用的互联网集群架构。

标签:架构,nginx,Keepalived,Nginx,集群,proxy,服务器,com
From: https://www.cnblogs.com/fqxm/p/18457121

相关文章

  • 尚硅谷rabbitmq 2024 第50节 集群负载均衡 核心功能 答疑
    消费者用@RabbitListener或者@KafkaLisenter,那生产者呢(springboot)在SpringBoot中,生产者可以使用`RabbitTemplate`来发送消息到RabbitMQ。以下是一个简单的示例:```javaimportorg.springframework.amqp.rabbit.core.RabbitTemplate;importorg.springframework.beans.fac......
  • 尚硅谷rabbitmq 2024 集群ui 第49节 答疑三
    rabbitmq集群做负载均衡还要用haproxy才行吗?kafka也是这样要借助外部工具吗?是的,在RabbitMQ集群中,通常会使用HAProxy或类似的负载均衡器来分配客户端请求。这是因为RabbitMQ本身并不具备内置的负载均衡功能。HAProxy可以帮助你将客户端连接均匀地分配到不同的RabbitMQ......
  • Docker 环境下 Nginx 监控实战:使用 Prometheus 实现 Nginx 性能监控的完整部署指南
    Docker环境下Nginx监控实战:使用Prometheus实现Nginx性能监控的完整部署指南文章目录Docker环境下Nginx监控实战:使用Prometheus实现Nginx性能监控的完整部署指南一查看模块是否安装二配置status访问端点三Docker部署nginx-prometheus-exporter1)使用......
  • Docker安装Nginx
    1.下载镜像文件dockerpullnginx2.创建挂载目录mkdir-p/docker/nginx/{conf,conf.d,html,logs}3.创建nginx.conf配置文件路径为:/docker/nginx/conf/nginx.confusernginx;worker_processes1;error_log/var/log/nginx/error.logwarn;pid/var/run/ngin......
  • AWS Linux2 安装 nginx
    如果您使用的是AWSLinux2,则必须从AWS“ExtrasRepository”安装 nginx。要查看可用包的列表:#Viewlistofpackagestoinstallamazon-linux-extraslist您会看到类似于以下内容的列表:0ansible2disabled[=2.4.2]1emacsdisabled[=25.3]2memcached1......
  • 一文搞懂SaaS业务架构:价值流、业务能力、业务流程、业务对象、组织架构
    1目标与步骤2价值流分析2.1从价值主张到价值流2.2价值流的概念2.2价值流如何识别?2.3价值流阶段如何识别?3业务流程3.1业务流程的概念3.2端到端流程3.3职能流程3.4示例:零售企业的业务流程4业务能力4.1业务能力的概念4.2业务能力的构成4.3业务流程与业......
  • 提升网站响应速度与可靠性:Nginx负载均衡最佳实践 转载
    负载均衡配置作为代理服务器,一般都需要向上游服务器的集群转发请求。这里的负载均衡是指选择一种策略,尽量把请求平均地分布到每一台上游服务器上。1.1upstream块语法:upstreamname{...}配置块:httpupstream块定义了一个上游服务器的集群,便于反向代理中的proxy_pa......
  • k8s集群搭建
    一、master上kubeadminit\--apiserver-advertise-address=192.168.0.120\--image-repositoryregistry.aliyuncs.com/google_containers\--kubernetes-versionv1.23.6\--service-cidr=10.96.0.0/12\--pod-network-cidr=10.244.0.0/16......
  • 在K8S中,外部如何访问集群内的服务?
    在Kubernetes(K8s)中,外部访问集群内的服务通常依赖于几种不同的方法,这些方法的选择取决于集群的部署环境、网络架构以及安全性和可扩展性的要求。以下是一些常见的方式:1.使用NodePort类型的Service定义:NodePort类型的Service会在每个集群节点上开放一个特定的端口(可以是系统自动......
  • Unbuntu nginx 安装
    1.下载源码下载页面:https://nginx.org/en/download.html下载地址:https://nginx.org/download/nginx-1.27.2.tar.gzcurl-Ohttps://nginx.org/download/nginx-1.27.2.tar.gz2.依赖配置sudoaptinstallgccmakelibpcre3-devzlib1g-devopenssllibssl-dev3.编译解压......