温馨提示×

Apache在Ubuntu上如何实现高可用

小樊
45
2025-10-19 05:51:14
栏目: 智能运维

Apache在Ubuntu上实现高可用的核心方案:Keepalived + 负载均衡/高可用集群
高可用(High Availability, HA)旨在通过冗余和故障转移机制,确保Apache服务持续可用。在Ubuntu上,常用Keepalived实现故障转移(虚拟IP漂移),结合Apache负载均衡模块(如mod_proxy_balancer)分散请求,提升整体可用性。以下是具体实现步骤:

一、基础环境准备

  1. 服务器配置:准备至少2台Ubuntu服务器(如ubuntu-masterubuntu-backup),确保网络互通(同一局域网),安装相同版本的Apache(sudo apt update && sudo apt install apache2)。
  2. 主机解析:编辑/etc/hosts文件,添加对方服务器的IP和主机名映射(避免DNS依赖):
    echo "192.168.1.10 ubuntu-master" | sudo tee -a /etc/hosts
    echo "192.168.1.11 ubuntu-backup" | sudo tee -a /etc/hosts
    
  3. 安装必要工具:安装net-tools(查看网络信息)、vim(编辑配置)等工具:
    sudo apt install -y net-tools vim
    

二、配置Apache高可用基础(优化与冗余)

1. 优化Apache配置

调整Apache的多处理模块(MPM)和核心参数,提升性能与稳定性:

  • 禁用prefork(默认模块,不适合高并发),启用event模块(适合异步非阻塞场景):
    sudo a2dismod mpm_prefork
    sudo a2enmod mpm_event
    sudo systemctl restart apache2
    
  • 启用KeepAlive:减少TCP连接建立/关闭的开销(适用于频繁请求的场景)。编辑/etc/apache2/apache2.conf,设置:
    KeepAlive On
    MaxKeepAliveRequests 100  # 单个连接最大请求数
    KeepAliveTimeout 2        # 连接保持时间(秒)
    
  • 调整进程/线程参数:根据服务器资源(CPU、内存)修改mpm_event配置(/etc/apache2/mods-enabled/mpm_event.conf):
    <IfModule mpm_event_module>
        StartServers             2      # 启动时的进程数
        MinSpareThreads          25     # 最小空闲线程数
        MaxSpareThreads          75     # 最大空闲线程数
        ThreadLimit              64     # 线程数上限
        ThreadsPerChild          25     # 每个子进程创建的线程数
        MaxRequestWorkers        150    # 最大并发请求数(根据内存调整,如1GB内存约150MaxConnectionsPerChild   1000   # 单个子进程处理的最大请求数(避免内存泄漏)
    </IfModule>
    
    重启Apache使配置生效:sudo systemctl restart apache2

2. 配置Apache负载均衡(分散请求)

若有多台后端Apache服务器(如backend1:192.168.1.20backend2:192.168.1.21),可通过mod_proxy_balancer将请求分发到后端,提升整体吞吐量:

  • 启用必要模块
    sudo a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests
    sudo systemctl restart apache2
    
  • 配置负载均衡虚拟主机:编辑/etc/apache2/sites-available/loadbalancer.conf,添加以下内容:
    <VirtualHost *:80>
        ServerName yourdomain.com
        <Proxy balancer://mycluster>
            BalancerMember http://192.168.1.20:80 route=1  # 后端服务器1
            BalancerMember http://192.168.1.21:80 route=2  # 后端服务器2
            ProxySet lbmethod=byrequests  # 按请求数均匀分配(可选:bytraffic按流量、bysession按会话)
        </Proxy>
        ProxyPass / balancer://mycluster/
        ProxyPassReverse / balancer://mycluster/
    </VirtualHost>
    
  • 启用配置并重启
    sudo a2ensite loadbalancer.conf
    sudo systemctl restart apache2
    
    测试:访问http://yourdomain.com,通过日志(/var/log/apache2/access.log)确认请求被分发到后端服务器。

三、配置Keepalived实现故障转移(虚拟IP漂移)

