当前位置: 首页 > news >正文

LNMP 一键部署脚本 shell脚本

CentOS 7.9 一键部署 Nginx + PHP7.4 + MariaDB + WordPress 中文

#!/bin/bash
# CentOS 7.9 一键部署 Nginx + PHP7.4 + MariaDB + WordPress 中文(含多次重试下载和写入权限设置)
# 作者:yuc79122@gmail.com

set -e

DB_PASS="Zxc-1234"
DB_NAME="wordpress"
CMS_PATH="/usr/share/nginx/html"
LOCAL_IP=$(hostname -I | awk '{print $1}')

echo ">>> 更换为阿里云YUM源..."
yum install -y epel-release yum-utils
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache fast

echo ">>> 安装 Remi Repo,准备安装 PHP7.4..."
yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum-config-manager --disable 'remi-php*'
yum-config-manager --enable remi-php74
yum clean all
yum makecache fast

echo ">>> 安装 Nginx、MariaDB 和 PHP7.4 及常用扩展..."
yum install -y nginx mariadb-server \
php php-fpm php-cli php-mysqlnd php-mbstring php-xml php-gd php-curl php-zip php-opcache

echo ">>> 启动并开机自启 nginx、php-fpm、mariadb..."
systemctl enable nginx php-fpm mariadb
systemctl start nginx php-fpm mariadb

echo ">>> 初始化 MariaDB,设置root密码及创建wordpress数据库..."
mysql -u root <<EOF
UPDATE mysql.user SET Password=PASSWORD('${DB_PASS}') WHERE User='root';
DELETE FROM mysql.user WHERE User='';
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
CREATE DATABASE IF NOT EXISTS ${DB_NAME} DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '${DB_PASS}' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EOF

echo ">>> 配置 MariaDB 允许远程连接..."
if grep -q '^bind-address' /etc/my.cnf; then
    sed -i 's/^bind-address.*/bind-address=0.0.0.0/' /etc/my.cnf
else
    sed -i '/^\[mysqld\]/a bind-address=0.0.0.0' /etc/my.cnf
fi
systemctl restart mariadb

download_wordpress() {
  local url="https://cn.wordpress.org/latest-zh_CN.tar.gz"
  local file="latest-zh_CN.tar.gz"
  local max_retries=5
  local count=0

  while [ $count -lt $max_retries ]; do
    echo "尝试下载 WordPress(第 $((count+1)) 次)..."
    wget -c "$url" -O "$file" && break
    count=$((count+1))
    echo "下载失败,等待3秒后重试..."
    sleep 3
  done

  if [ ! -f "$file" ]; then
    echo "错误:下载 WordPress 失败,退出部署!"
    exit 1
  fi
}

echo ">>> 下载并部署 WordPress 中文版..."
rm -rf ${CMS_PATH}/*
cd ${CMS_PATH}
download_wordpress
tar -xzf latest-zh_CN.tar.gz
mv wordpress/* ./
rm -rf wordpress latest-zh_CN.tar.gz

echo ">>> 配置 WordPress wp-config.php..."
cp wp-config-sample.php wp-config.php
sed -i "s/database_name_here/${DB_NAME}/" wp-config.php
sed -i "s/username_here/root/" wp-config.php
sed -i "s/password_here/${DB_PASS}/" wp-config.php

echo ">>> 设置 WordPress 目录权限..."
chown -R nginx:nginx ${CMS_PATH}
find ${CMS_PATH} -type d -exec chmod 755 {} \;
find ${CMS_PATH} -type f -exec chmod 644 {} \;
chmod -R 775 ${CMS_PATH}/wp-content

echo ">>> 配置 Nginx 虚拟主机..."
cat > /etc/nginx/conf.d/wordpress.conf <<EOF
server {
    listen 80;
    server_name localhost;

    root ${CMS_PATH};
    index index.php index.html;

    location / {
        try_files \$uri \$uri/ /index.php?\$args;
    }

    location ~ \.php\$ {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)\$ {
        expires max;
        log_not_found off;
    }
}
EOF

echo ">>> 设置 PHP 时区为上海..."
sed -i 's/;date.timezone =.*/date.timezone = Asia\/Shanghai/' /etc/php.ini

echo ">>> 重启服务..."
nginx -t && systemctl restart nginx php-fpm mariadb

echo ">>> 生成 PHP 测试页..."
echo "<?php phpinfo(); ?>" > ${CMS_PATH}/test.php
chown nginx:nginx ${CMS_PATH}/test.php

echo
echo "✅ 部署完成!"
echo "访问地址:http://${LOCAL_IP}/"
echo "PHP测试页:http://${LOCAL_IP}/test.php"
echo "数据库:root / ${DB_PASS}(远程访问请开放3306端口)"
echo "WordPress 安装时自行设置管理员用户名和密码"
echo "---------------------------------------------"
echo "注意:安装完成后请删除 test.php 以确保安全。"
 

http://www.lryc.cn/news/573992.html

相关文章:

  • Postgresql中不同数据类型的长度限制
  • 基于springboot+uniapp的“川味游”app的设计与实现7000字论文
  • HarmonyOS NEXT应用元服务布局优化ArkUI框架执行流程
  • Java性能优化权威指南-操作系统性能监控
  • RSYNC+IONTIFY数据实时同步
  • ISCSI存储
  • 从java角度理解io多路复用和redis为什么使用io多路复用
  • 品牌控价需要数据支撑与高效治理双驱动
  • 前端手写题(一)
  • MySQL基础函数篇
  • 黑马python(十三)
  • python高校教务管理系统
  • Rust智能指针演进:从堆分配到零复制的内存管理艺术
  • 算法与数据结构:动态规划DP
  • Windows11系统自定义关闭更新
  • 二刷苍穹外卖 day03
  • Unity2D 街机风太空射击游戏 学习记录 #12QFramework引入
  • 链接脚本基础语法
  • 国产12537穿甲弹侵彻仿真(显式动力学)
  • 抽象工厂设计模式
  • webpack+vite前端构建工具 - 9 webpack技巧性配置
  • Python商务数据分析——Python 入门基础知识学习笔记
  • Python打卡训练营Day56
  • 今日推荐:data-engineer-handbook
  • ICML 2025 | 时空数据(Spatial-Temporal)论文总结
  • 【RocketMQ 生产者和消费者】- 消费者的订阅关系一致性
  • Unity3D仿星露谷物语开发69之动作声音
  • 统计用户本月的连续登录天数
  • 系列一、windows中安装RabbitMQ
  • [论文阅读] 软件工程 + 教学 | 软件工程项目管理课程改革:从传统教学到以学生为中心的混合式学习实践