From 9566b94661897fd8979f66bba09f5b9bf9c6b648 Mon Sep 17 00:00:00 2001 From: zhang1106 <849185023@qq.com> Date: Fri, 15 May 2026 16:29:46 +0800 Subject: [PATCH] =?UTF-8?q?fix(nginx):=20=E9=80=82=E9=85=8D=E5=AE=9D?= =?UTF-8?q?=E5=A1=94=E9=9D=A2=E6=9D=BFNginx=E9=83=A8=E7=BD=B2=E7=8E=AF?= =?UTF-8?q?=E5=A2=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增宝塔面板环境检测逻辑 - 自动适配宝塔的Nginx路径与站点目录 - 调整Nginx配置文件命名与软链接规则 - 完善重载Nginx配置的兼容处理 --- install/nginx.js | 36 ++++++++++++++++++++++++++++++++---- update.js | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 63 insertions(+), 9 deletions(-) diff --git a/install/nginx.js b/install/nginx.js index f8e9d84..e8864ff 100644 --- a/install/nginx.js +++ b/install/nginx.js @@ -214,7 +214,17 @@ async function autoConfigureNginx() { const root = isRootUser(); const sudoPrefix = root ? '' : 'sudo '; - const wwwDir = '/var/www/idc'; + const isBtPanel = fs.existsSync('/www/server/nginx/sbin/nginx') || + fs.existsSync('/www/server/nginx/conf/nginx.conf'); + + let wwwDir; + if (isBtPanel) { + wwwDir = '/www/wwwroot/idc'; + log.info('检测到宝塔面板 Nginx 环境'); + } else { + wwwDir = '/var/www/idc'; + } + const distDir = path.join(__dirname, '..', 'frontend', 'dist'); if (fs.existsSync(distDir)) { @@ -232,6 +242,8 @@ async function autoConfigureNginx() { log.info('请先完成前端构建后再配置 Nginx'); } + config.nginxRoot = wwwDir; + const configSource = path.join(__dirname, '..', 'deploy', 'nginx-idc.conf'); if (!fs.existsSync(configSource)) { @@ -242,8 +254,13 @@ async function autoConfigureNginx() { try { let configDir = ''; let useSitesAvailable = false; + let isBtNginx = false; - if (fs.existsSync('/etc/nginx/sites-available')) { + if (isBtPanel && fs.existsSync('/www/server/nginx/conf/vhost')) { + configDir = '/www/server/nginx/conf/vhost'; + isBtNginx = true; + log.info('使用宝塔面板 Nginx 虚拟主机目录'); + } else if (fs.existsSync('/etc/nginx/sites-available')) { configDir = '/etc/nginx/sites-available'; useSitesAvailable = true; } else if (fs.existsSync('/etc/nginx/conf.d')) { @@ -254,7 +271,7 @@ async function autoConfigureNginx() { return; } - const configDest = path.join(configDir, 'idc'); + const configDest = path.join(configDir, 'idc.conf'); log.info(`复制配置到 ${configDest}...`); const copyResult = runCommand(`${sudoPrefix}cp "${configSource}" "${configDest}"`); @@ -265,7 +282,7 @@ async function autoConfigureNginx() { if (useSitesAvailable) { log.info('创建站点软链接...'); - runCommand(`${sudoPrefix}ln -sf "${configDest}" /etc/nginx/sites-enabled/idc`); + runCommand(`${sudoPrefix}ln -sf "${configDest}" /etc/nginx/sites-enabled/idc.conf`); if (fs.existsSync('/etc/nginx/sites-enabled/default')) { log.info('删除默认站点配置...'); @@ -273,6 +290,17 @@ async function autoConfigureNginx() { } } + if (isBtNginx) { + const btNginxConf = '/www/server/nginx/conf/nginx.conf'; + try { + const mainConf = fs.readFileSync(btNginxConf, 'utf8'); + if (!mainConf.includes('vhost')) { + log.warning('宝塔 Nginx 主配置未包含 vhost 目录,请手动确认'); + log.info(`确保 ${btNginxConf} 的 http 段包含: include vhost/*.conf;`); + } + } catch {} + } + log.info('测试 Nginx 配置...'); const testResult = runCommand(`${sudoPrefix}nginx -t`); if (!testResult.success) { diff --git a/update.js b/update.js index 55c7612..5ac0feb 100644 --- a/update.js +++ b/update.js @@ -568,7 +568,19 @@ function syncFrontendToNginx(options) { return { success: true, skipped: true }; } - const nginxRoot = deployConfig?.nginxRoot || '/var/www/idc'; + const isBtPanel = fs.existsSync('/www/server/nginx/sbin/nginx') || + fs.existsSync('/www/server/nginx/conf/nginx.conf'); + + let nginxRoot = deployConfig?.nginxRoot; + if (!nginxRoot) { + if (isBtPanel) { + nginxRoot = '/www/wwwroot/idc'; + } else { + nginxRoot = '/var/www/idc'; + } + log.info(`未配置 nginxRoot,自动检测: ${nginxRoot} (${isBtPanel ? '宝塔' : '标准'})`); + } + const distDir = path.join(__dirname, 'frontend', 'dist'); if (!fs.existsSync(distDir)) { @@ -594,10 +606,24 @@ function syncFrontendToNginx(options) { } log.subStep('重载 NGINX 配置...'); - const reloadResult = runCommand(`${sudoPrefix}nginx -s reload`, { silent: true }); - if (reloadResult.success) { - log.success('NGINX 已重载'); - } else { + let reloadResult = { success: false }; + + if (isBtPanel) { + const btNginxBin = '/www/server/nginx/sbin/nginx'; + reloadResult = runCommand(`${sudoPrefix}${btNginxBin} -s reload`, { silent: true }); + if (reloadResult.success) { + log.success('NGINX 已重载 (宝塔)'); + } + } + + if (!reloadResult.success) { + reloadResult = runCommand(`${sudoPrefix}nginx -s reload`, { silent: true }); + if (reloadResult.success) { + log.success('NGINX 已重载'); + } + } + + if (!reloadResult.success) { log.info('尝试 systemctl 重载 NGINX...'); const systemctlResult = runCommand(`${sudoPrefix}systemctl reload nginx`, { silent: true }); if (systemctlResult.success) {