1. KVM虚拟化实战:Web应用部署案例详解
在虚拟化环境中部署Web应用是KVM最常见的应用场景之一。这个案例将展示如何从零开始构建一个完整的Web应用系统架构,包含负载均衡、Web服务器、数据库集群和缓存层。
1.1 架构设计与规划
我们的目标架构包含以下组件:
- 2台Nginx+PHP Web服务器
- MySQL主从复制数据库集群
- Redis缓存服务器
- HAProxy负载均衡器
网络规划采用192.168.1.0/24网段,各节点IP分配如下:
- HAProxy: 192.168.1.10
- Web-1: 192.168.1.11
- Web-2: 192.168.1.12
- MySQL-M: 192.168.1.20
- MySQL-S: 192.168.1.21
- Redis: 192.168.1.30
实际生产环境中,建议将数据库和缓存服务器放在独立的网络分区中,通过防火墙规则控制访问权限。
1.2 虚拟机模板准备
使用virt-builder工具创建标准化模板能极大提高部署效率。以下是创建Web服务器模板的示例:
bash复制virt-builder centos-7.6 \
--size 20G \
--output /var/lib/libvirt/images/centos7-web-template.qcow2 \
--install nginx,php,php-fpm,php-mysql,git,vim,wget \
--run-command 'systemctl enable nginx php-fpm' \
--root-password password:123456 \
--ssh-inject root:file:/root/.ssh/id_rsa.pub
关键参数说明:
--size: 磁盘大小,Web服务器建议20GB起步--install: 预装软件包,包括Web服务所需组件--run-command: 首次启动时执行的命令--ssh-inject: 注入SSH公钥实现免密登录
数据库模板需要特别注意:
bash复制virt-builder centos-7.6 \
--size 30G \ # 数据库需要更大磁盘空间
--output /var/lib/libvirt/images/centos7-mysql-template.qcow2 \
--install mariadb-server,mariadb,vim \
--run-command 'systemctl enable mariadb' \
--run-command 'echo "innodb_buffer_pool_size=1G" >> /etc/my.cnf.d/server.cnf'
1.3 批量部署虚拟机
使用virt-install结合cloud-init实现自动化部署:
bash复制declare -A VMS=(
["haproxy-1"]="centos7-haproxy-template 2048 2 192.168.1.10"
["web-1"]="centos7-web-template 4096 4 192.168.1.11"
["web-2"]="centos7-web-template 4096 4 192.168.1.12"
["mysql-m"]="centos7-mysql-template 8192 8 192.168.1.20"
["mysql-s"]="centos7-mysql-template 8192 8 192.168.1.21"
["redis-1"]="centos7-redis-template 4096 4 192.168.1.30"
)
for vm_name in "${!VMS[@]}"; do
config=(${VMS[$vm_name]})
template=${config[0]}
ram=${config[1]}
vcpus=${config[2]}
ip=${config[3]}
# 创建cloud-init配置
cat > /tmp/${vm_name}-user-data.yaml <<EOF
#cloud-config
hostname: $vm_name
manage_etc_hosts: true
users:
- name: admin
sudo: ALL=(ALL) NOPASSWD:ALL
ssh_authorized_keys:
- $(cat /root/.ssh/id_rsa.pub)
runcmd:
- [ sh, -c, "echo '$ip $vm_name' >> /etc/hosts" ]
EOF
# 创建虚拟机
virt-install \
--name $vm_name \
--ram $ram \
--vcpus $vcpus \
--disk path=/var/lib/libvirt/images/${vm_name}.qcow2,size=${template##*-},format=qcow2 \
--disk path=/tmp/${vm_name}-cloudinit.iso,device=cdrom \
--os-variant centos7.0 \
--network bridge=br0,model=virtio \
--import \
--noautoconsole
done
1.4 服务配置与优化
HAProxy配置要点:
bash复制frontend http_front
bind *:80
acl is_static path_beg -i /static /images
use_backend static_back if is_static
default_backend http_back
backend http_back
balance leastconn
cookie SERVERID insert indirect nocache
server web1 192.168.1.11:80 check cookie web1
server web2 192.168.1.12:80 check cookie web2
backend static_back
balance roundrobin
server web1 192.168.1.11:80 check
server web2 192.168.1.12:80 check
MySQL主从复制关键配置:
主库:
ini复制[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=ROW
binlog-do-db=webapp
sync_binlog=1
innodb_flush_log_at_trx_commit=1
从库:
ini复制[mysqld]
server-id=2
relay-log=mysql-relay-bin
read_only=1
skip_slave_start=1
Redis生产环境建议配置:
ini复制bind 192.168.1.30
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised systemd
pidfile /var/run/redis_6379.pid
logle
