0551-期中集群架构nginx负载均衡实践

简介:

一    环境准备

服务器说明

外网IPNAT

内网IPNAT

主机名称规划

A1-nginx负载服务器01

10.0.0.5/24

172.16.1.5/24

lb01

A2-nginx负载服务器02

10.0.0.6/24

172.16.1.6/24

lb02

安装反向代理,负载均衡就是安装nginx,安装nginx和之前安装web一样的。


nginx反向代理负载均衡安装(和安装nginx web服务器一样的)
1 安装依赖软件包命令集合
yum install openssl openssl-devel pcre pcre-devel -y
rpm -qa openssl openssl-devel pcre pcre-devel
2 安装nginx软件包命令集合
mkdir -p /home/oldboy/tools
cd /home/oldboy/tools
wget -q http://nginx.org/download/nginx-1.6.3.tar.gz
ls -l nginx-1.6.3.tar.gz
useradd nginx -s /sbin/nologin -M
tar xf nginx-1.6.3.tar.gz
cd nginx-1.6.3
./configure --user=nginx --group=nginx --prefix=/application/nginx-1.6.3 --with-http_stub_status_module --with-http_ssl_module
make
make install
ln -s /application/nginx-1.6.3 /application/nginx

3.配置
[root@lb01 nginx-1.6.3]# ll /application/nginx/
总用量 16
drwxr-xr-x 2 root root 4096 8月  30 22:39 conf
drwxr-xr-x 2 root root 4096 8月  30 22:39 html
drwxr-xr-x 2 root root 4096 8月  30 22:39 logs
drwxr-xr-x 2 root root 4096 8月  30 22:39 sbin
[root@lb01 nginx-1.6.3]# cd /application/nginx/conf/ 
[root@lb01 conf]# ll
总用量 60
-rw-r--r-- 1 root root 1034 8月  30 22:39 fastcgi.conf
-rw-r--r-- 1 root root 1034 8月  30 22:39 fastcgi.conf.default
-rw-r--r-- 1 root root  964 8月  30 22:39 fastcgi_params
-rw-r--r-- 1 root root  964 8月  30 22:39 fastcgi_params.default
-rw-r--r-- 1 root root 2837 8月  30 22:39 koi-utf
-rw-r--r-- 1 root root 2223 8月  30 22:39 koi-win
-rw-r--r-- 1 root root 3957 8月  30 22:39 mime.types
-rw-r--r-- 1 root root 3957 8月  30 22:39 mime.types.default
-rw-r--r-- 1 root root 2656 8月  30 22:39 nginx.conf
-rw-r--r-- 1 root root 2656 8月  30 22:39 nginx.conf.default
-rw-r--r-- 1 root root  596 8月  30 22:39 scgi_params
-rw-r--r-- 1 root root  596 8月  30 22:39 scgi_params.default
-rw-r--r-- 1 root root  623 8月  30 22:39 uwsgi_params
-rw-r--r-- 1 root root  623 8月  30 22:39 uwsgi_params.default
-rw-r--r-- 1 root root 3610 8月  30 22:39 win-utf
[root@lb01 conf]# egrep -v "#|^$" nginx.conf.default >nginx.conf
[root@lb01 conf]# vim nginx.conf
把17 18 19 20 行删除
 1 worker_processes  1;
  2 events {
  3     worker_connections  1024;
  4 }
  5 http {
  6     include       mime.types;
  7     default_type  application/octet-stream;
  8     sendfile        on;
  9     keepalive_timeout  65;
 10     server {
 11         listen       80;
 12         server_name  localhost;
 13         location / {
 14             root   html;
 15             index  index.html index.htm;
 16         }
 17         error_page   500 502 503 504  /50x.html;
 18         location = /50x.html {
 19             root   html;
 20         }
 21     }
 22 }
然后在server标签上面增加如下几行
    upstream www_server_pools { #<==这里是定义web服务器池,包含了7,8两个web节点
      server 10.0.0.7:80 weight=1;
      server 10.0.0.8:80 weight=1;
    }
