Nginx多台服务器实现负载均衡例子

简介

在这个例子中,我们将使用 Nginx 来实现负载均衡,通过简单的三台服务器示例,演示负载均衡的实现流程。请注意,实际的生产环境通常会包含比这个例子更多的服务器,真正的优势在于大规模服务器集群时才能体现出来。

环境准备

在开始操作之前,请确保您的三台服务器已经安装了 Nginx。如果尚未安装,您可以参考以下链接完成安装:Nginx 安装指南

安装完成后,启动三台服务器的 Nginx 服务:

systemctl start nginx

Nginx 负载均衡服务器的 nginx.conf 配置注释如下:

events
{
    use epoll;
    worker_connections 65535;
}
http
{
    ##upstream的负载均衡,四种调度算法##
    # 调度算法1:轮询.每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响
    upstream webhost {
        server 192.168.0.5:6666 ;
        server 192.168.0.7:6666 ;
    }
    # 调度算法2:weight(权重).可以根据机器配置定义权重.权重越高被分配到的几率越大
    upstream webhost {
        server 192.168.0.5:6666 weight=2;
        server 192.168.0.7:6666 weight=3;
    }
    # 调度算法3:ip_hash. 每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题
    upstream webhost {
        ip_hash;
        server 192.168.0.5:6666 ;
        server 192.168.0.7:6666 ;
    }
    # 调度算法4:url_hash(需安装第三方插件).此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率.Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包
    upstream webhost {
        server 192.168.0.5:6666 ;
        server 192.168.0.7:6666 ;
        hash $request_uri;
    }
    # 调度算法5:fair(需安装第三方插件).这是比上面两个更加智能的负载均衡算法.此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配.Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块
    #
    # 虚拟主机的配置(采用调度算法3:ip_hash)
    server
    {
        listen 80;
        server_name mongo.demo.com;
        # 对 "/" 启用反向代理
        location / {
            proxy_pass http://webhost;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
            # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            # 以下是一些反向代理的配置,可选.
            proxy_set_header Host $host;
            client_max_body_size 10m; # 允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k; # 缓冲区代理缓冲用户端请求的最大字节数,
            proxy_connect_timeout 90; # nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90; # 后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90; # 连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k; # 设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k; # proxy_buffers缓冲区,网页平均在32k以下的设置
            proxy_busy_buffers_size 64k; # 高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;
            # 设定缓存文件夹大小,大于这个值,将从upstream服务器传
        }
    }
}

服务器信息

Nginx 负载均衡服务器

  • IP 地址:192.168.0.4(Nginx-Server)

Web 服务器列表

  • Web1:192.168.0.5(Nginx-Node1/Nginx-Web1)
  • Web2:192.168.0.7(Nginx-Node2/Nginx-Web2)

实现目标

当用户访问 Nginx-Server 时,通过 Nginx 的负载均衡功能将请求分发到 Web1 和 Web2 服务器上。

Nginx 负载均衡配置

打开 Nginx 的配置文件(通常在/etc/nginx/nginx.conf),并按照以下方式配置 Nginx 的负载均衡:

events {
    use epoll;
    worker_connections 65535;
}

http {
    upstream webhost {
        ip_hash;
        server 192.168.0.5:6666;
        server 192.168.0.7:6666;
    }

    server {
        listen 80;
        server_name example.com;  # 修改为您的域名或IP地址

        location / {
            proxy_pass http://webhost;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            client_max_body_size 10m;
            client_body_buffer_size 128k;
            proxy_connect_timeout 90;
            proxy_send_timeout 90;
            proxy_read_timeout 90;
            proxy_buffer_size 4k;
            proxy_buffers 4 32k;
            proxy_busy_buffers_size 64k;
            proxy_temp_file_write_size 64k;
        }
    }
}

在这个配置中,我们使用了 Nginx 的ip_hash模块,它会根据访问者的 IP 地址将请求分发到后端服务器,这样来自同一个 IP 的访客会固定访问一个后端服务器。当然,您也可以根据需求选择其他负载均衡算法。

测试负载均衡

  1. 在 Nginx-Node1/Nginx-Web1 服务器上编辑网页内容:

    进入 Nginx 的默认网页文件夹(通常在/usr/share/nginx/html/),编辑index.html文件,添加以下内容:

    <div><h1>The host is 192.168.0.5 - Node 1!</h1></div>
  2. 在 Nginx-Node2/Nginx-Web2 服务器上编辑网页内容:

    进入 Nginx 的默认网页文件夹,编辑index.html文件,添加以下内容:

    <div><h1>The host is 192.168.0.7 - Node 2!</h1></div>
  3. 在浏览器中访问 Nginx-Server(192.168.0.4)的 IP 地址:

    如果页面显示”The host is 192.168.0.5 - Node 1!”,则代表负载均衡成功地将请求分发到了 Nginx-Node1/Nginx-Web1 服务器上。

  4. 刷新页面:

    页面可能会切换为”The host is 192.168.0.7 - Node 2!”,这表示请求已经被成功分发到了 Nginx-Node2/Nginx-Web2 服务器上。

  5. 反复刷新页面:

    您会发现页面不断地在 Nginx-Node1 和 Nginx-Node2 之间切换,这是因为负载均衡在不断地轮询分发请求。

总结

通过这个简单的 Nginx 多台服务器负载均衡的例子,您可以了解到负载均衡是如何工作的。在实际生产环境中,您可以使用更多的服务器,并根据需要调整 Nginx 的负载均衡算法,以确保高可用性和性能。

©著作权归作者所有,转载或内容合作请联系作者