优化网络检测并自动选择速度最快的APT镜像源

This commit is contained in:
jingrow 2025-08-15 20:24:21 +08:00
parent dae130cf46
commit c6d3b456d9

241
jsite.sh
View File

@ -264,25 +264,44 @@ export DEBCONF_NONINTERACTIVE_SEEN=true
export UCF_FORCE_CONFNEW=1 export UCF_FORCE_CONFNEW=1
export UCF_FORCE_CONFOLD=1 export UCF_FORCE_CONFOLD=1
# 网络连通性检测 # 优化curl配置提高下载速度和稳定性
export CURL_CONNECT_TIMEOUT=5
export CURL_MAX_TIME=30
export CURL_RETRY=2
export CURL_RETRY_DELAY=1
# 网络连通性检测和最佳镜像源选择
check_network_connectivity() { check_network_connectivity() {
log_info "检测网络连通性..." log_info "检测网络连通性并选择最佳镜像源..."
local test_urls=( local test_urls=(
"https://mirrors.aliyun.com" "https://mirrors.aliyun.com"
"https://registry.npmmirror.com" "https://registry.npmmirror.com"
"https://gitee.com" "https://gitee.com"
"https://mirrors.ustc.edu.cn" "https://mirrors.ustc.edu.cn"
"https://raw.githubusercontent.com" "https://mirrors.tuna.tsinghua.edu.cn"
"https://mirrors.cloud.tencent.com"
"https://mirrors.huaweicloud.com"
) )
local network_ok=false local network_ok=false
local best_mirror=""
local fastest_time=999
for url in "${test_urls[@]}"; do for url in "${test_urls[@]}"; do
log_info "测试连接: $url" log_info "测试连接速度: $url"
if curl -fsSL --connect-timeout 5 --max-time 10 "$url" >/dev/null 2>&1; then local start_time=$(date +%s%N)
log_success "网络连接正常: $url" if curl -fsSL --connect-timeout 3 --max-time 8 "$url" >/dev/null 2>&1; then
local end_time=$(date +%s%N)
local response_time=$(( (end_time - start_time) / 1000000 ))
log_success "网络连接正常: $url (响应时间: ${response_time}ms)"
if [ $response_time -lt $fastest_time ]; then
fastest_time=$response_time
best_mirror="$url"
fi
network_ok=true network_ok=true
break
else else
log_warning "网络连接失败: $url" log_warning "网络连接失败: $url"
fi fi
@ -293,6 +312,12 @@ check_network_connectivity() {
return 1 return 1
fi fi
# 设置全局最佳镜像源
if [ -n "$best_mirror" ]; then
export BEST_MIRROR="$best_mirror"
log_success "选择最佳镜像源: $best_mirror (响应时间: ${fastest_time}ms)"
fi
log_success "网络连通性检测完成" log_success "网络连通性检测完成"
} }
@ -309,52 +334,46 @@ configure_apt_mirrors() {
# 检测系统版本 # 检测系统版本
local codename=$(lsb_release -cs 2>/dev/null || echo "jammy") local codename=$(lsb_release -cs 2>/dev/null || echo "jammy")
# 创建新的源列表,使用多个国内镜像源(按优先级排序) # 根据网络检测结果选择最佳镜像源
local primary_mirror="https://mirrors.aliyun.com"
if [ -n "$BEST_MIRROR" ]; then
case "$BEST_MIRROR" in
*"aliyun"*) primary_mirror="https://mirrors.aliyun.com" ;;
*"npmmirror"*) primary_mirror="https://mirrors.aliyun.com" ;;
*"tencent"*) primary_mirror="https://mirrors.cloud.tencent.com" ;;
*"huawei"*) primary_mirror="https://mirrors.huaweicloud.com" ;;
*"ustc"*) primary_mirror="https://mirrors.ustc.edu.cn" ;;
*"tuna"*) primary_mirror="https://mirrors.tuna.tsinghua.edu.cn" ;;
*) primary_mirror="https://mirrors.aliyun.com" ;;
esac
log_info "根据网络检测结果选择APT主镜像源: $primary_mirror"
fi
# 创建新的源列表,使用最佳镜像源作为主要源
cat > /etc/apt/sources.list << EOF cat > /etc/apt/sources.list << EOF
# 1. 阿里云镜像源(国内最快) # 主要镜像源(根据网络检测结果选择)
deb $primary_mirror/ubuntu/ ${codename} main restricted universe multiverse
deb $primary_mirror/ubuntu/ ${codename}-security main restricted universe multiverse
deb $primary_mirror/ubuntu/ ${codename}-updates main restricted universe multiverse
deb $primary_mirror/ubuntu/ ${codename}-proposed main restricted universe multiverse
deb $primary_mirror/ubuntu/ ${codename}-backports main restricted universe multiverse
# 备用镜像源(按速度排序)
deb https://mirrors.aliyun.com/ubuntu/ ${codename} main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ ${codename} main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ ${codename}-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ ${codename}-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ ${codename}-proposed main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ ${codename}-backports main restricted universe multiverse
# 2. 腾讯云镜像源(备用)
deb https://mirrors.cloud.tencent.com/ubuntu/ ${codename} main restricted universe multiverse deb https://mirrors.cloud.tencent.com/ubuntu/ ${codename} main restricted universe multiverse
deb https://mirrors.cloud.tencent.com/ubuntu/ ${codename}-security main restricted universe multiverse
deb https://mirrors.cloud.tencent.com/ubuntu/ ${codename}-updates main restricted universe multiverse
deb https://mirrors.cloud.tencent.com/ubuntu/ ${codename}-proposed main restricted universe multiverse
deb https://mirrors.cloud.tencent.com/ubuntu/ ${codename}-backports main restricted universe multiverse
# 3. 华为云镜像源(备用)
deb https://mirrors.huaweicloud.com/ubuntu/ ${codename} main restricted universe multiverse deb https://mirrors.huaweicloud.com/ubuntu/ ${codename} main restricted universe multiverse
deb https://mirrors.huaweicloud.com/ubuntu/ ${codename}-security main restricted universe multiverse
deb https://mirrors.huaweicloud.com/ubuntu/ ${codename}-updates main restricted universe multiverse
deb https://mirrors.huaweicloud.com/ubuntu/ ${codename}-proposed main restricted universe multiverse
deb https://mirrors.huaweicloud.com/ubuntu/ ${codename}-backports main restricted universe multiverse
# 4. 中科大镜像源(备用)
deb https://mirrors.ustc.edu.cn/ubuntu/ ${codename} main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu/ ${codename} main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ ${codename}-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ ${codename}-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ ${codename}-proposed main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ ${codename}-backports main restricted universe multiverse
# 5. 清华大学镜像源(备用)
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${codename} main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${codename} main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${codename}-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${codename}-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${codename}-proposed main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${codename}-backports main restricted universe multiverse
# 源码镜像源(使用阿里云,速度最快) # 源码镜像源
deb-src https://mirrors.aliyun.com/ubuntu/ ${codename} main restricted universe multiverse deb-src $primary_mirror/ubuntu/ ${codename} main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ ${codename}-security main restricted universe multiverse deb-src $primary_mirror/ubuntu/ ${codename}-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ ${codename}-updates main restricted universe multiverse deb-src $primary_mirror/ubuntu/ ${codename}-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ ${codename}-proposed main restricted universe multiverse deb-src $primary_mirror/ubuntu/ ${codename}-proposed main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ ${codename}-backports main restricted universe multiverse deb-src $primary_mirror/ubuntu/ ${codename}-backports main restricted universe multiverse
EOF EOF
log_success "APT镜像源配置完成" log_success "APT镜像源配置完成 (主镜像源: $primary_mirror)"
} }
# 日志函数 # 日志函数
@ -452,21 +471,21 @@ install_nodejs() {
if [ ! -d "/home/jingrow/.nvm" ]; then if [ ! -d "/home/jingrow/.nvm" ]; then
log_info "下载并安装nvm..." log_info "下载并安装nvm..."
# 尝试多个NVM下载源按优先级排序国内镜像优先 # 使用更快的国内镜像源避免GitHub连接问题
local nvm_install_success=false local nvm_install_success=false
local nvm_sources=( local nvm_sources=(
"https://gitee.com/mirrors/nvm/raw/v0.40.3/install.sh" "https://gitee.com/mirrors/nvm/raw/v0.40.3/install.sh"
"https://cdn.jsdelivr.net/gh/nvm-sh/nvm@v0.40.3/install.sh"
"https://npmmirror.com/mirrors/nvm/v0.40.3/install.sh" "https://npmmirror.com/mirrors/nvm/v0.40.3/install.sh"
"https://mirrors.ustc.edu.cn/nvm/v0.40.3/install.sh" "https://mirrors.ustc.edu.cn/nvm/v0.40.3/install.sh"
"https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh" "https://mirrors.tuna.tsinghua.edu.cn/nvm/v0.40.3/install.sh"
"https://cdn.jsdelivr.net/gh/nvm-sh/nvm@v0.40.3/install.sh"
) )
for nvm_source in "${nvm_sources[@]}"; do for nvm_source in "${nvm_sources[@]}"; do
log_info "尝试从 $nvm_source 下载nvm..." log_info "尝试从 $nvm_source 下载nvm..."
# 设置较短的超时时间,避免长时间等待 # 使用更短的超时时间和更快的下载设置
if su - jingrow -c "curl -fsSL --connect-timeout 10 --max-time 60 '$nvm_source' | bash"; then if su - jingrow -c "curl -fsSL --connect-timeout 5 --max-time 30 --retry 2 --retry-delay 1 '$nvm_source' | bash"; then
log_success "nvm安装完成 (来源: $nvm_source)" log_success "nvm安装完成 (来源: $nvm_source)"
nvm_install_success=true nvm_install_success=true
break break
@ -476,7 +495,39 @@ install_nodejs() {
done done
if [ "$nvm_install_success" = false ]; then if [ "$nvm_install_success" = false ]; then
log_error "所有NVM下载源都失败请检查网络连接" log_error "所有NVM下载源都失败尝试使用离线安装方式..."
# 离线安装方式直接下载nvm压缩包
log_info "尝试离线安装方式..."
local offline_sources=(
"https://gitee.com/mirrors/nvm/archive/v0.40.3.tar.gz"
"https://npmmirror.com/mirrors/nvm/v0.40.3/nvm-0.40.3.tar.gz"
)
for offline_source in "${offline_sources[@]}"; do
log_info "尝试下载nvm压缩包: $offline_source"
if su - jingrow -c "
cd /tmp
curl -fsSL --connect-timeout 5 --max-time 30 --retry 2 '$offline_source' -o nvm.tar.gz
"; then
log_info "nvm压缩包下载成功开始解压安装..."
if su - jingrow -c "
cd /tmp
tar -xzf nvm.tar.gz
mv nvm-0.40.3 /home/jingrow/.nvm
chown -R jingrow:jingrow /home/jingrow/.nvm
rm -f nvm.tar.gz
"; then
log_success "nvm离线安装完成"
nvm_install_success=true
break
fi
fi
done
fi
if [ "$nvm_install_success" = false ]; then
log_error "所有NVM安装方式都失败请检查网络连接或手动安装"
return 1 return 1
fi fi
else else
@ -485,14 +536,55 @@ install_nodejs() {
# 加载nvm并安装node.js # 加载nvm并安装node.js
log_info "安装Node.js v$NODE_VERSION..." log_info "安装Node.js v$NODE_VERSION..."
# 配置nvm使用国内镜像源提高下载速度
log_info "配置nvm使用国内镜像源..."
su - jingrow -c " su - jingrow -c "
export NVM_DIR=\"\$HOME/.nvm\" export NVM_DIR=\"\$HOME/.nvm\"
[ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\"
nvm install $NODE_VERSION
nvm use $NODE_VERSION # 设置nvm使用国内镜像源
nvm alias default $NODE_VERSION export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/
export NVM_IOJS_ORG_MIRROR=https://npmmirror.com/mirrors/iojs/
# 显示配置信息
echo 'NVM镜像源配置:'
echo ' Node.js: \$NVM_NODEJS_ORG_MIRROR'
echo ' io.js: \$NVM_IOJS_ORG_MIRROR'
" "
log_info "开始下载和安装Node.js v$NODE_VERSION (这可能需要几分钟)..."
if su - jingrow -c "
export NVM_DIR=\"\$HOME/.nvm\"
[ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\"
# 设置nvm使用国内镜像源
export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/
export NVM_IOJS_ORG_MIRROR=https://npmmirror.com/mirrors/iojs/
# 安装Node.js使用更快的下载设置
nvm install $NODE_VERSION --latest-npm
"; then
log_success "Node.js v$NODE_VERSION 下载完成"
log_info "配置Node.js环境..."
su - jingrow -c "
export NVM_DIR=\"\$HOME/.nvm\"
[ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\"
nvm use $NODE_VERSION
nvm alias default $NODE_VERSION
# 验证安装
echo 'Node.js版本:'
node -v
echo 'npm版本:'
npm -v
"
else
log_error "Node.js安装失败"
return 1
fi
# 配置npm使用国内镜像源按优先级排序 # 配置npm使用国内镜像源按优先级排序
log_info "配置npm使用国内镜像源..." log_info "配置npm使用国内镜像源..."
su - jingrow -c " su - jingrow -c "
@ -617,34 +709,33 @@ install_pm2() {
# 设置PM2开机自启 # 设置PM2开机自启
log_info "配置PM2开机自启..." log_info "配置PM2开机自启..."
# 获取PM2 startup命令的输出避免交互式阻塞 # 直接执行PM2 startup命令创建systemd服务文件
local startup_output=$(su - jingrow -c " log_info "执行PM2 startup命令创建systemd服务..."
su - jingrow -c "
export NVM_DIR=\"\$HOME/.nvm\" export NVM_DIR=\"\$HOME/.nvm\"
[ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\"
pm2 startup 2>&1 pm2 startup systemd -u jingrow --hp /home/jingrow
" 2>/dev/null) "
# 检查是否成功生成systemd服务 # 检查服务文件是否创建成功
if echo "$startup_output" | grep -q "systemd"; then if [ -f "/etc/systemd/system/pm2-jingrow.service" ]; then
log_success "PM2 systemd服务文件生成成功" log_success "PM2 systemd服务文件创建成功"
# 提取systemd命令并执行避免交互式提示 # 启用systemd服务
local systemd_cmd=$(echo "$startup_output" | grep -E "sudo.*systemctl" | head -1) log_info "启用PM2 systemd服务..."
if [ -n "$systemd_cmd" ]; then systemctl enable pm2-jingrow
log_info "执行systemd命令: $systemd_cmd" if [ $? -eq 0 ]; then
# 移除sudo前缀因为当前已经是root用户 log_success "PM2 systemd服务已启用"
local clean_cmd=$(echo "$systemd_cmd" | sed 's/^sudo //') else
if eval "$clean_cmd" 2>/dev/null; then log_warning "PM2 systemd服务启用失败"
log_success "PM2 systemd服务启用成功"
else
log_warning "PM2 systemd服务启用失败请手动执行: $systemd_cmd"
fi
fi fi
elif echo "$startup_output" | grep -q "init.d"; then
log_success "PM2 init.d脚本生成成功" # 重新加载systemd配置
systemctl daemon-reload
log_success "systemd配置已重新加载"
else else
log_warning "PM2开机启动配置可能失败输出: $startup_output" log_warning "PM2 systemd服务文件创建失败"
log_info "请手动执行: su - jingrow -c 'pm2 startup'" log_info "请手动执行: su - jingrow -c 'pm2 startup systemd -u jingrow --hp /home/jingrow'"
fi fi
} }