fix(nginx): 适配宝塔面板Nginx部署环境
- 新增宝塔面板环境检测逻辑 - 自动适配宝塔的Nginx路径与站点目录 - 调整Nginx配置文件命名与软链接规则 - 完善重载Nginx配置的兼容处理
This commit is contained in:
+32
-4
@@ -214,7 +214,17 @@ async function autoConfigureNginx() {
|
|||||||
const root = isRootUser();
|
const root = isRootUser();
|
||||||
const sudoPrefix = root ? '' : 'sudo ';
|
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');
|
const distDir = path.join(__dirname, '..', 'frontend', 'dist');
|
||||||
|
|
||||||
if (fs.existsSync(distDir)) {
|
if (fs.existsSync(distDir)) {
|
||||||
@@ -232,6 +242,8 @@ async function autoConfigureNginx() {
|
|||||||
log.info('请先完成前端构建后再配置 Nginx');
|
log.info('请先完成前端构建后再配置 Nginx');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
config.nginxRoot = wwwDir;
|
||||||
|
|
||||||
const configSource = path.join(__dirname, '..', 'deploy', 'nginx-idc.conf');
|
const configSource = path.join(__dirname, '..', 'deploy', 'nginx-idc.conf');
|
||||||
|
|
||||||
if (!fs.existsSync(configSource)) {
|
if (!fs.existsSync(configSource)) {
|
||||||
@@ -242,8 +254,13 @@ async function autoConfigureNginx() {
|
|||||||
try {
|
try {
|
||||||
let configDir = '';
|
let configDir = '';
|
||||||
let useSitesAvailable = false;
|
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';
|
configDir = '/etc/nginx/sites-available';
|
||||||
useSitesAvailable = true;
|
useSitesAvailable = true;
|
||||||
} else if (fs.existsSync('/etc/nginx/conf.d')) {
|
} else if (fs.existsSync('/etc/nginx/conf.d')) {
|
||||||
@@ -254,7 +271,7 @@ async function autoConfigureNginx() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const configDest = path.join(configDir, 'idc');
|
const configDest = path.join(configDir, 'idc.conf');
|
||||||
log.info(`复制配置到 ${configDest}...`);
|
log.info(`复制配置到 ${configDest}...`);
|
||||||
|
|
||||||
const copyResult = runCommand(`${sudoPrefix}cp "${configSource}" "${configDest}"`);
|
const copyResult = runCommand(`${sudoPrefix}cp "${configSource}" "${configDest}"`);
|
||||||
@@ -265,7 +282,7 @@ async function autoConfigureNginx() {
|
|||||||
|
|
||||||
if (useSitesAvailable) {
|
if (useSitesAvailable) {
|
||||||
log.info('创建站点软链接...');
|
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')) {
|
if (fs.existsSync('/etc/nginx/sites-enabled/default')) {
|
||||||
log.info('删除默认站点配置...');
|
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 配置...');
|
log.info('测试 Nginx 配置...');
|
||||||
const testResult = runCommand(`${sudoPrefix}nginx -t`);
|
const testResult = runCommand(`${sudoPrefix}nginx -t`);
|
||||||
if (!testResult.success) {
|
if (!testResult.success) {
|
||||||
|
|||||||
@@ -568,7 +568,19 @@ function syncFrontendToNginx(options) {
|
|||||||
return { success: true, skipped: true };
|
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');
|
const distDir = path.join(__dirname, 'frontend', 'dist');
|
||||||
|
|
||||||
if (!fs.existsSync(distDir)) {
|
if (!fs.existsSync(distDir)) {
|
||||||
@@ -594,10 +606,24 @@ function syncFrontendToNginx(options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
log.subStep('重载 NGINX 配置...');
|
log.subStep('重载 NGINX 配置...');
|
||||||
const reloadResult = runCommand(`${sudoPrefix}nginx -s reload`, { silent: true });
|
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) {
|
if (reloadResult.success) {
|
||||||
log.success('NGINX 已重载');
|
log.success('NGINX 已重载');
|
||||||
} else {
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!reloadResult.success) {
|
||||||
log.info('尝试 systemctl 重载 NGINX...');
|
log.info('尝试 systemctl 重载 NGINX...');
|
||||||
const systemctlResult = runCommand(`${sudoPrefix}systemctl reload nginx`, { silent: true });
|
const systemctlResult = runCommand(`${sudoPrefix}systemctl reload nginx`, { silent: true });
|
||||||
if (systemctlResult.success) {
|
if (systemctlResult.success) {
|
||||||
|
|||||||
Reference in New Issue
Block a user