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

Arch linux-nginx_LEMP自动化脚本

1.自动搭建

#!/bin/bash # Auto deploy LEMP (Nginx + MariaDB + PHP) for any PHP project on Arch Linux # 全自动部署,支持任意 Git 仓库,自动定位入口文件目录并配置 Nginx root #注意变量中的信息需要修改,项目地址必须修改 set -e # 遇到错误立即退出 # ========== 可配置变量 ========== # Git 仓库地址(请修改为您的项目地址) GIT_REPO="https://gitee.com(修改为自己的)" # 自动从 Git 地址提取项目名(例如 mblog),也可以手动覆盖 PROJECT_NAME=$(basename "$GIT_REPO" .git) # 部署根目录 DEPLOY_BASE="/usr/share/nginx/html" # MariaDB root 密码(请修改为安全密码) MYSQL_ROOT_PASSWORD="123.bmk!" # 入口文件名(部署时可交互输入,此值为默认) DEFAULT_ENTRY_FILE="index.php" # ================================ # 最终项目路径 DEPLOY_DIR="${DEPLOY_BASE}/${PROJECT_NAME}" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' NC='\033[0m' error_exit() { echo -e "${RED}[ERROR] $1${NC}" >&2 exit 1 } info() { echo -e "${GREEN}[INFO] $1${NC}" } # 检查是否为 root 用户 if [[ $EUID -ne 0 ]]; then error_exit "请使用 root 用户执行此脚本" fi # 1. 更新系统并安装必要软件 info "更新系统并安装软件包..." pacman -Syy --noconfirm || error_exit "系统更新失败" pacman -S --noconfirm git nginx mariadb php-fpm php-gd || error_exit "软件包安装失败" # 2. 初始化 MariaDB info "初始化 MariaDB 数据库..." if ! mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql >/dev/null 2>&1; then error_exit "MariaDB 初始化失败" fi systemctl enable --now mariadb || error_exit "MariaDB 启动失败" info "自动执行 MariaDB 安全配置 (root 密码设为: ${MYSQL_ROOT_PASSWORD})..." mysql <<EOF ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}'; DELETE FROM mysql.user WHERE User=''; DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'; FLUSH PRIVILEGES; EOF if [[ $? -ne 0 ]]; then error_exit "MariaDB 安全配置失败" fi cat > /root/.my.cnf <<EOF [client] user=root password=${MYSQL_ROOT_PASSWORD} EOF chmod 600 /root/.my.cnf # 3. 配置 PHP info "配置 PHP 扩展..." PHP_INI="/etc/php/php.ini" for ext in pdo_mysql mysqli curl gd; do sed -i "s/^;extension=${ext}/extension=${ext}/" "$PHP_INI" done info "检查 PHP 扩展加载状态..." EXT_RESULT=$(php -m | grep -E "pdo_mysql|mysqli|curl|gd") echo "$EXT_RESULT" missing_exts="" for ext in pdo_mysql mysqli curl gd; do if ! echo "$EXT_RESULT" | grep -qw "$ext"; then missing_exts="$missing_exts $ext" fi done if [ -n "$missing_exts" ]; then error_exit "以下扩展未正确加载:$missing_exts" else info "所有必需扩展已成功加载" fi systemctl enable --now php-fpm || error_exit "php-fpm 启动失败" # 4. 克隆项目 info "克隆项目 ${GIT_REPO} 到 ${DEPLOY_DIR} ..." if [[ -d "$DEPLOY_DIR" ]]; then info "目标目录已存在,删除旧版本..." rm -rf "$DEPLOY_DIR" fi git clone "$GIT_REPO" "$DEPLOY_DIR" || error_exit "项目克隆失败" chown -R http:http "$DEPLOY_DIR" chmod -R 755 "$DEPLOY_DIR" # 5. 递归查找入口文件,确定 Nginx root 目录 info "检查项目入口文件(递归搜索,深度≤5层)..." read -p "请输入项目入口文件名(直接回车则默认为 index.php): " ENTRY_FILE ENTRY_FILE=${ENTRY_FILE:-$DEFAULT_ENTRY_FILE} # 限制搜索深度为 5 层,找到第一个匹配文件即停止 FOUND_PATH=$(find "$DEPLOY_DIR" -maxdepth 5 -type f -name "$ENTRY_FILE" -print -quit 2>/dev/null) if [[ -n "$FOUND_PATH" ]]; then ROOT_DIR=$(dirname "$FOUND_PATH") info "找到入口文件: $FOUND_PATH" info "将 Nginx root 设置为: $ROOT_DIR" else error_exit "未找到名为 ${ENTRY_FILE} 的文件,请确认项目结构" fi # 6. 配置 Nginx info "配置 Nginx..." NGINX_CONF="/etc/nginx/nginx.conf" cp "$NGINX_CONF" "${NGINX_CONF}.bak" 2>/dev/null || true cat > "$NGINX_CONF" <<EOF user http; worker_processes auto; error_log /var/log/nginx/${PROJECT_NAME}_error.log; pid /run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '\$remote_addr - \$remote_user [\$time_local] "\$request" ' '\$status \$body_bytes_sent "\$http_referer" ' '"\$http_user_agent" "\$http_x_forwarded_for"'; server { listen 80; server_name _; root ${ROOT_DIR}; index index.php index.html; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log warn; location / { try_files \$uri \$uri/ /index.php?\$args; } location ~ \.php\$ { include fastcgi_params; fastcgi_pass unix:/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; } location ~ /(config|blog\.sql|README\.md) { deny all; return 404; } location ~ /\. { deny all; } } } EOF nginx -t || error_exit "Nginx 配置文件语法错误" systemctl enable --now nginx || error_exit "Nginx 启动失败" # 7. 完成提示 info "部署成功!" LOCAL_IP=$(hostname -I | awk '{print $1}') if [[ -z "$LOCAL_IP" ]]; then LOCAL_IP="127.0.0.1" fi echo "======================================================" echo "访问地址: http://${LOCAL_IP}" echo "MariaDB root 密码: ${MYSQL_ROOT_PASSWORD}" echo "项目路径: ${DEPLOY_DIR}" echo "Nginx root 实际指向: ${ROOT_DIR}" echo "Nginx 日志: /var/log/nginx/access.log" echo "PHP 错误日志: /var/log/nginx/error.log" echo "======================================================" echo "请尽快修改 MariaDB root 密码(如需)" # 8. 使用 curl 检查网站是否正常 info "执行 curl 检查网站可访问性..." sleep 2 # 等待 Nginx 完全启动 HTTP_RESPONSE=$(curl -i -L -s "http://${LOCAL_IP}" 2>&1) echo "$HTTP_RESPONSE" # 提取 HTTP 状态码 HTTP_CODE=$(echo "$HTTP_RESPONSE" | head -n 1 | awk '{print $2}') if [[ "$HTTP_CODE" =~ ^(200|301|302|304)$ ]]; then info "网站访问测试通过 (HTTP $HTTP_CODE)" else warn "网站访问测试返回 HTTP $HTTP_CODE,请检查配置" fi

