4.3 实施部署Nginx 高可用负载均衡集群

news2024/10/7 20:30:15

部署大致可分为:准备工作、配置、验证与交付几个步骤,接下来按顺序逐一介绍。

4.3.1 准备工作

Nginx高可以负载均衡集群准备工作分两个层面:前端负载均衡器的准备工作与后端真实服务器的准备工作。根据长期实践出来的经验,先准备后端真实服务器(Realserver),再准备前端负载均衡器比较有效。

1)后端服务器的准备工作

在后端的所有真实服务器(Realserver)上部署服务好应用,确保每个服务都能直接被访问。如果后端都不能直接访问,即便配好前端负载均衡,服务也是不可用的,这也是为什么要先准备好后端真实服务器(Realserver)的原因。

后端服务是Web,就要求能有浏览器访问到每一个后端的页面;后端是MySQL数据库,就要求远程用MySQL客户端能成功连接每一个后端的MySQL。

2)负载均衡器的准备工作

两台负载均衡器安装好软件Nginx和Keepalived,操作在前边的章节已有涉及,也比较简单,这里就不在赘述。

4.3.2 负载均衡器配置

存在两个项目,一个是Web服务集群,另一个是Python集群。将这两个集群置于同一个负载均衡器之下,有效利用资源。

为了便于开展工作,先把资源分配列举出来,如表4-3所示。

表4- 3

名称

说明

Web服务VIP地址及TCP端口

172.16.35.188:80

自定义Python服务地址及TCP端口

172.16.35.189:10033

负载均衡器物理地址

172.16.35.111,172.16.35.112

Web服务后端真实服务器地址

172.16.35.107-109

自定义Python后端真实服务器地址

172.16.35.113-115

操作系统

全部为Rocky 9

主要软件版本

Nginx-1.20.2 ,Keepalived-2.2.7

软件安装路径

/usr/local/nginx, /usr/local/keepalive

日志路径

/data/logs/keepalived.log,/data/logs/nginx.log

1)Nginx 负载均衡配置

用文本编辑器,撰写Nginx主配置文件”nginx.conf”,其完整内容如下:

user nginx;

worker_processes auto;

error_log /data/logs/nginx/error.log;

pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.

