部署大致可分为:准备工作、配置、验证与交付几个步骤,接下来按顺序逐一介绍。
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所示。