然后在index这行的下面增加如下内容:
proxy_pass http://www_server_pools;
然后把代理的服务器localhost修改为代理的服务器,例如:www.etiantian.org
最后完成的nginx.conf配置如下
[root@lb01 conf]# cat nginx.conf 
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream www_server_pools { 
        server 10.0.0.7:80   weight=1;
        server 10.0.0.8:80   weight=1;
    }
    server {
        listen       80;
        server_name  www.etiantian.org;
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://www_server_pools;
        }
    }
}
这样负载均衡就配置完成了。
接下来nginx语法检查,启动nginx服务。
[root@lb01 conf]# ../sbin/nginx -t
nginx: the configuration file /application/nginx-1.6.3/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.6.3/conf/nginx.conf test is successful
[root@lb01 conf]# ../sbin/nginx
[root@lb01 conf]# ../sbin/nginx -s reload
[root@lb01 conf]# lsof -i :80
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   4285  root    6u  IPv4  17693      0t0  TCP *:http (LISTEN)
nginx   4288 nginx    6u  IPv4  17693      0t0  TCP *:http (LISTEN)

lb01作为客户端测试下:
[root@lb02 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.5      lb01 www.etiantian.org etiantian.org blog.etiantian.org bbs.etiantian.org
172.16.1.6      lb02
172.16.1.7      web02
172.16.1.8      web01 
172.16.1.51     db01 db01.etiantian.org
172.16.1.31     nfs01
172.16.1.41     backup
172.16.1.61     m01
[root@lb02 ~]# for n in `seq 100`;do curl www.etiantian.org;sleep 1;done
[root@lb02 ~]# for n in `seq 100`;do curl www.etiantian.org/index.html;sleep 1;done
nginx www
apache www
nginx www
apache www
[root@lb02 ~]# for n in `seq 100`;do curl www.etiantian.org;sleep 1;done           
nginx www
apache www
nginx www
apache www
nginx www
负载到两个web服务器上面来回切换。
proxy_pass http://www_server_pools;这行后面加一样添加请求头。
            proxy_set_header Host $host;  ##加请求头。
客户端请求www.etiantian.org给负载均衡nginx,默认nginx是不带请求头的,如果加了请求头就可以找到想要的虚拟主机了。
默认情况下web节点的access.log 日志里面IP不是用户的ip地址,而是代理的IP。
要想实现节点中记录用户的ip地址,需要在proxy_set_header Host $host;后面再加一行,如下:
proxy_set_header X-Forwarded-For $remote_addr;
[root@web01 logs]# pwd
/application/nginx/logs
[root@web01 logs]# cat access.log

同理,把lb02也配置和lb01一样的负载均衡。
lb02里面的nginx.conf配置要和lb01一样
先把lob01机器停掉。
[root@lb01 ~]# pkill nginx
然后在m01机器里面测试
for n in `seq 100`;do curl 172.16.1.6/index.html;sleep 1;done
可以看到lb02代理服务器一会代理web01一会代理web02
[root@m01 ~]# for n in `seq 100`;do curl 172.16.1.6/index.html;sleep 1;done
nginx www
apache www
如何实现lb高可用呢?
负载均衡器的VIP规划为10.0.0.3/24
在两台机器上面配置辅助IP 
[root@lb01 ~]# ip addr add 10.0.0.3/24 dev eth0 label eth0:0
windows hosts文件增加解析:
10.0.0.3 www.etiantian.org bbs.etiantian.org blog.etiantian.org etiantian.org
然后lb01再配置反向代理
在ie中输入http://blog.etiantian.org/就可以访问blog了,可以看到博客文字和图片。
然后ie中ping blog.etiantian.org 就可以看到返回的lb01虚ip地址了10.0.0.3
C:\Users\Administrator>ping blog.etiantian.org
正在 Ping www.etiantian.org [10.0.0.3] 具有 32 字节的数据:
来自 10.0.0.3 的回复: 字节=32 时间<1ms TTL=64
来自 10.0.0.3 的回复: 字节=32 时间<1ms TTL=64
来自 10.0.0.3 的回复: 字节=32 时间<1ms TTL=64
来自 10.0.0.3 的回复: 字节=32 时间<1ms TTL=64

10.0.0.3 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms
继续把lb02里面的nginx.conf配置和lb01一样的,然后配置和lb01一样的虚ip地址
[root@lb02 conf]# ip addr add 10.0.0.3/24 dev eth0 label eth0:0
这样lb01和lb01就实现了负载均衡反向代理。

下面用keepalived实现
lb01和lb01同时按照yum install keepalived -y 
[root@lb01 ~]# yum install keepalived -y

编辑/etc/keepalived/keepalived.conf文件为如下内容:
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf    
! Configuration File for keepalived

global_defs {
   notification_email {
   13779258@qq.com
   }
   notification_email_from 13779258@qq.com
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    10.0.0.3/24 dev eth0 label eth0:1
    }
}
然后scp拷贝给lb02机器
[root@lb01 ~]# scp /etc/keepalived/keepalived.conf root@172.16.1.6:/etc/keepalived/
然后修改lb02的keepalived.conf配置文件,修改完成后一定要重启下nginx服务。
[root@lb02 conf]# vim /etc/keepalived/keepalived.conf
修改的内容为:
router_id LVS_DEVEL1
state BACKUP
priority 100