2.自动删除

#!/bin/bash # 删除 LEMP 部署(Nginx + MariaDB + PHP)和目录下同名 项目 # 警告:此脚本会删除数据库、网站文件和服务配置,请谨慎使用 set -e # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' NC='\033[0m' error_exit() { echo -e "${RED}[ERROR] $1${NC}" >&2 exit 1 } info() { echo -e "${GREEN}[INFO] $1${NC}" } warn() { echo -e "${YELLOW}[WARN] $1${NC}" } # 检查是否为 root 用户 if [[ $EUID -ne 0 ]]; then error_exit "请使用 root 用户执行此脚本" fi echo "======================================" echo " LEMP 部署卸载脚本(Arch Linux)" echo "======================================" echo "此脚本将删除以下内容:" echo " - 网站目录 /usr/share/nginx/html" echo " - Nginx、PHP-FPM、MariaDB 服务(停止并禁用)" echo " - MariaDB 数据库(可选)" echo " - 配置文件备份和 /root/.my.cnf" echo " - 日志文件(可选)" echo "" read -p "是否继续?(y/N): " confirm if [[ ! "$confirm" =~ ^[Yy]$ ]]; then echo "已取消" exit 0 fi # 1. 停止并禁用服务 info "停止并禁用服务..." systemctl stop nginx php-fpm mariadb 2>/dev/null || warn "某些服务未运行" systemctl disable nginx php-fpm mariadb 2>/dev/null || warn "某些服务未启用" # 2. 删除项目目录 PROJECT_DIR="/usr/share/nginx/html/mblog" if [[ -d "$PROJECT_DIR" ]]; then info "删除项目目录 $PROJECT_DIR ..." rm -rf "$PROJECT_DIR" else warn "项目目录不存在,跳过" fi # 3. 删除 MariaDB 数据库(询问) read -p "是否删除 MariaDB 数据库(包括所有数据)?(y/N): " drop_db if [[ "$drop_db" =~ ^[Yy]$ ]]; then info "停止并删除 MariaDB 数据目录..." systemctl stop mariadb 2>/dev/null rm -rf /var/lib/mysql/* info "数据库已清空(注意:仅清空数据,未卸载软件包)" else info "保留数据库" fi # 4. 删除 root 密码配置文件 if [[ -f /root/.my.cnf ]]; then info "删除 /root/.my.cnf ..." rm -f /root/.my.cnf fi # 5. 删除 Nginx 配置文件备份 if [[ -f /etc/nginx/nginx.conf.bak ]]; then info "删除 Nginx 配置备份 ..." rm -f /etc/nginx/nginx.conf.bak fi # 6. 恢复原始 Nginx 配置(如果存在默认配置) if [[ -f /etc/nginx/nginx.conf.pacnew ]] || command -v pacman &>/dev/null; then warn "Nginx 配置文件已修改,如需恢复请手动处理" fi # 7. 询问是否删除日志文件 read -p "是否删除访问日志和错误日志?(y/N): " del_logs if [[ "$del_logs" =~ ^[Yy]$ ]]; then info "删除 /var/log/nginx/access.log 和 error.log ..." rm -f /var/log/nginx/access.log /var/log/nginx/error.log /var/log/nginx/mblog_error.log else info "保留日志文件" fi # 8. 询问是否卸载软件包(慎重) read -p "是否卸载已安装的软件包(nginx, mariadb, php-fpm, php-gd, git)?(y/N): " remove_pkgs if [[ "$remove_pkgs" =~ ^[Yy]$ ]]; then info "卸载软件包..." pacman -Rs --noconfirm nginx mariadb php-fpm php-gd git 2>/dev/null || warn "卸载失败,请手动处理" else info "保留软件包" fi info "清理完成!" echo "======================================" echo "如需完全删除 PHP 扩展配置文件 /etc/php/php.ini 的修改,请手动恢复" echo "======================================"
http://www.jsqmd.com/news/856291/

