From eed2533f290178d88d5b99781cf11ab4c9f141bd Mon Sep 17 00:00:00 2001 From: WanWanYun Date: Sat, 15 Nov 2025 19:31:37 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AE=9D=E5=A1=94?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E7=8E=AF=E5=A2=83=E4=B8=8Binstall.sh?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E8=84=9A=E6=9C=ACNginx=E9=87=8D=E8=BD=BD?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E5=AF=BC=E8=87=B4=E8=84=9A=E6=9C=AC=E9=97=AA?= =?UTF-8?q?=E9=80=80=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题描述: - 在宝塔面板环境下运行install.sh时,Nginx重载步骤会因为命令失败导致整个脚本闪退 - 由于脚本使用了 set -e,任何命令返回非0退出码都会导致脚本终止 修复内容: 1. configure_nginx_http_first 函数 (2408-2446行): - 移除可能失败的 /etc/init.d/bt restart 命令 - 在所有Nginx命令前添加配置测试 - 使用 || true 防止命令失败导致脚本退出 - 优化错误提示,失败时不退出脚本 2. configure_nginx_final 函数 (2504-2538行): - 同样的修复逻辑应用到Nginx重载环节 - 确保即使Nginx操作失败,脚本也能继续执行后续步骤 技术改进: - 先测试Nginx配置再reload,避免配置错误导致服务中断 - reload失败时自动尝试重启Nginx - 所有可能失败的命令都添加了错误处理 - 保留systemctl作为备用方案 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- install.sh | 69 +++++++++++++++++++++++++++--------------------------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/install.sh b/install.sh index 183958e..9f2fbba 100644 --- a/install.sh +++ b/install.sh @@ -2410,38 +2410,42 @@ EOF # 宝塔面板:尝试多种方式 print_info "宝塔环境,尝试重载Nginx..." - # 方式1: 使用宝塔命令行工具(如果存在) - if [[ -f /etc/init.d/bt ]]; then - /etc/init.d/bt restart 2>/dev/null - fi - - # 方式2: 直接使用nginx命令reload + # 优先使用最可靠的方式: 直接使用nginx命令reload if [[ -f /www/server/nginx/sbin/nginx ]]; then - /www/server/nginx/sbin/nginx -s reload 2>/dev/null - if [[ $? -eq 0 ]]; then - print_success "已使用nginx -s reload重载配置" - else - # 如果reload失败,尝试启动 - /www/server/nginx/sbin/nginx 2>/dev/null - if [[ $? -eq 0 ]]; then - print_success "已启动Nginx" + # 先测试配置 + if /www/server/nginx/sbin/nginx -t 2>/dev/null; then + # 配置测试通过,尝试reload + if /www/server/nginx/sbin/nginx -s reload 2>/dev/null; then + print_success "已使用nginx -s reload重载配置" else - print_warning "Nginx reload失败,尝试systemctl..." + # reload失败,尝试重启 + print_warning "reload失败,尝试重启Nginx..." + /www/server/nginx/sbin/nginx -s stop 2>/dev/null || true + sleep 2 + if /www/server/nginx/sbin/nginx 2>/dev/null; then + print_success "Nginx已重新启动" + else + print_error "Nginx启动失败,请手动检查" + # 不退出脚本,继续后续步骤 + fi fi + else + print_error "Nginx配置测试失败" + # 显示配置错误但不退出脚本 + /www/server/nginx/sbin/nginx -t 2>&1 || true fi fi - # 方式3: 尝试systemctl(备用) + # 备用方式: 尝试systemctl(某些宝塔环境也支持) if systemctl is-active --quiet nginx 2>/dev/null; then - systemctl reload nginx 2>/dev/null && print_info "已使用systemctl重载配置" - else - systemctl start nginx 2>/dev/null && print_info "已使用systemctl启动Nginx" + systemctl reload nginx 2>/dev/null && print_info "已使用systemctl重载配置" || true fi else # 标准Nginx:重启 systemctl restart nginx fi + # 验证Nginx是否运行 sleep 2 if [[ "$IS_BT_PANEL" == "true" ]]; then @@ -2502,38 +2506,33 @@ configure_nginx_final() { # 宝塔面板:尝试多种方式 print_info "宝塔环境,重载Nginx配置..." - # 方式1: 使用宝塔命令行工具(如果存在) - if [[ -f /etc/init.d/bt ]]; then - /etc/init.d/bt restart 2>/dev/null - fi - - # 方式2: 直接使用nginx命令reload(最可靠) + # 优先使用最可靠的方式: 直接使用nginx命令reload if [[ -f /www/server/nginx/sbin/nginx ]]; then - /www/server/nginx/sbin/nginx -s reload 2>/dev/null - if [[ $? -eq 0 ]]; then + if /www/server/nginx/sbin/nginx -s reload 2>/dev/null; then print_success "已使用nginx -s reload重载配置" else - # 如果reload失败,尝试启动 - /www/server/nginx/sbin/nginx 2>/dev/null - if [[ $? -eq 0 ]]; then + # reload失败,尝试重启 + print_warning "reload失败,尝试重启Nginx..." + /www/server/nginx/sbin/nginx -s stop 2>/dev/null || true + sleep 2 + if /www/server/nginx/sbin/nginx 2>/dev/null; then print_success "已启动Nginx" else - print_warning "Nginx reload失败,尝试systemctl..." + print_warning "Nginx启动失败,请手动检查" fi fi fi - # 方式3: 尝试systemctl(备用) + # 备用方式: 尝试systemctl if systemctl is-active --quiet nginx 2>/dev/null; then - systemctl reload nginx 2>/dev/null && print_info "已使用systemctl重载配置" - else - systemctl start nginx 2>/dev/null && print_info "已使用systemctl启动Nginx" + systemctl reload nginx 2>/dev/null && print_info "已使用systemctl重载配置" || true fi else # 标准Nginx:重载 systemctl reload nginx fi + print_success "Nginx最终配置完成" echo "" }