- A+
所属分类:Nginx
Keepalived是一个用于实现网络服务高可用性的开源软件,通过虚拟路由冗余协议(VRRP)确保当主服务器故障时,备用服务器能够自动接管服务,维持应用的连续运行。用于实现Linux系统下的服务高可用性和负载均衡。它通过在多个节点之间共享虚拟IP地址,确保当主节点故障时,备用节点能够自动接管服务,从而实现无缝的故障转移。Keepalived支持健康检查和故障恢复,可以与LVS配合使用,提供简单的配置和管理,常用于数据库、Web服务器等关键服务。
LVS(Linux Virtual Server)是一个基于Linux内核的高性能、高可用的负载均衡解决方案。
主要特点:
负载均衡:LVS作为负载均衡器,位于客户端和后端服务器之间,分发进入的网络服务请求;
调度算法:支持多种调度算法,如轮询、最少连接、源地址哈希等,以适应不同的业务需求;
网络层级:工作在OSI模型的第三层和第四层,基于IP地址和端口号进行请求分发;
高性能:通过在内核层进行请求分发,减少处理开销,提供高吞吐量和低延迟;
高可用性:结合Keepalived等工具,可以实现负载均衡器的高可用性;
可扩展性:能够处理大量并发连接,适合大型网络环境和需要大规模扩展的服务。
主机 | 应用软件 |
Tomcat01 | Tomcat01+jdk |
Tomcat02 | Tomcat02+jdk |
Nginx01 | Nginx |
Nginx02 | Nginx |
LVS01 | ipvsadm + keepalived |
LVS02 | ipvsadm + keepalived |
Tomcat01和Tomcat02二进制安装部署JDK环境
两台Tomcat服务器安装JDK
wget https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz //下载JDK
tar xvf jdk-8u202-linux-x64.tar.gz -C /usr/local/ //解压到/usr/local/下
ln -s /usr/local/jdk1.8.0_202/ /usr/local/jdk //创建软连接
vim /etc/profile.d/jdk.sh //配置环境变量
# Java JDK
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=/usr/local/jdk/jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar //保存退出
source /etc/profile //加载环境变量
java -version
两台Tomcat服务器安装Tomcat
wget https://mirrors.huaweicloud.com/apache/tomcat/tomcat-9/v9.0.48/bin/apache-tomcat-9.0.48.tar.gz //下载Tomcat
tar xf apache-tomcat-9.0.48.tar.gz -C /usr/local/
ln -s /usr/local/apache-tomcat-9.0.48/ /usr/local//tomcat
useradd -s /sbin/nologin tomcat
rm -fr /usr/local/tomcat/webapps/* //删除多余工程项目
mkdir -pv /usr/local/tomcat/webapps/war/ //创建自己的工程目录
vim /usr/local/tomcat/webapps/war/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>java web page</title>
</head>
<body>
<% out.println("Tomcat01");%> //第二台改为Tomcat02用来验证
</body>
</html> //保存退出
vim /usr/local/tomcat/conf/server.xml //关闭shutdown端口
<Server port="-1" shutdown="SHUTDOWN"> //修改8005为-1,保存退出
chown -R tomcat:tomcat /usr/local/tomcat/* //修改所有者和组
配置Tomcat开机自启文件
vim /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/local/jdk"
WorkingDirectory=/usr/local/tomcat
ExecStartPre=/usr/local/tomcat/bin/configtest.sh
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target //保存退出
systemctl daemon-reload
systemctl enable --now tomcat.service


Nginx01和Nginx02配置网络
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
BOOTPROTO=static
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.22.222
PREFIX=32 //保存退出
ifup lo:0
优化Linux系统的网络设置,防止系统对不属于自己的IP地址的ARP请求做出响应,控制系统在发送ARP请求时如何选择源IP地址。
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2 //保存退出
sysctl -p
Nginx01和Nginx02源码安装Nginx网站服务
curl -O https://nginx.org/download/nginx-1.26.2.tar.gz //下载Nginx安装包
yum -y install pcre-devel openssl-devel //安装依赖
useradd -s /sbin/nologin -M nginx //创建Nginx用户
tar xvf nginx-1.26.2.tar.gz
cd nginx-1.26.2/
./configure --prefix=/usr/local/nginx-1.26.2 --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-stream
make && make install
ln -s /usr/local/nginx-1.26.2/ /usr/local/nginx
chown -R nginx:nginx /usr/local/nginx*
配置nginx配置文件
cp -a /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf-bak //备份nginx配置文件
vim /usr/local/nginx/conf/nginx.conf //修改nginx配置文件
# 运行Nginx的用户和用户组
user nginx nginx;
# 设置工作进程的数量,auto 表示根据 CPU 核心数自动调整
worker_processes auto;
# 设置 Nginx 的错误日志文件路径
error_log /data/logs/nginx/error.log;
# 设置 Nginx 主进程的 PID 文件路径
pid /run/nginx.pid;
# 事件区块,用于配置工作进程连接的特性
events {
# 每个工作进程可以同时打开的最大连接数
worker_connections 1024;
}
# HTTP 服务器区块
http {
# 包含 MIME 类型定义文件
include mime.types;
# 默认 MIME 类型
default_type application/octet-stream;
# 定义日志格式
log_format www '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 www;
# 启用 sendfile 传输文件
sendfile on;
#tcp_nopush on; # 启用 TCP_NOPUSH 功能,需要 sendfile 开启
# 保持连接的超时时间
keepalive_timeout 65;
# 负载均衡配置,定义 Tomcat 服务器集群
upstream tomcatservers {
server 192.168.18.14:8080 max_fails=3 fail_timeout=30s; # Tomcat 服务器 1
server 192.168.18.15:8080 max_fails=3 fail_timeout=30s; # Tomcat 服务器 2
# 可以继续添加更多服务器
}
# 服务器区块,定义虚拟主机的配置
server {
# 监听 80 端口
listen 80;
# 服务器名称
server_name www.war.com;
# 前端静态资源 location 块
location / {
# 指定前端静态资源的根目录
root /data/www/nginx; # 替换为前端静态资源的实际路径
# 尝试匹配 index.html 或 index.htm
index index.html index.htm;
}
# war 请求 location 块,假设 API 请求以 /api 开头
location /war/ {
# 将请求代理到定义的 Tomcat 服务器集群
proxy_pass http://tomcatservers;
# 设置代理请求头,传递原始请求信息
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 设置代理请求的根路径,如果后端服务需要
# proxy_set_header X-Forwarded-Root /api;
}
# 自定义错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
# 指定错误页面的根目录
root /usr/share/nginx/html;
}
}
# 其他服务器配置可以在此添加
# include /usr/local/nginx/conf.d/*.conf;
}
mkdir -pv /data/logs/nginx //创建日志目录
mkdir -pv /data/www/nginx //创建前端网页根目录
echo Nginx01 > /data/www/nginx/index.html //Nginx01执行
echo Nginx02 > /data/www/nginx/index.html //Nginx02执行
配置Nginx开机自启文件
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
#PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
#KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target //保存退出
systemctl daemon-reload
systemctl enable --now nginx.conf
LVS01和LVS02源码安装Keepalived+LVS高可用服务
配置路由转发
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 //保存退出
sysctl -p
yum安装LVS和源码包安装Keepalived
yum -y install ipvsadm openssl-devel libnl-devel //安装LVS和keepalived依赖
wget http://www.keepalived.org/software/keepalived-2.2.8.tar.gz
tar xvf keepalived-2.2.8.tar.gz
cd keepalived-2.2.8/
./configure --prefix=/usr/local/keepalived-2.2.8
make && make install
ln -s /usr/local/keepalived-2.0.8/ /usr/local/keepalived
修改Keepalived配置
vim /usr/local/keepalived/etc/keepalived/keepalived.conf
global_defs { #全局设置
router_id LVS01 # 本节点标识,(第二台改为LVS02)
}
vrrp_instance LVS {
state MASTER # 指定该节点为MASTER主节点,(第二台改为BACKUP)
interface ens33 # 指定VRRP实例绑定的网络接口
virtual_router_id 50 # 虚拟路由器ID,同一虚拟路由器组的ID必须相同
priority 100 # 优先级,数值越大优先级越高,(第二台优先级改小,优先级大的为主)
advert_int 1 # 通告间隔,单位秒
authentication {
auth_type PASS # 认证类型为密码认证
auth_pass war.com # 认证密码
}
virtual_ipaddress {
192.168.22.222 # 虚拟IP地址,客户端将使用此IP访问服务
}
}
virtual_server 192.168.22.222 80 { # 虚拟服务器配置,指定虚拟IP和端口
delay_loop 3 # 健康检查的时间间隔,单位秒
lb_algo rr # 负载均衡算法,这里使用轮询(Round Robin)
lb_kind DR # 负载均衡类型,这里使用直接路由(Direct Routing)
# persistence_timeout 50 # 持久连接超时时间,单位秒
protocol TCP # 使用的协议类型
real_server 192.168.22.12 80 { # 后端真实服务器1的配置
weight 1 # 权重
TCP_CHECK { # TCP检查配置
connect_timeout 10 # 连接超时时间,单位秒
retry 3 # 重试次数
delay_before_retry 3 # 重试间隔时间,单位秒
connect_port 80 # 检查的端口
}
}
real_server 192.168.22.13 80 { # 后端真实服务器2的配置
weight 1 # 权重
TCP_CHECK { # TCP检查配置
connect_timeout 10 # 连接超时时间,单位秒
retry 3 # 重试次数
delay_before_retry 3 # 重试间隔时间,单位秒
connect_port 80 # 检查的端口
}
}
} //保存退出
开启Keepalived
systemctl daemon-reload
systemctl enable --now keepalived.service
ipvsadm -ln

在LVS02上验证
curl http://192.168.22.222
curl http://192.168.22.222/war/


2025年3月21日 21:04 沙发
1