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_REPOhttps://gitee.com修改为自己的 # 自动从 Git 地址提取项目名例如 mblog也可以手动覆盖 PROJECT_NAME$(basename $GIT_REPO .git) # 部署根目录 DEPLOY_BASE/usr/share/nginx/html # MariaDB root 密码请修改为安全密码 MYSQL_ROOT_PASSWORD123.bmk! # 入口文件名部署时可交互输入此值为默认 DEFAULT_ENTRY_FILEindex.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 --usermysql --basedir/usr --datadir/var/lib/mysql /dev/null 21; then error_exit MariaDB 初始化失败 fi systemctl enable --now mariadb || error_exit MariaDB 启动失败 info 自动执行 MariaDB 安全配置 (root 密码设为: ${MYSQL_ROOT_PASSWORD})... mysql EOF ALTER USER rootlocalhost IDENTIFIED BY ${MYSQL_ROOT_PASSWORD}; DELETE FROM mysql.user WHERE User; DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Dbtest OR Dbtest\\_%; FLUSH PRIVILEGES; EOF if [[ $? -ne 0 ]]; then error_exit MariaDB 安全配置失败 fi cat /root/.my.cnf EOF [client] userroot 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_IP127.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} 21) 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