相关文章:

  • STM32F103+BTS7960:一个工科生的自动循迹小车避坑实录(附完整代码与调试心得)
  • 2026年5月pof膜品牌推荐:五家产品评测夜班包装防破损 - 品牌推荐
  • 告别死记硬背!用生活化案例图解博途V18中的定时器与计数器(TP/TON/TOF/TONR/CTU/CTD)
  • 把FlashAttention装进昇腾NPU:为啥它能让大模型推理快3倍?
  • AFSIM-模型导入导出-源码级Bug修改
  • 原生PHP到底如何缩短响应时间 TTFB?
  • VisionPro 相机集成与视觉测量
  • 摆脱论文困扰! AI论文工具2026最新测评与推荐
  • 【Perplexity词组搭配查询避坑清单】:8个致命误用场景+3类伪低困惑度陷阱,资深语言工程师紧急预警
  • Visa携手Jason Sudeikis,将足球赛场最简单的进球方式转化为2026年国际足联世界杯的最精彩球迷时刻
  • CSS锚点定位(Anchor Positioning)完全指南:实现精准定位
  • AUTOSAR Ea模块深度解析:EEPROM抽象原理、配置实战与性能优化
  • Win10开发环境搭建必看:彻底解决ping localhost返回::1导致服务启动失败的问题
  • AI Agent Harness Engineering 不是银弹:哪些场景用了 Multi-Agent 反而更差
  • Windows下安装OpenCode并配置oh-my-openagent和superpowers
  • STM32CubeMX 6.14版本保姆级安装教程(附CSDN下载链接,解决官网卡顿)
  • 1987年5月25日晚上23-24点出生性格、运势和命运
  • 昇腾CANN shmem:把多张 NPU 的 HBM 变成一块全局内存
  • HP Z66 G6 外接显示器无信号排查:amdgpu DCN 3.1 EDID 超时与 HDMI 2.1 FRL 协商问题
  • AI一周事件 · 2026-05-13 至 2026-05-19
  • 从Java到AI大模型:小白程序员必备转型指南,收藏学习不迷路!
  • ADI AD5940阻抗测量开发板开箱实测:从硬件连接到IAR工程配置的保姆级避坑指南
  • 2026年牵手红娘服务权威推荐深度分析:婚恋场景用户择偶效率低与线下见面率低困境 - 品牌推荐
  • 程序员修炼之道:从代码到思维的进阶指南
  • OpenWrt opkg配置进阶:手把手教你设置代理、跳过证书检查,解决国内下载慢问题
  • 平衡小车/四轴飞行器姿态解算实战:MPU6050三种滤波算法(四元数、互补、卡尔曼)代码详解与选型指南
  • Option ‘importsNotUsedAsValues‘ has been removed. Please remove it from your configuration
  • 5分钟掌握AI音频分离:Retrieval-based-Voice-Conversion-WebUI终极指南
  • SAP应收清账程序开发避坑指南:外币、超额收款、表更新这些细节别忽略
  • C语言编程实战:用ASCII码表玩转字符大小写转换(附完整代码)