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,请检查配置" fi2.自动删除
#!/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 "======================================"