您现在的位置是:首页 >技术交流 >4.3 实施部署Nginx 高可用负载均衡集群网站首页技术交流

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

4/5$全真龙门 2023-07-08 20:00:03
简介4.3 实施部署Nginx 高可用负载均衡集群

作者:田逸(formyz)

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

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所示。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。