温馨提示×

LNMP如何实现自动部署

小樊
33
2025-12-18 00:58:16
栏目: 编程语言

LNMP自动部署实用方案

一、方案总览与选型

  • 常见做法包括:使用Shell 一键脚本集成安装脚本 oneinstackAnsible 批量编排Docker 容器化以及Terraform + User Data 云上自动初始化。下表给出适用场景与要点:
方式 适用场景 核心优点 关键要点
Shell 一键脚本 单机快速交付 简单直观、可定制 版本锁定、幂等处理、错误处理与回滚
oneinstack 多版本/多组件选择 功能全、交互/自动均可 支持 Nginx/Tengine/OpenResty、多 PHP/DB 版本、SSL/备份
Ansible 批量/多环境 声明式、可复用、可审计 Playbook 管理、Idempotent、角色化
Docker 开发/测试/轻量生产 环境隔离、快速起停 多容器编排、数据卷持久化、网络与权限
Terraform 云上基础设施 + 初始化 IaC、可重复部署 User Data 执行安装脚本、与云资源联动

以上方案在实际工程中均被广泛采用,可按规模与运维成熟度选择或组合使用。

二、单机一键脚本思路与关键步骤

  • 准备与版本选择
    • 确认系统版本(如 CentOS 7/8Ubuntu 20.04/22.04),准备具备 root/sudo 权限的账号;选择 NginxMariaDB/MySQLPHP 的兼容版本。
  • 安装与启动 Nginx
    • 基于发行版仓库安装(如 yum/apt),启动并设置开机自启;验证:curl -I http://localhost 返回 200
  • 安装与初始化数据库
    • 安装 MariaDB(CentOS 7 常用)或 MySQL;执行安全初始化(设置 root 密码、移除匿名用户等)。
  • 安装 PHP 与 PHP-FPM
    • 使用官方或 Remi 仓库选择所需 PHP 版本(如 7.4/8.0/8.1/8.3),安装 php-fpm 与常用扩展(如 php-mysql、php-mbstring、php-xml、php-gd、php-opcache)。
  • 配置 Nginx 支持 PHP
    • 在 server 块中添加 .php 的 FastCGI 转发,典型为 fastcgi_pass 127.0.0.1:9000;设置 SCRIPT_FILENAME 为 $document_root$fastcgi_script_name
  • 验证与收尾
    • 创建 /usr/share/nginx/html/info.php),访问验证;按需配置防火墙(如放行 80/443)、日志轮转与监控告警。

三、批量与云上自动化

  • Ansible 编排示例(节选)
    • 使用 apt/yum 安装 Nginx/MySQL/PHP-FPM,通过模板下发 Nginx 虚拟主机配置,notify 触发重启;集中管理多台主机、可版本化与审计。
  • Docker Compose 示例(开发/测试)
    • 以多容器方式启动 Nginx + PHP-FPM + MySQL,通过 volumes 挂载代码与数据,环境变量配置数据库口令与库名,快速拉起与销毁。
  • Terraform + User Data(云上自动初始化)
    • 定义云主机资源,在 user_data 中嵌入安装脚本(如 yum/apt 安装 Nginx/MySQL/PHP-FPM、启动服务、写入 info.php),实现实例创建即完成环境就绪。

四、一键脚本最小可用示例 CentOS 7

  • 使用说明
    • rootCentOS 7 执行;按需修改密码与版本;脚本包含基础错误处理与验证步骤。
  • 脚本内容
    • 保存为 lnmp_install.sh,执行:chmod +x lnmp_install.sh && ./lnmp_install.sh
#!/usr/bin/env bash
set -Eeuo pipefail

# 可配置参数
DB_ROOT_PASS="${DB_ROOT_PASS:-MyStrongPass123!}"
PHP_VER="${PHP_VER:-74}"   # 74/80/81/83
NGINX_ROOT="/usr/share/nginx/html"
INFO_PHP="${NGINX_ROOT}/info.php"

echo "[1/5] 安装 EPEL 与 Nginx"
yum install -y epel-release
yum install -y nginx
systemctl start nginx && systemctl enable nginx
curl -I http://localhost | grep -q "200 OK" || { echo "Nginx 启动或访问异常"; exit 1; }

echo "[2/5] 安装 MariaDB 并初始化"
yum install -y mariadb-server mariadb
systemctl start mariadb && systemctl enable mariadb
mysql_secure_installation <<EOF
y
${DB_ROOT_PASS}
${DB_ROOT_PASS}
y
y
y
y
EOF

echo "[3/5] 安装 PHP ${PHP_VER} 与常用扩展"
yum install -y yum-utils
yum install -y "http://rpms.remirepo.net/enterprise/remi-release-7.rpm"
yum-config-manager --disable 'remi-php*'
yum-config-manager --enable "remi-php${PHP_VER}"
yum install -y php php-fpm php-mysqlnd php-mbstring php-xml php-gd php-opcache

systemctl start php-fpm && systemctl enable php-fpm

echo "[4/5] 配置 Nginx 支持 PHP"
cat >/etc/nginx/conf.d/default.conf <<'EOF'
server {
    listen 80;
    server_name _;
    root /usr/share/nginx/html;
    index index.php index.html index.htm;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
EOF
systemctl reload nginx

echo "[5/5] 创建 PHP 测试页并验证"
echo "<?php phpinfo(); ?>" > "$INFO_PHP"
curl -I http://localhost/info.php | grep -q "200 OK" || { echo "PHP 页面测试失败"; exit 1; }

echo "LNMP 部署完成:Nginx + MariaDB + PHP ${PHP_VER}"
echo "访问 http://服务器IP/info.php 验证"
  • 安全与优化建议
    • 使用 防火墙(firewalld/ufw)仅放行 80/443;为数据库与后台设置强口令最小权限;禁用不必要的 PHP 函数;开启 SELinux/AppArmor(如适用);配置 HTTPS/TLS(Let’s Encrypt/certbot);将 PHP 错误日志与 Nginx 访问/错误日志接入集中监控/告警

0