LNMP集群搭建步骤解析
小樊
37
2025-11-16 09:48:12
架构与组件规划
- 目标:构建一个可横向扩展、具备高可用的 LNMP(Linux + Nginx + MySQL/MariaDB + PHP-FPM) 集群,覆盖负载均衡、数据库复制、会话保持与监控告警等关键能力。
- 推荐最小拓扑(可按需扩展为多组):
- 负载均衡层:2 台 Nginx/HAProxy + Keepalived VIP(对外统一入口,故障自动切换)
- Web 层:≥2 台 Nginx + PHP-FPM(无状态,可横向扩容)
- 数据层:MySQL 主从复制(写主读从;对写并发更高场景可选主主/组复制/InnoDB Cluster)
- 数据与文件:共享存储或对象存储(用户上传、会话、静态资源)
- 监控与日志:Prometheus + Grafana、ELK/EFK(指标与日志可观测性)
- 端口与服务一览(示例):
- 80/443:HTTP/HTTPS(Nginx)
- 3306:MySQL
- 9000(或 /run/php/phpX.Y-fpm.sock):PHP-FPM
- 9100:Node Exporter(Prometheus)
- 10050/10051:Zabbix Agent/Server(可选)
基础环境准备
- 系统与网络
- 建议使用 CentOS 7/8、Ubuntu 20.04/22.04、Debian 11/12 等稳定发行版;内核与基础工具更新至最新稳定版。
- 规划 内网网段 与 安全组/防火墙策略,仅放通必要端口(80/443/3306/9000/22 等)。
- 时间同步
- 全集群部署 NTP/chrony,保证时间一致性(数据库复制与证书校验对时间敏感)。
- 目录与权限
- Web 根目录统一(如 /var/www/html),所有者为 nginx:nginx 或 www-data:www-data;PHP-FPM 与 Nginx 使用相同用户组以便 FastCGI 权限无碍。
- 安全基线
- 禁用不必要服务与端口;SSH 仅允许密钥登录;数据库仅内网访问;按最小权限原则配置数据库账户与防火墙。
分步搭建流程
- 部署 Web 层(Nginx + PHP-FPM)
- 安装组件(示例)
- CentOS/RHEL:yum 安装 nginx、php、php-fpm、php-mysql 等
- Ubuntu/Debian:apt 安装 nginx、php-fpm、php-mysql
- PHP-FPM 关键配置(/etc/php/*/fpm/pool.d/www.conf)
- 建议以 Unix Socket 通信:listen = /run/php/phpX.Y-fpm.sock
- 设置 listen.owner / listen.group / listen.mode(与 Nginx 运行用户一致)
- 调整 pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers 以匹配内存与并发
- Nginx 站点配置要点
- 支持 PHP:location ~ .php$ 中使用 fastcgi_pass 指向 Unix Socket 或 127.0.0.1:9000
- 安全:禁用 .htaccess 解析;设置 try_files $uri $uri/ =404;
- 示例片段:
- fastcgi_pass unix:/run/php/php7.4-fpm.sock;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- 验证
- 创建 /var/www/html/info.php:
- 访问 http://服务器IP/info.php 确认 Nginx + PHP 正常。
- 部署数据库层(MySQL/MariaDB 主从复制)
- 主库配置(my.cnf/mysqld.cnf)
- server-id = 1
- log_bin = /var/log/mysql/mysql-bin.log
- binlog_do_db = your_database(可选,建议按需开启)
- 从库配置
- server-id = 2
- relay_log = /var/log/mysql/mysql-relay-bin.log
- read_only = 1(从库只读,保障一致性)
- 建立复制
- 主库创建复制用户:CREATE USER ‘replicator’@‘%’ IDENTIFIED BY ‘强密码’;
- 授权:GRANT REPLICATION SLAVE ON . TO ‘replicator’@‘%’; FLUSH PRIVILEGES;
- 主库执行:SHOW MASTER STATUS; 记录 File 与 Position
- 从库执行:CHANGE MASTER TO … ; START SLAVE;
- 检查:SHOW SLAVE STATUS\G,确保 Slave_IO_Running/Slave_SQL_Running=Yes
- 扩展
- 读写分离可在应用侧或中间件(如 ProxySQL/MaxScale)实现;写并发更高可考虑 主主复制 或 组复制。
- 部署负载均衡与高可用
- 方案 A:Nginx 作为反向代理与负载均衡
- upstream 定义后端 Web 组;配置 proxy_set_header 透传真实客户端信息;可结合 least_conn / ip_hash 等策略
- 方案 B:HAProxy + Keepalived
- HAProxy 负责 7 层/4 层负载;Keepalived 提供 VIP 与 故障秒级切换
- 健康检查
- Nginx:max_fails / fail_timeout;HAProxy:option httpchk / tcp-check
- 会话保持
- 优先应用层无状态与 Redis 集中会话;如必须,可用 ip_hash 或基于 Cookie 的会话亲和(权衡可用性与扩展性)。
- 数据与文件一致性
- 上传与静态资源
- 使用 NFS/对象存储(如 S3 兼容) 统一挂载 /var/www/uploads 等目录,避免多节点写入不一致
- 会话共享
- 将 PHP Session 存入 Redis/Memcached,消除节点亲和依赖
- 缓存加速
- 启用 OPcache(PHP)、配置 Redis 作为页面/数据缓存,减轻数据库压力。
- 监控与日志
- 指标与可视化
- 部署 Node Exporter/PHP-FPM Exporter/MySQL Exporter → Prometheus → Grafana 看板
- 日志集中
- Nginx、PHP-FPM、MySQL 日志接入 Filebeat/Logstash → Elasticsearch → Kibana/EFK
- 告警
- Prometheus Alertmanager 或 Zabbix 配置阈值告警(5xx、连接数、复制延迟、磁盘 IO 等)。
验证与上线
- 功能验证
- 访问域名/应用首页与接口,确认 静态资源、动态页面、数据库读写、文件上传 正常
- 模拟后端故障(停一台 Web 或关闭主库),验证 负载均衡切换 与 故障恢复
- 性能与安全
- 进行 基准压测(如 wrk/ab),根据结果调优 worker_processes/连接复用/缓存策略
- 开启 HTTPS/TLS(Let’s Encrypt/certbot),设置 HSTS、安全头、防点击劫持 等
- 备份与演练
- 制定 数据库全量+增量备份 与 定期恢复演练 策略;关键配置纳入 版本控制 与 配置管理(Ansible/Salt)。