Alibaba Cloud Linux 3.2104 LTS 服务器部署全流程

Alibaba Cloud Linux 3.2104 LTS 服务器部署全流程

一键安装 Nginx + Redis + OpenJDK 17 + Maven,并提供自动化打包发版脚本


📌 系统信息确认

cat /etc/os-release

预期输出包含:

NAME="Alibaba Cloud Linux"
VERSION="3.2104 LTS (Soaring Falcon)"
ID="alinux"
...

✅ Alibaba Cloud Linux 3 基于 RHEL/CentOS 8,使用 dnf(或兼容 yum)作为包管理器。


🔧 第一步:系统初始化

# 更新系统
sudo dnf update -y

# 安装常用工具
sudo dnf install -y curl wget git vim bash-completion

📦 第二步:安装 OpenJDK 17

# 安装 OpenJDK 17(Alibaba Cloud Linux 3 官方源已包含)
sudo dnf install -y java-17-openjdk-devel

# 验证
java -version
javac -version

设置 JAVA_HOME(全局)

# 查找 JDK 路径
ls /usr/lib/jvm/

# 通常路径为:/usr/lib/jvm/java-17-openjdk-17.x.x.x-x.al8.x86_64
# 使用 alternatives 获取标准路径
sudo alternatives --install /usr/bin/java java /usr/lib/jvm/java-17-openjdk/bin/java 1700
sudo alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-17-openjdk/bin/javac 1700

# 设置环境变量
echo 'export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))' | sudo tee -a /etc/profile.d/java.sh
echo 'export PATH=$JAVA_HOME/bin:$PATH' | sudo tee -a /etc/profile.d/java.sh

# 生效
source /etc/profile.d/java.sh
echo $JAVA_HOME

📦 第三步:安装 Maven

# 下载最新版 Maven(截至 2025 年,推荐 3.9+)
MAVEN_VERSION=3.9.11
cd /tmp
wget https://dlcdn.apache.org/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz

# 解压到 /opt
sudo tar -xzf apache-maven-${MAVEN_VERSION}-bin.tar.gz -C /opt
sudo ln -s /opt/apache-maven-${MAVEN_VERSION} /opt/maven

# 设置环境变量
cat <<EOF | sudo tee /etc/profile.d/maven.sh
export MAVEN_HOME=/opt/maven
export PATH=\$MAVEN_HOME/bin:\$PATH
EOF

# 生效
source /etc/profile.d/maven.sh
mvn -v

📦 第四步:安装 Redis

# Alibaba Cloud Linux 3 支持直接安装 Redis
sudo dnf install -y redis

# 启动并设置开机自启
sudo systemctl enable redis --now
sudo systemctl status redis

(可选)配置 Redis 密码(安全加固)

# 编辑配置文件
sudo sed -i 's/^# requirepass .*/requirepass YourRedisPassword123!/' /etc/redis.conf

# 重启生效
sudo systemctl restart redis

⚠️ 记下密码,后续 Java 应用需配置。


📦 第五步:安装 Nginx

# 安装 Nginx
sudo dnf install -y nginx

# 启动并设置开机自启
sudo systemctl enable nginx --now
sudo systemctl status nginx

配置防火墙(如果启用)

# Alibaba Cloud Linux 默认使用 firewalld
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

💡 阿里云还需在 安全组 中放行 80/443 端口。


🛠 第六步:创建项目目录结构

# 创建工作目录
sudo mkdir -p /opt/apps/myapp
sudo chown -R $(whoami):$(whoami) /opt/apps/myapp

cd /opt/apps/myapp
mkdir -p {src,logs,backup}

🚀 第七步:编写一键打包发版脚本

文件:/opt/apps/myapp/deploy.sh

#!/bin/bash
set -e

# ================== 配置区 ==================
APP_NAME="myapp"
GIT_REPO="https://github.com/yourname/your-repo.git"  # 替换为你的 Git 仓库
BRANCH="main"
JAR_NAME="app.jar"               # 构建后生成的 jar 名
SERVICE_NAME="myapp"
PORT=8080

# 目录
BASE_DIR="/opt/apps/myapp"
SRC_DIR="$BASE_DIR/src"
LOG_DIR="$BASE_DIR/logs"
BACKUP_DIR="$BASE_DIR/backup"