然后lb01和lb02都启动keepalived
[root@lb01 ~]# /etc/init.d/keepalived start
正在启动 keepalived:                                      [确定]
[root@lb02 conf]# /etc/init.d/keepalived start                                    
正在启动 keepalived:                                      [确定]
启动后主keepalivedlb01先获取到资源,只有当主的挂了从lb02才启动。
检查有没有启动:
[root@lb01 ~]# ip addr|grep 10.0.0.3
    inet 10.0.0.3/24 scope global secondary eth0:0
[root@lb02 conf]# ip addr|grep 10.0.0.3
    inet 10.0.0.3/24 scope global secondary eth0:0
先把手工配置的虚IPdown了,要不冲突了。
[root@lb01 ~]# ifconfig eth0:0 down
[root@lb01 ~]# ip addr|grep 10.0.0.3
[root@lb02 conf]# ifconfig eth0:0 down
[root@lb02 conf]# ip addr|grep 10.0.0.3

重启服务器后发现只有lb01主keepalived有虚ip,从lb01keepalived没有虚ip,这就说明成功了。
[root@lb01 ~]# /etc/init.d/keepalived restart
停止 keepalived:                                          [确定]
正在启动 keepalived:                                      [确定]
[root@lb01 ~]# ip addr|grep 10.0.0.3         
    inet 10.0.0.3/24 scope global secondary eth0:1

[root@lb02 conf]# /etc/init.d/keepalived restart
停止 keepalived:                                          [确定]
正在启动 keepalived:                                      [确定]
[root@lb02 conf]# ip addr|grep 10.0.0.3   

如果两个都有IP就说明会列脑了。出问题了

然后ie再访问http://blog.etiantian.org/
就可以看到图片和文字的博客了。

现在测试把lb01机器挂掉,然后查看lb01是否有虚ip地址:
[root@lb02 conf]# ip addr|grep 10.0.0.3
    inet 10.0.0.3/24 scope global secondary eth0:1
然后在登录ie测试:可以正常登录blog.etiantian.org

然后测试:
把主lb01从挂载状态打开到正常开机状态,那么lb01就自动把虚ip从lb02抢过来了。
抢过来的证据如下所示:
[root@lb01 ~]# ip addr|grep 10.0.0.3
    inet 10.0.0.3/24 scope global secondary eth0:1
[root@lb01 ~]#

[root@lb02 conf]# ip addr|grep 10.0.0.3
[root@lb02 conf]# 
再次用ie打开blog.etiantian.org可以正常打开博客。

本文转自sandshell博客51CTO博客,原文链接http://blog.51cto.com/sandshell/1961261如需转载请自行联系原作者

