LNMP 高可用平台部署
项目背景
- 实训项目名称:LNMP 高可用平台部署
- 时间:2024年10月 - 2024年11月
- 项目目标:基于 LNMP(Linux、Nginx、MySQL、PHP)架构搭建高可用 Web 服务平台,整合负载均衡、数据库主从复制及全链路监控,确保系统高可用性与稳定性。
- 核心指标:
- Nginx + KeepAlived 实现双机热备,VIP 漂移时间 < 3 秒。
- MySQL 主从复制(半同步模式),数据可靠性 RPO < 1 秒。
- Zabbix 监控系统实时采集性能指标。
- Shell 脚本实现一键部署与日志轮转等自动化运维。
- 操作系统:Debian 12
技术栈
- 操作系统:Debian 12
- Web 服务器:Nginx
- 数据库:MySQL(半同步主从复制)
- 后端语言:PHP
- 高可用组件:KeepAlived
- 监控工具:Zabbix
- 自动化脚本:Shell
项目架构
- Nginx + KeepAlived:Nginx 实现负载均衡,KeepAlived 提供双机热备与 VIP(虚拟 IP)漂移。
- MySQL 主从复制:配置半同步复制,确保主从数据一致性。
- Zabbix 监控:监控服务器、数据库及应用性能指标,设置告警规则。
- Shell 自动化:实现一键部署、日志轮转及服务状态检查。
部署步骤
1. 环境准备
1.1 服务器准备
- 准备至少两台 Debian 12 服务器(主节点与备节点),推荐配置:
- CPU:2 核
- 内存:4 GB
- 磁盘:50 GB SSD
- 网络要求:内网互联,固定 IP 地址,开放必要端口(80、443、3306、10050 等)。
- 示例 IP 配置:
- 主节点:192.168.1.101
- 备节点:192.168.1.102
- 虚拟 IP(VIP):192.168.1.100
1.2 安装基础依赖
在所有服务器上执行:
apt update -y
apt install -y vim wget net-tools build-essential
2. 安装 LNMP 环境
2.1 安装 Nginx
- 安装 Nginx:
apt install -y nginx systemctl enable nginx systemctl start nginx
- 配置 Nginx 负载均衡(主节点,/etc/nginx/sites-available/loadbalance):
upstream backend { server 192.168.1.101:80; # 后端服务器1 server 192.168.1.102:80; # 后端服务器2 } server { listen 80; server_name your_domain.com; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
- 启用配置并重启 Nginx:
ln -s /etc/nginx/sites-available/loadbalance /etc/nginx/sites-enabled/ nginx -t systemctl restart nginx
2.2 安装 MySQL
- 安装 MySQL:
apt install -y mysql-server systemctl enable mysql systemctl start mysql
- 配置 MySQL 主从复制:
- 主节点(/etc/mysql/mysql.conf.d/mysqld.cnf):
[mysqld] server-id=1 log-bin=mysql-bin binlog_format=ROW gtid_mode=ON enforce_gtid_consistency=ON
- 从节点(/etc/mysql/mysql.conf.d/mysqld.cnf):
[mysqld] server-id=2 read_only=ON relay-log=relay-bin
- 重启 MySQL:
systemctl restart mysql
- 主节点创建复制用户:
mysql -uroot -p GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;
- 从节点配置主从同步:
CHANGE MASTER TO MASTER_HOST='192.168.1.101', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_AUTO_POSITION=1; START SLAVE;
- 验证主从状态:
SHOW SLAVE STATUS\G
- 主节点(/etc/mysql/mysql.conf.d/mysqld.cnf):
- 启用半同步复制:
- 安装半同步插件(主从节点均需执行):
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
- 主节点配置:
SET GLOBAL rpl_semi_sync_master_enabled = 1; SET GLOBAL rpl_semi_sync_master_timeout = 1000; # 1秒超时
- 从节点配置:
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
- 重启从节点 slave:
STOP SLAVE; START SLAVE;
- 安装半同步插件(主从节点均需执行):
2.3 安装 PHP
- 安装 PHP 及必要扩展:
apt install -y php php-fpm php-mysql systemctl enable php8.1-fpm systemctl start php8.1-fpm
- 配置 Nginx 支持 PHP(/etc/nginx/sites-available/php):
server { listen 80; server_name your_domain.com; root /var/www/html; index index.php index.html; location ~ \.php$ { fastcgi_pass unix:/run/php/php8.1-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
- 启用配置并重启 Nginx:
ln -s /etc/nginx/sites-available/php /etc/nginx/sites-enabled/ nginx -t systemctl restart nginx
- 测试 PHP(/var/www/html/info.php):
<?php phpinfo(); ?>
3. 配置高可用(KeepAlived)
- 安装 KeepAlived:
apt install -y keepalived systemctl enable keepalived
- 配置主节点(/etc/keepalived/keepalived.conf):
vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.1.100 } }
- 配置备节点(priority 改为 50,其余相同)。
- 启动 KeepAlived:
systemctl start keepalived
- 验证 VIP 漂移:
ip addr show
4. 部署 Zabbix 监控
- 安装 Zabbix 服务器(主节点):
wget https://repo.zabbix.com/zabbix/6.0/debian/pool/main/z/zabbix-release/zabbix-release_6.0-4+debian12_all.deb dpkg -i zabbix-release_6.0-4+debian12_all.deb apt update apt install -y zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-agent systemctl enable zabbix-server zabbix-agent apache2 systemctl start zabbix-server zabbix-agent apache2
- 配置 Zabbix 数据库:
mysql -uroot -p CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost' IDENTIFIED BY 'zabbix_password';
- 导入初始数据:
zcat /usr/share/zabbix-server-mysql/schema.sql.gz | mysql -uzabbix -p zabbix zcat /usr/share/zabbix-server-mysql/images.sql.gz | mysql -uzabbix -p zabbix zcat /usr/share/zabbix-server-mysql/data.sql.gz | mysql -uzabbix -p zabbix
- 配置 Zabbix 服务器(/etc/zabbix/zabbix_server.conf):
DBHost=localhost DBName=zabbix DBUser=zabbix DBPassword=zabbix_password
- 访问 Zabbix Web 界面(http://your_server_ip/zabbix),完成初始化配置,默认用户:Admin,密码:zabbix。
- 配置监控项:
- 添加主机(服务器、MySQL、Nginx、PHP-FPM)。
- 配置触发器(如 CPU 使用率 > 80% 告警)。
5. Shell 自动化脚本
5.1 一键部署脚本
创建脚本(/usr/local/bin/deploy_lnmp.sh):
#!/bin/bash
echo "Starting LNMP deployment..."
apt update -y
apt install -y nginx php php-fpm php-mysql mysql-server keepalived
systemctl enable nginx php8.1-fpm mysql keepalived
systemctl start nginx php8.1-fpm mysql keepalived
echo "LNMP deployment completed!"
授权并执行:
chmod +x /usr/local/bin/deploy_lnmp.sh
./usr/local/bin/deploy_lnmp.sh
5.2 日志轮转脚本
创建脚本(/usr/local/bin/logrotate.sh):
#!/bin/bash
LOG_DIR="/var/log/nginx"
ARCHIVE_DIR="/var/log/nginx/archive"
MAX_SIZE=100M
mkdir -p $ARCHIVE_DIR
find $LOG_DIR -type f -name "*.log" -size +$MAX_SIZE -exec mv {} $ARCHIVE_DIR/$(date +%F)_{} \;
systemctl reload nginx
配置定时任务(crontab -e):
0 0 * * * /usr/local/bin/logrotate.sh
6. 测试与验证
- 高可用性测试:
- 停止主节点 Nginx,验证 VIP 是否漂移至备节点(ip addr show)。
- 时间应 < 3 秒。
- MySQL 主从复制:
- 在主节点插入数据,检查从节点是否同步(RPO < 1 秒)。
- Zabbix 监控:
- 检查仪表盘是否显示服务器、MySQL、Nginx 性能指标。
- 模拟高负载,验证告警触发。
- Shell 脚本:
- 执行一键部署脚本,验证服务状态。
- 检查日志轮转,确认旧日志归档。
注意事项(若有防火墙)
- 确保防火墙(如 ufw)开放必要端口:
ufw allow 80 ufw allow 443 ufw allow 3306 ufw allow 10050
- 定期备份 MySQL 数据和 Nginx 配置。
- 监控 Zabbix 告警,及时处理异常。
- 根据实际需求调整 Nginx 和 PHP 配置(如 worker_processes、max_connections)。
总结
实现了双机热备(VIP 漂移 < 3 秒)、MySQL 半同步复制(RPO < 1 秒)、Zabbix 全链路监控及 Shell 自动化运维。该平台可保障 Web 应用持续稳定运行,适用于中小型生产环境。