# 日志文件
LOG_FILE="$LOG_DIR/deploy_$(date +%Y%m%d_%H%M%S).log"

# ================== 函数定义 ==================
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

error_exit() {
    log "❌ 错误: $1"
    exit 1
}

# ================== 主流程 ==================

log "🚀 开始部署 $APP_NAME"

# 1. 创建日志目录
mkdir -p "$LOG_DIR" "$BACKUP_DIR"

# 2. 拉取最新代码
log "📥 拉取代码..."
if [ ! -d "$SRC_DIR/.git" ]; then
    git clone "$GIT_REPO" "$SRC_DIR"
else
    cd "$SRC_DIR"
    git fetch
    git checkout "$BRANCH"
    git pull origin "$BRANCH"
fi

# 3. Maven 打包
log "📦 Maven 打包中..."
cd "$SRC_DIR"
mvn clean package -DskipTests

# 4. 备份旧版本
if [ -f "$BASE_DIR/$JAR_NAME" ]; then
    log "💾 备份旧版本..."
    cp "$BASE_DIR/$JAR_NAME" "$BACKUP_DIR/${JAR_NAME}.$(date +%Y%m%d_%H%M%S)"
fi

# 5. 复制新 jar
cp "$SRC_DIR/target/${JAR_NAME}" "$BASE_DIR/" || error_exit "找不到 target/${JAR_NAME}"

# 6. 重载 systemd 服务(首次需创建)
if [ ! -f "/etc/systemd/system/$SERVICE_NAME.service" ]; then
    log "⚙️ 首次部署:创建 systemd 服务..."
    cat > "/tmp/${SERVICE_NAME}.service" <<EOF
[Unit]
Description=$APP_NAME Service
After=network.target redis.service

[Service]
Type=simple
User=$(whoami)
WorkingDirectory=$BASE_DIR
ExecStart=/usr/bin/java -jar $BASE_DIR/$JAR_NAME
Restart=always
RestartSec=10
Environment=JAVA_HOME=/usr/lib/jvm/java-17-openjdk
Environment=SPRING_PROFILES_ACTIVE=prod

[Install]
WantedBy=multi-user.target
EOF
    sudo mv "/tmp/${SERVICE_NAME}.service" "/etc/systemd/system/"
    sudo systemctl daemon-reload
fi

# 7. 重启服务
log "🔄 重启服务..."
sudo systemctl restart "$SERVICE_NAME"
sudo systemctl enable "$SERVICE_NAME"

# 8. 检查状态
sleep 3
if sudo systemctl is-active --quiet "$SERVICE_NAME"; then
    log "✅ 部署成功!服务正在运行。"
    log "应用查看日志: journalctl -u $SERVICE_NAME -f"
else
    error_exit "服务启动失败,请检查日志。"
fi

log "📄 本次部署日志: $LOG_FILE"

赋予执行权限

chmod +x /opt/apps/myapp/deploy.sh

▶️ 第八步:首次部署与测试

# 首次运行(会自动创建 systemd 服务)
cd /opt/apps/myapp
./deploy.sh

查看服务状态

systemctl status myapp
journalctl -u myapp -f

🌐 第九步:配置 Nginx 反向代理(可选)

编辑 Nginx 配置:

sudo vim /etc/nginx/conf.d/myapp.conf

内容:

server {
    listen 80;
    server_name your-domain.com;  # 或服务器公网IP

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

重载 Nginx:

sudo nginx -t && sudo systemctl reload nginx

🔒 安全建议

  1. 不要使用 root 运行 Java 服务 → 脚本中已使用当前用户

  2. Redis 设置密码 → 见第四步

  3. 阿里云安全组:仅开放 22、80、443 端口

  4. 定期更新系统

    sudo dnf update -y
    

📎 附录:常用命令速查

功能 命令
查看 Java 版本 java -version
查看 Maven 版本 mvn -v
启动 Redis sudo systemctl start redis
启动 Nginx sudo systemctl start nginx
查看应用日志 journalctl -u myapp -f
手动打包 cd /opt/apps/myapp/src && mvn clean package -DskipTests

✅ 补充:安装 Git

在执行部署脚本前,请先安装 Git:

# 安装 Git(Alibaba Cloud Linux 3 使用 dnf)
sudo dnf install -y git

# 验证安装
git --version

预期输出类似:

git version 2.39.3

💡 建议将 Git 安装加入系统初始化步骤,以下是更新后的完整初始化命令:


🔧 更新后的【系统初始化】步骤(含 Git)

# 1. 更新系统
sudo dnf update -y

# 2. 安装基础工具(含 Git)
sudo dnf install -y curl wget git vim bash-completion tar

# 3. 验证关键命令
which java git mvn nginx redis-server || echo "部分工具尚未安装(正常)"

📌 为什么需要 Git?

  • 部署脚本通过 git clone / git pull 从远程仓库(如 GitHub、GitLab、阿里云 Code)获取源码

  • 如果不安装 Git,脚本会在

    git clone
    

    步骤报错:

    ./deploy.sh: line XX: git: command not found
    

✅ 最终确认清单(部署前)

运行以下命令,确保所有依赖已安装:

java -version    # 应显示 OpenJDK 17
mvn -v           # 应显示 Maven 3.9+
git --version    # 应显示 Git 2.x+
nginx -v         # 应显示 nginx version
redis-cli PING   # 应返回 PONG(若 Redis 已启动)

全部通过后,再运行 ./deploy.sh 即可拉取代码并部署。

✅ 一、查询 Redis 服务运行状态

方法 1:使用 systemctl(推荐)

sudo systemctl status redis

✅ 正常运行时会显示:

● redis.service - Redis persistent key-value database
     Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; preset: disabled)
     Active: active (running) since Mon 2025-12-15 20:00:00 CST; 1h ago
   Main PID: 1234 (redis-server)
      Tasks: 4 (limit: 4915)
     Memory: 2.1M
     CGroup: /system.slice/redis.service
             └─1234 /usr/bin/redis-server 127.0.0.1:6379
  • Active: active (running) → 表示服务正在运行
  • 如果是 inactive (dead) → 服务未启动

🔧 启动命令(如果未运行):

sudo systemctl start redis
sudo systemctl enable redis  # 设置开机自启

✅ 二、检查 6379 端口是否监听

方法 1:使用 ss(现代推荐工具)

sudo ss -tulnp | grep ':6379'

✅ 正常输出示例:

tcp  LISTEN 0 128 127.0.0.1:6379 0.0.0.0:* users:(("redis-server",pid=1234,fd=6))
  • 127.0.0.1:6379 → 仅本地可访问(默认安全配置)
  • 0.0.0.0:6379 → 所有 IP 可访问(需确认是否故意开放)

方法 2:使用 netstat(若已安装)

# 先安装 net-tools(Alibaba Cloud Linux 3 默认可能未装)
sudo dnf install -y net-tools

# 查询端口
sudo netstat -tulnp | grep ':6379'

输出含义同上。


方法 3:使用 lsof(可选)

sudo dnf install -y lsof
sudo lsof -i :6379

✅ 三、测试 Redis 是否可连接

本地连接测试:

redis-cli PING
  • 返回 PONG → 服务正常响应

  • 若设置了密码,需先认证:

    redis-cli
    127.0.0.1:6379> AUTH your_password
    OK
    127.0.0.1:6379> PING
    PONG
    

🛡 四、安全提示:Redis 监听地址说明

  • 默认配置 /etc/redis.conf 中:

    bind 127.0.0.1
    protected-mode yes
    

    只允许本机访问,这是安全的。

  • 如果你的 Java 应用和 Redis 在同一台服务器,无需修改。

  • 如果 Java 应用在其他服务器,才需要:

    1. 修改 bind 为内网 IP 或 0.0.0.0(不推荐公网暴露)
    2. 设置强密码(requirepass
    3. 配置阿里云安全组,仅允许可信 IP 访问 6379 端口

⚠️ 切勿将 Redis 直接暴露到公网! 曾导致大量数据泄露事件。


🔍 总结:快速诊断命令

# 1. 服务是否运行?
sudo systemctl is-active redis

# 2. 6379 是否监听?
sudo ss -ltn | grep ':6379'

# 3. 能否本地连接?
redis-cli PING

三条命令全部通过 → Redis 正常可用

posted @ 2025-12-15 22:28  Sappy  阅读(3)  评论(0)    收藏  举报