sandshell
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
4月前
|
数据采集 监控 API
移动端性能监控探索:iOS RUM SDK 技术架构与实践
阿里云 RUM SDK 作为一款性能体验监控采集工具,可以作为辅助 App 运维的强有力助手,提升您的问题排查效率。
344 50
|
4月前
|
存储 运维 分布式计算
零售数据湖的进化之路:滔搏从Lambda架构到阿里云Flink+Paimon统一架构的实战实践
在数字化浪潮席卷全球的今天,传统零售企业面临着前所未有的技术挑战和转型压力。本文整理自 Flink Forward Asia 2025 城市巡回上海站,滔搏技术负责人分享了滔搏从传统 Lambda 架构向阿里云实时计算 Flink 版+Paimon 统一架构转型的完整实战历程。这不仅是一次技术架构的重大升级,更是中国零售企业拥抱实时数据湖仓一体化的典型案例。
310 0
|
5月前
|
数据采集 运维 数据可视化
AR 运维系统与 MES、EMA、IoT 系统的融合架构与实践
AR运维系统融合IoT、EMA、MES数据,构建“感知-分析-决策-执行”闭环。通过AR终端实现设备数据可视化,实时呈现温度、工单等信息,提升运维效率与生产可靠性。(238字)
|
5月前
|
数据采集 存储 运维
MyEMS:技术架构深度剖析与用户实践支持体系
MyEMS 是一款开源能源管理系统,采用分层架构设计,涵盖数据采集、传输、处理与应用全流程,支持多协议设备接入与多样化能源场景。系统具备高扩展性与易用性,结合完善的文档、社区、培训与定制服务,助力不同技术背景用户高效实现能源数字化管理,降低使用门槛与运维成本,广泛适用于工业、商业及公共机构等场景。
230 0
|
4月前
|
存储 SQL 消息中间件
从 ClickHouse 到 StarRocks 存算分离: 携程 UBT 架构升级实践
查询性能实现从秒级到毫秒级的跨越式提升
|
7月前
|
算法 物联网 定位技术
蓝牙室内定位技术解决方案:核心技术架构与优化实践
本文探讨了蓝牙iBeacon与Lora结合的室内定位技术,分析其在复杂室内环境中的优势与挑战。通过三层架构实现高精度定位,并提出硬件、算法与部署优化方向,助力智慧仓储、医疗等场景智能化升级。
406 0
蓝牙室内定位技术解决方案:核心技术架构与优化实践
|
7月前
|
数据采集 人工智能 安全
开源赋能双碳:MyEMS 能源管理系统的架构与实践价值
在全球碳中和趋势与“双碳”目标推动下,能源管理趋向精细化与智能化。MyEMS是一款基于Python开发的开源能源管理系统,具备灵活适配、功能全面的优势,覆盖工厂、建筑、数据中心等多元场景。系统支持能源数据采集、分析、可视化及设备管理、故障诊断、AI优化控制等功能,提供“监测-分析-优化”闭环解决方案。遵循“国家+省级+接入端”三级架构,MyEMS在重点用能单位能耗监测中发挥关键作用,助力实现能源效率提升与政策合规。开源模式降低了技术门槛,推动“双碳”目标落地。
270 0
|
5月前
|
消息中间件 缓存 监控
中间件架构设计与实践:构建高性能分布式系统的核心基石
摘要 本文系统探讨了中间件技术及其在分布式系统中的核心价值。作者首先定义了中间件作为连接系统组件的&quot;神经网络&quot;,强调其在数据传输、系统稳定性和扩展性中的关键作用。随后详细分类了中间件体系,包括通信中间件(如RabbitMQ/Kafka)、数据中间件(如Redis/MyCAT)等类型。文章重点剖析了消息中间件的实现机制,通过Spring Boot代码示例展示了消息生产者的完整实现,涵盖消息ID生成、持久化、批量发送及重试机制等关键技术点。最后,作者指出中间件架构设计对系统性能的决定性影响,
|
5月前
|
前端开发 Java 开发者
MVC 架构模式技术详解与实践
本文档旨在全面解析软件工程中经典且至关重要的 MVC(Model-View-Controller) 架构模式。内容将深入探讨 MVC 的核心思想、三大组件的职责与交互关系、其优势与劣势,并重点分析其在现代 Web 开发中的具体实现,特别是以 Spring MVC 框架为例,详解其请求处理流程、核心组件及基本开发实践。通过本文档,读者将能够深刻理解 MVC 的设计哲学,并掌握基于该模式进行 Web 应用开发的能力。
1040 1
|
6月前
|
存储 自然语言处理 前端开发
百亿级知识库解决方案:从零带你构建高并发RAG架构(附实践代码)
本文详解构建高效RAG系统的关键技术,涵盖基础架构、高级查询转换、智能路由、索引优化、噪声控制与端到端评估,助你打造稳定、精准的检索增强生成系统。
1416 2