于Linux环境之中,运用Nginx开展负载均衡的配置操作,此乃是提升Web服务具备高可用性的核心运维手段方法。

此刻,吾等姑且不提关于全局的配置内容,而是着重聚焦于怎样在实实在在的、供云服务之用的服务器上边,借助 Nginx 把流量分发到后端的服务这儿,并且将域名解析跟 Docker 部署相互结合起来,进而达成一套完备且稳固的负载均衡方案。

一、环境准备与 Nginx 安装

在云服务器上,以CentOS 7/8或者Ubuntu 20.04/22.04这两种情形为例,你要去安装Nginx。

1. 连接服务器并更新系统

ssh root@你的服务器IP
# CentOS
yum update -y
# Ubuntu
apt update && apt upgrade -y

2. 安装 Nginx

建议直接通过官方源安装,确保版本最新。

Nginx负载均衡算法详解_Nginx负载均衡配置教程_服务器负载均衡配置

# CentOS
yum install nginx -y
# Ubuntu
apt install nginx -y

3. 启动并设置开机自启

systemctl start nginx
systemctl enable nginx

安装完毕了以后,去到访那服务器的公网 IP,瞅见 Nginx 欢迎页面那就是意味着成功了。

二、Nginx 负载均衡核心配置实战

设想一下,你有一个业务系统,这般系统比如是基于 Spring Boot 以及 Vue 的后台架构,它已然被制作成 Docker 镜像,并且在两台服务器之上运行,或者是在同一台服务器的不同端口处运行。

我们规划如下后端服务节点:

Web服务器 A:192.168.1.10:8080

Web服务器 B:192.168.1.11:8080

目前,我们会于 Nginx 里设置一个负载均衡器,把源自用户(借助域名进行访问)的请求分派至这两个节点。

1. 定义上游服务器池

进行 Nginx 主配置文件的编辑操作,该文件路径为 /etc/nginx/nginx.conf,或者在 /etc/nginx/conf.d/ 这个目录下创建一个全新的配置文件,例子是以 loadbalance.conf 作为名称,如此来做管理会更加清晰。

upstream backend_servers {
# 默认采用轮询算法
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
# 如果需要加权轮询,可以增加权重
# server 192.168.1.10:8080 weight=3;
# server 192.168.1.11:8080 weight=1;
}

upstream backend {  
    server backend1.example.com;  
    server backend2.example.com;  
    server backend3.example.com;  
}  
  
server {  
    ...  
    location / {  
        proxy_pass http://backend;  
    }  
    ...  
}

此处在的 max_fails 以及 fail_timeout 是达成 被动健康检查 的要点,对吧。

倘若Nginx于fail_timeout这段时间之内,跟后端服务器进行通信时遭遇失败,且达到了max_fails这个次数,那么该服务器就会被标记成不可用状态,持续时长为fail_timeout时间。

2. 配置 Server 块并绑定域名

假定你已然买下域名 www.example.com,且把它的解析记录(A记录)朝着这台Nginx服务器的公网IP去进行指向。

server {
listen 80;
server_name www.example.com;  # 你的域名
location / {
proxy_pass http://backend_servers;  # 转发到 upstream 定义的服务池
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;
# 以下配置用于被动健康检查的超时设置
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
}
}
3. 配置主动健康检查(进阶)

http {  
    upstream myapp1 {  # 定义一个名为myapp1的服务器组  
        server backend1.example.com weight=5;  # 添加一个服务器,并设置权重为5  
        server backend2.example.com;  # 添加另一个服务器,权重默认为1  
        server backend3.example.com down;  # 将此服务器标记为down,不参与负载均衡  
        server backup1.example.com backup;  # 将此服务器作为备份服务器  
    }  
  
    server {  
        listen 80;  # 监听80端口  
  
        location / {  # 匹配所有请求  
            proxy_pass http://myapp1;  # 将请求转发到myapp1服务器组  
            proxy_set_header Host $host;  # 设置请求头中的Host字段为原始请求的Host  
            proxy_set_header X-Real-IP $remote_addr;  # 设置请求头中的X-Real-IP字段为客户端的真实IP地址  
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 设置请求头中的X-Forwarded-For字段,以记录原始请求和代理链的IP地址  
            proxy_set_header X-Forwarded-Proto $scheme;  # 设置请求头中的X-Forwarded-Proto字段为原始请求的协议(http或https)  
        }  
    }  
}