Keepalived通过VRRP协议实现虚拟IP(VIP)的自动漂移,当主服务器故障时,备服务器接管VIP,确保服务连续性。

1. 安装Keepalived

在主(ubuntu-master)、备(ubuntu-backup)服务器上均安装:

sudo apt install -y keepalived

2. 配置主服务器(ubuntu-master)

编辑/etc/keepalived/keepalived.conf,设置主节点参数:

global_defs {
    router_id LVS_MASTER  # 唯一标识(主备需不同,如MASTER/BACKUP)
}

vrrp_script chk_apache {
    script "/etc/keepalived/check_apache.sh"  # 健康检查脚本(检测Apache是否运行)
    interval 2                                # 检查间隔(秒)
    weight 2                                  # 检查失败时权重降低2
}

vrrp_instance VI_1 {
    state MASTER                                # 主节点状态
    interface ens160                            # 网卡名(通过`ip a`查看,如ens33)
    virtual_router_id 51                        # 虚拟路由ID(主备需相同,1-255)
    priority 101                                # 优先级(主备需不同,主>备,如101/100)
    advert_int 1                                # 心跳间隔(秒)
    authentication {
        auth_type PASS
        auth_pass 12345                         # 密码(主备需相同)
    }
    virtual_ipaddress {
        192.168.1.100/24                        # 虚拟IP(VIP,客户端访问的地址)
    }
    track_script {
        chk_apache                              # 关联健康检查脚本
    }
}

3. 配置备服务器(ubuntu-backup)

修改/etc/keepalived/keepalived.conf,设置备节点参数(与主节点差异部分):

global_defs {
    router_id LVS_BACKUP  # 唯一标识
}

vrrp_instance VI_1 {
    state BACKUP          # 备节点状态
    interface ens160      # 网卡名(与主节点一致)
    virtual_router_id 51  # 虚拟路由ID(与主节点一致)
    priority 100          # 优先级(低于主节点)
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345   # 密码(与主节点一致)
    }
    virtual_ipaddress {
        192.168.1.100/24  # 虚拟IP(与主节点一致)
    }
    track_script {
        chk_apache        # 关联相同的健康检查脚本
    }
}

4. 创建健康检查脚本

编写脚本检测Apache是否运行,若未运行则重启Apache(避免因进程崩溃导致VIP漂移)。在主、备服务器上均创建/etc/keepalived/check_apache.sh

#!/bin/bash
if ps ax | grep -v grep | grep apache2 > /dev/null; then
    exit 0  # Apache运行正常
else
    systemctl restart apache2  # 重启Apache
    if [ $? -eq 0 ]; then
        exit 0
    else
        exit 1  # 重启失败,触发VIP漂移
    fi
fi

赋予执行权限:

sudo chmod +x /etc/keepalived/check_apache.sh

5. 启动Keepalived

在主、备服务器上启动服务并设置开机自启:

sudo systemctl enable keepalived
sudo systemctl start keepalived

6. 验证故障转移

  • 查看VIP绑定:在主服务器上执行ip a,应看到192.168.1.100绑定在网卡上;备服务器无此IP。
  • 模拟主服务器故障:停止主服务器的Apache服务(sudo systemctl stop apache2),观察Keepalived日志(journalctl -u keepalived -f),确认VIP漂移到备服务器。
  • 恢复主服务器:重启Apache(sudo systemctl start apache2),VIP应自动漂移回主服务器。

四、注意事项

  • 网络要求:主备服务器需在同一局域网,确保VRRP协议通信不受阻碍(关闭防火墙或放行VRRP协议,默认端口112)。
  • 资源分配:根据服务器硬件调整Apache的MaxRequestWorkers(并发请求数),避免资源耗尽。
  • 监控与告警:使用ZabbixNagios等工具监控Apache状态(如CPU、内存、请求数),设置告警规则(如VIP漂移时发送邮件/短信)。
  • SSL配置:若需HTTPS,需在Apache中配置SSL证书(certbot申请Let’s Encrypt免费证书),并同步到备服务器。

0