include /usr/share/nginx/modules/*.conf;

include /etc/nginx/conf.d/tcp10033.conf;

events {

    worker_connections 1024;

}

http {

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /data/logs/nginx/access.log  main;

    sendfile            on;

    tcp_nopush          on;

    tcp_nodelay         on;

    keepalive_timeout   65;

    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;

    default_type        application/octet-stream;

    include /etc/nginx/conf.d/web.conf;

server {

        listen 80;

        server_name localhost;

        location / {

                proxy_pass http://web;

        }

        location /status {

           healthcheck_status html;

        }

        error_page 404 /404.html;

        location = /404.html {

        }

        error_page 500 502 503 504 /50x.html;

        location = /50x.html {

        }

    }

   

}

主配置文件以“include”指令包含两个自定义的子配置文件”web.conf”和“tcp10033.conf”,这两条的的位置特别有讲究。第一条自定义的“include  /etc/nginx/conf.d/tcp10033.conf”指令,必须要放在文本块 http{}之外;而另一行“include /etc/nginx/conf.d/web.conf”将其放在此处的用意是,单独把与Web服务相关的配置规整在一起,方便维护。指令错放位置,将会报错或者得不到期待的结果。

主配置文件”nginx.conf”中手动添加了文本块“location /status { healthcheck_status html;}”这个文本块的作用是可以通过Nginx第三方模块“healthckeck”收集负载均衡器健康检查实时反馈过来的后端真实服务器(Realserver)服务运行的状态,比登录系统查看日志更直观一些。与“第2章之2.2小节”所呈现方式差不多,但调用模块存在差异,因为”healthcheck_status”既收集Web服务的状态,也收集自定义的TCP服务状态。

Nginx子配置文件”tcp10033.conf”的完整内容如下:

stream {

    upstream tcp10033 {

        server 172.16.35.113:10033;

        server 172.16.35.114:10033;

        server 172.16.35.115:10033;

        check interval=3000 rise=2 fall=5 timeout=1000 type=tcp;

    }

    log_format basic '$remote_addr [$time_local] '

                 '$protocol $status $bytes_sent $bytes_received '

                 '$session_time';

    server {

    listen 10033;

        proxy_pass tcp10033;

        access_log /data/logs/tcp10033-access.log basic buffer=32k;

    }

}

此配置文件有一个需要注意的地方,那就是需要把日志文件的路径“access_log /data/logs/tcp10033-access.log”定义到文本块“server{}”内部,虽然在外部也不会报错,但它不会真正起作用(不记录访问日志)。

另一个用于Web负载均衡、健康检查功能的子配置文件”web.conf”完整内容如下:

upstream web {

        server 172.17.35.107  max_fails=1 fail_timeout=10;

server 172.17.35.108  max_fails=1 fail_timeout=10;

        server 172.17.35.109  max_fails=1 fail_timeout=10;

        check interval=3000 rise=2 fall=3 timeout=1000 type=tcp;

}

        access_log  /data/logs/access.log  main;

以纯文本方式撰写好Nginx所需的主配置、子配置文件后,人工检查一遍书写内容,接着在系统命令行执行”nginx -t”进行语法检查,无误后再继续执行指令“nginx”真正启动Nginx服务。通过远端的Web浏览器,输入刚配置完的负载均衡器所设定的url,正常情况下,可观察到整个集群的运行状况,如图4-3 所示。

 

图4- 3

2)撰写监控Nginx进程的Shell脚本

在已经配置好Nginx的负载均衡器宿主系统命令行下,用文本编辑器撰写Shell脚本,基本思路是检查系统进程是否存在“nginx”,如果不存在则启动“nginx”服务。

一个完整的、用于与Keepalived相整合的Shell脚本“/usr/local/bin/check_nginx.sh”内容如下:

#!/bin/bash

STATUS=`ps -C nginx --no-header |wc -l`

if [ "$STATUS" -eq "0" ]; then

  /usr/local/nginx/sbin/nginx

#systemctl start nginx

    STATUS2=`ps -C nginx --no-header|wc -l`

        if [ "$STATUS2" -eq "0"  ]; then

        kill -9 $(ps -ef | grep keepalived | grep -v grep | awk '{print $2}')

        fi

fi

系统命令行下,使Nginx服务处于未运行状态,再手动执行脚本“/usr/local/bin/check_nginx”,命令为“sh /usr/local/bin/check_nginx.sh”。执行过程没有错误输出,初步可以断定脚本是正确的,再加上用浏览器方式验证已经配置好的测试页面,万无一失。

3)配置Keepalived

Keepalived配置文件”keepalived.conf”本身不存在,直接用文本编辑器撰写一个,放置于目录“/etc/keepalived”,一个用于与配置好Nginx服务相关联的“keepalived.conf”配置文件的完整内容如下:

global_defs {

   router_id 202

}

vrrp_script chk_nginx {

    script "/usr/local/bin/check_nginx.sh"

    interval 2

    weight 2

   }

################################################################

#      vvrp_instance  define                                      #

################################################################

vrrp_instance VI_SERY{

    state  MASTER

    interface ens18

    virtual_router_id 120

    priority 100

    garp_master_delay 1

    authentication {

        auth_type PASS

        auth_pass KJj23576hYgu23I

    }

    track_interface {

        ens18

    }

    track_script {

        chk_nginx

    }

    virtual_ipaddress {

    172.16.35.188

    }

}

配置文件“keepalived.conf”文本块的位置有一个需要注意的地方,那就是“vrrp_script chk_nginx{}”要在前边,“track_script{}”要在靠近文本的末尾,如果位置不恰当,Keepalived服务即便能运行,也不能达到预定的目标。

配置好Keepalived及Nginx以后,确保系统没有Nginx进程和Keepalived进程存在。在命令行执行指令“/usr/local/keepalived/sbin/keepalved”,执行如无报错输出,用以下指令进行初步验证。

#查看系统进程

ps auxww| grep -e nginx -e keepalived

#查看nginx监听端口

netstat -anp| grep -e 80 -e 1003

上述两条指令输入的结果,如图4-4所示。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/482791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

更轻更好用的蓝牙耳机,日常佩戴更舒适,QCY Crossky Link体验

平时为了方便接打电话,我经常会戴上一副蓝牙耳机,不过戴久了入耳式的耳机,总感觉不舒服,上个月我看到一款设计很新颖的开放式耳机,来自我之前用过的一个国产品牌,最近到手后试了试,感觉质量不错…

Pandoc 从入门到精通,你也可以学会这一个文本转换利器

Pandoc 简介 如果你需要在不同的文件格式之间相互转换,多半听说或使用过文档转换的瑞士军刀——Pandoc。事实上,不仅人类知道 Pandoc,最近很火的人工智能 ChatGPT 也知道「将 Markdown 转换为 docx」,首选方案是使用 Pandoc。 ​…

Codeforces Round 868 (Div. 2)

Problem - D - Codeforces 思路&#xff1a; 首先&#xff0c;一个位置至多贡献1&#xff0c;不然就是0.如[l1,r]与[l2,r]都是回文串&#xff08;l1<l2) 若(l1r)/2<l2,即[l2,r]本身就是[l1,r]回文串右边的一部分&#xff0c;那么他的贡献在[l1,r]左边已经计算过。如果(…

Python程序的执行过程

哈喽&#xff0c;大家好&#xff0c;五一快乐呀&#xff0c;都去哪里旅游了呢&#xff1f;再游玩之余也花点时间来学习学习&#xff0c;让自己更强哟。这期就给大家分享的是Python程序执行的过程学习。 之前已经给大家介绍了Python语言的简介、Python环境的安装、IDE的选择与安…

4 斐波那契数列

4 斐波那契数列 作者: Turbo时间限制: 1S章节: 递归 问题描述 : 斐波那契数列的排列是&#xff1a;0&#xff0c;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34&#xff0c;55&#xff0c;89&#xff0c;…

CTF-PHP反序列化漏洞2-利用魔法函数

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。我的…

.net 智慧手术麻醉管理系统 WCF框架

实用性&#xff1a; 充分考虑科室业务场景实用性&#xff0c;把满足临床需要为第一要素进行考虑。具有操作简单、提示清晰、逻辑性强&#xff0c;直观简洁等特点。 灵活可自定义&#xff1a; 软件设计采用模块式、组件式开发&#xff0c;根据临床需要可根据实际业务进行组合…

【MATLAB第26期】区间预测 | 基于MATLAB的LASSO分位数回归预测模型 负荷预测数据

【MATLAB第26期】区间预测 | 基于MATLAB的LASSO分位数回归预测模型 负荷预测数据 一、效果预览 MSE: 22.9684327801807 %15分钟 21.6725387054707%30分钟 24.0995456594418%45分钟 21.3992361173462%60分钟 二、数据选择 案例数据&#xff1a;两个月负荷数据3599*30&#x…

网络编程 总结三

一、并发服务器模型 【1】 循环服务器 1>一次只能处理一个客户端的请求&#xff0c;等待这个客户端退出后&#xff0c;才能处理下一个客户端 2>缺点&#xff1a;循环服务器所处理的客户端不能有耗时操作 //*****模型****** sfd socket(); bind(); listen(); while(1)…

springboot websocket通信

目录 一、websocket是什么 二、实现websocket 2.1参考学习b站资料&#xff08;一定要看&#xff0c;前后端详细&#xff09; 2.2学习配套代码 一、websocket是什么 WebSocket_ohana&#xff01;的博客-CSDN博客 二、实现websocket 2.1参考学习b站资料&#xff08;一定要看…

4 异常机制--数组、切片、算法【Go语言教程】

4 异常机制–数组、切片、算法【Go语言教程】 1 异常机制 1.1 处理错误 Go 语言追求简洁优雅&#xff0c;所以&#xff0c;Go 语言不支持传统的 try…catch…finally 这种处理。Go 中引入的处理方式为&#xff1a;defer, panic, recover这几个异常的使用场景可以这么简单描述…

【小沐学Python】Python实现Web服务器(Flask框架扩展:Flask-Admin)

文章目录 1、简介1.1 flask1.2 flask-admin 2、安装2.1 安装库2.2 打印库版本 3、初始化4、添加独立视图&#xff08;BaseView&#xff09;4.1 管理接口索引页4.2 自定义视图 5、添加模型视图&#xff08;ModelView&#xff09;6、添加特殊视图6.1 Managing Files & Folder…

VS2019配置redis客户端的c++开发环境

目录 需要的开源库&#xff1a; 具体步骤&#xff1a; 遇到的问题&#xff1a; 1. 确保每个项目使用的配置解决方案管理器一样 2.CMAKE 的安装 3. 使用 CMAKE 的路径配置 4. redis 编译报错&#xff1a;jemalloc/jemalloc.h没有这个文件&#xff0c;或者找不到.dll 5. linux …

【Linux】初识Linux --指令Ⅰ

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法&#xff0c;Linux…感兴趣就关注我吧&#xff01;你定不会失望。 目录 1.ls 显示当前目录下的文件内内容2.pwd-显示用户当前所在的目录3.cd-改变工作目录。将当前工作目录改变到指定的目…

C++ STL-deque

deque&#xff1a;双端队列 目录 deque&#xff1a;双端队列 1、 基本介绍 2、使用方法 2.1、 头文件 2.2、 定义 2.3、 方法函数 3、排序 1、 基本介绍 首尾都可插入和删除的队列为双端队列。 deque容器是连续的空间&#xff0c;其他连续的行空间还有 array 和 vect…

E. Multihedgehog(多叉树找root节点)

Problem - E - Codeforces 有人给Ivan一个奇怪的生日礼物&#xff0c;这是一只刺猬 - 一个连通的无向图&#xff0c;其中一个顶点的度至少为3&#xff08;我们称其为中心&#xff09;&#xff0c;而所有其他顶点的度数均为1。Ivan认为刺猬太无聊了&#xff0c;决定自己制造k-多…

总结838

四月结束&#xff0c;五月来临。又到了月度总结与规划的时候了。 四月总结&#xff1a;高等数学原计划复习完18讲内容&#xff0c;刷完对应的习题。如今还剩三讲&#xff0c;本可以看完&#xff0c;但因为后面分专题了&#xff0c;还没确定是数1还是数2.所以耽搁了一下。英语原…

SG函数(博弈论)

一&#xff0c;定义 对于满足以下条件的公平二人游戏&#xff0c;均可以用sg函数&#xff08;暴搜&#xff09;获得答案 人数2人 两人交替进行合法操作&#xff0c;无法进行者LOSE对 于游戏的任意一种可能的局面&#xff0c;合法的操作集合只取决于这个局面的本身&#xff0c;…

掌握 Python 接口自动化测试理论,深度解读测试框架源码

目录&#xff1a;导读 引言 一、什么是接口测试、为什么要做接口测试 1、什么是接口测试 2、为什么要做接口测试 二、接口测试的流程 1、接口测试的流程 2、为什么要写测试用例 3、接口测试设计要点 三、python接口自动化-requests的应用 1、requests简介 2、reques…

Winform从入门到精通(37)——FolderBrowserDialog(史上最全)

文章目录 前言1、Name2、Description3、RootFolder4、SelectedPath5、ShowNewFolderButton前言 当需要获取一个可以通过用户自由选择路径的时候,这时候就需要FolderBrowserDialog控件 1、Name 获取FolderBrowserDialog对象 2、Description 用于指示对话框的描述,如下: …