温馨提示×

如何在Ubuntu上实现LNMP自动化运维

小樊
40
2025-12-08 08:40:46
栏目: 智能运维

Ubuntu 上 LNMP 自动化运维落地方案

一、目标与总体架构

  • 目标:在 Ubuntu 上实现 LNMP(Nginx、MySQL、PHP-FPM) 的自动化部署、配置、发布、回滚、健康检查与自愈、监控与日志集中,以及批量与多环境管理。
  • 架构建议:
    • 单机/小团队:使用 Shell/Ansible 做标准化安装与配置,配合 systemd 自愈与 CI/CD 做发布。
    • 多机/中大型:使用 Ansible 批量编排,或 Docker 容器化部署;接入 Prometheus + Grafana 监控与 ELK 日志集中,形成闭环。

二、自动化部署与配置

  • 方式一 Shell 一键脚本(适合快速落地与学习)

    • 思路:更新系统、安装依赖、下载并编译 Nginx/PHP,二进制部署 MySQL 8,生成 systemd 单元,配置 Nginx 与 PHP-FPM 联动,输出 临时 root 密码 与访问地址。
    • 要点:
      • Nginx systemd 示例(适配编译安装路径):
        • ExecStartPre 指向 /usr/local/nginx/sbin/nginx -t 做配置语法校验
        • PIDFile 指向 /usr/local/nginx/logs/nginx.pid
        • ExecReload 使用 /usr/local/nginx/sbin/nginx -s reload
      • PHP-FPM 建议以 systemd 管理(Type=simple,ExecReload 发送 USR2 热重启)
      • MySQL 8 二进制包初始化后从日志提取 临时密码,并执行 mysql_secure_installation 完成加固
    • 适用:需要可控编译参数、内网离线环境、特定目录布局。
  • 方式二 Ansible 编排(适合标准化与批量)

    • 思路:编写 Playbook 安装 Nginx、MySQL、PHP-FPM,推送模板化配置(Jinja2),执行 mysql_secure_installation,并配置 systemd 开机自启与平滑重载。
    • 示例任务片段(安装与配置 Nginx):
      • apt 安装 Nginx
      • template 推送 /etc/nginx/sites-available/default
      • notify: restart nginx(Handler 执行 systemctl restart nginx)
    • 运行:ansible-playbook lnmp.yml,可批量在多台 Ubuntu 主机上一致交付。
  • 方式三 一键脚本与集成方案(适合快速交付与生态集成)

    • 集成脚本/工具:如 lnmp-oneinstack 等,支持多发行版、多版本选择、SSL、虚拟主机、备份脚本等,适合快速交付与运维集成。

三、自愈与自动重启

  • 首选 systemd 原生能力(推荐)

    • Nginx、MySQL、PHP-FPM 启用并配置 systemd 单元,设置 Restart=on-failure,即可在崩溃或异常退出时自动拉起;变更配置使用 systemctl reload 实现零中断(或最小中断)生效。
    • Nginx 单元关键项:
      • Type=forking,PIDFile=/run/nginx.pid
      • ExecStartPre=/usr/sbin/nginx -t(语法校验)
      • ExecReload=/bin/kill -s HUP $MAINPID(热加载)
    • PHP-FPM 单元关键项:
      • Type=simple,ExecReload=/bin/kill -USR2 $MAINPID(平滑重启)
    • 建议:统一使用 systemd 管理,避免多套进程管理工具混用。
  • 备选 Supervisor(多进程统一管控)

    • 适用场景:需要跨语言/多进程统一托管与日志采集。
    • 配置要点:
      • nginx、mysql、php-fpm 创建 program 段,开启 autostart=true、autorestart=true
      • 指定 stdout/stderr 日志路径,便于集中采集
      • 执行:supervisorctl reread && supervisorctl update && supervisorctl start all。
  • 兜底脚本 + Cron(不建议作为首选)

    • 思路:定时检测进程存活并启动,作为 systemd 失效时的兜底。
    • 示例:每 5 分钟 检测并重启,日志落盘到 /var/log/lnmp_restart.log
    • 风险:可能掩盖根因,建议仅作临时兜底并尽快修复根因。

四、CI/CD 持续交付与回滚

  • Jenkins 流水线
    • 阶段:拉取代码(Git)→ 安装依赖(Composer)→ 单元测试(PHPUnit)→ 构建产物 → 发布到 /var/www/ → 执行 systemctl reload nginx(必要时重启 PHP-FPM/MySQL)→ 冒烟测试(如访问 /healthphpinfo 页面)。
    • 安全:使用 SSH 密钥 或凭据插件,限制目标目录与权限,生产环境采用 蓝绿/金丝雀 发布策略降低风险。
  • GitLab CI/CD
    • 使用 .gitlab-ci.yml 定义 build/test/deploy 阶段,通过 only: main 限定主线发布;Runner 以 SSHK8s Executor 部署到目标主机并重启服务。
  • 回滚策略
    • 代码层:基于 Git 标签/提交回滚
    • 发布层:备份上一版目录与数据库(快照/导出),出现故障时一键回滚;容器化可用镜像版本回滚。

五、监控、日志与批量运维

  • 监控与告警
    • 主机与应用指标:部署 Node ExporterPrometheus 采集 → Grafana 可视化与阈值告警(如 Nginx 5xxPHP-FPM 进程异常MySQL 连接数/慢查询)。
  • 日志集中
    • 收集 Nginx access/error、PHP-FPM、MySQL error 等日志到 ELK(Elasticsearch、Logstash、Kibana) 或兼容栈,便于检索、分析与可视化。
  • 批量与多环境
    • 使用 Ansible Inventory 管理多环境(dev/staging/prod),配合 TagPlaybook 分层执行;镜像化场景可用 Docker ComposeKubernetes 管理多实例与滚动升级。

0