在需要更为精确健康相关检查的情形下,Nginx开源版本能够借助 ngx_http_upstream_hc_module 达成,不过呢这是需要在编译阶段予以添加,或者使用Plus版本才行。

处于Docker场景之中,我们更为推荐借助脚本予以辅助,同时借助第三方工具予以辅助,然而那简单的配置能够凭借如下方式去强化:

改写 upstream 块,将 zone 指令予以引入,(此过程需要安装相应的模块,通常情况默认是未开启的,这一步仅仅是作为参考,在实际操作过程中常常会与上述的被动检查相互结合):

upstream backend_servers {
zone backend 64k;  # 共享内存,用于健康检查状态存储
server 192.168.1.10:8080;
server 192.168.1.11:8080;
# 主动健康检查配置(需模块支持)
health_check interval=5s fails=3 passes=2 uri=/actuator/health;
}

Nginx负载均衡算法详解_服务器负载均衡配置_Nginx负载均衡配置教程

要是后端属于 Spring Boot 应用,一般而言会给出 /actuator/health 端点用以进行健康检测。

三、结合 Docker 部署后端服务

upstream backend {  
    ip_hash;  
    server backend1.example.com;  
    server backend2.example.com;  
    server backend3.example.com;  
}  
  
server {  
    ...  
    location / {  
        proxy_pass http://backend;  
    }  
    ...  
}

为了达成整个架构具备可移植性、拥有易扩展性的目的,建议运行后端服务借助 Docker来进行。

在 Web 服务器 A (192.168.1.10) 上:

docker run -d --name myapp1 -p 8080:8080 your-image:tag

在 Web 服务器 B (192.168.1.11) 上:

docker run -d --name myapp2 -p 8080:8080 your-image:tag

如果只有一台服务器,为了模拟多节点,可以映射不同端口:

# 在同一台机器上运行两个容器
docker run -d --name myapp1 -p 8081:8080 your-image:tag
docker run -d --name myapp2 -p 8082:8080 your-image:tag

此刻,Nginx 的upstream需要被设置成127.0.0.1:8081以及127.0.0.1:8082来进行应配置。

四、配置域名与 SSL(HTTPS)

生产环境必须开启 HTTPS。

upstream backend {  
    least_conn;  
    server backend1.example.com;  
    server backend2.example.com;  
    server backend3.example.com;  
}  
  
stream {  
    server {  
        listen 12345;  
        proxy_pass backend;  
    }  
}

Certbot 的使用能够迅速地去申请 Let's Encrypt 的免费证书。

1. 安装 Certbot

yum install certbot python3-certbot-nginx -y  # CentOS
apt install certbot python3-certbot-nginx -y  # Ubuntu

2. 自动获取并配置证书

http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        check interval=3000 rise=2 fall=5 timeout=1000 type=http;
        check_http_send "HEAD /health HTTP/1.1rnHost: localhostrnConnection: closernrn";
        check_http_expect_alive http_2xx http_3xx;
    }
    server {
        location / {
            proxy_pass http://backend;
        }
    }
}

certbot --nginx -d www.example.com

Certbot会主动对Nginx配置作出修改,增添SSL关联指令,且把HTTP重定向为HTTPS。

修改后的 server 块大致如下:

server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://backend_servers;
# ... 其余代理配置
}
}

五、验证与测试

配置完成后,务必检查语法并重载服务:

nginx -t
systemctl reload nginx

凭藉浏览器途径到达 https://www.example.com,去查验请求是不是被均匀地进行了分发。

你可以通过观察后端服务的访问日志来确认负载均衡效果。

历经上述那些步骤,你不但达成了依托 Nginx 的负载均衡,还融合上了云服务器、域名解析、Docker 容器化部署以及 HTTPS 安全加固,塑造出了一整套完备的、能够应用于生产环境的具备高可用性的 Web 架构。

http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com max_fails=2 fail_timeout=30s;
    }
    server {
        listen 80;
        location / {
            proxy_pass backend;
            proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
        }
    }
}

这种配置方案能有效提升应用的并发处理能力与容灾水平。