阿里云 ECS 从零部署 JPress 实战手册:多站点与 Nginx 全攻略

2022-08-18 12:00
78
0

本文将记录如何在阿里云空的 ECS 服务器上(镜像:aliyun_4_x64),不使用 Docker,从零开始搭建 Java 运行环境,并利用 Nginx 实现多域名指向及验证文件配置。

一、 环境准备:JDK 17 与 MySQL

JPress 5.x 版本需要 Java 17 支持。虽然阿里云可能预装了 JDK 8,但我们必须切换到版本 17。

1. 安装并切换 JDK 17

# 安装 Dragonwell 17 (阿里云优化版 JDK)
sudo yum install java-17-alibaba-dragonwell-devel -y

# 切换系统默认 Java 版本
sudo alternatives --config java
# 在弹出的列表中选择 Java 17 对应的编号

2. 安装与配置 MySQL 8.0

# 安装 MySQL
sudo yum install mysql-server -y
sudo systemctl start mysqld
sudo systemctl enable mysqld

# 初始化数据库并创建账户
mysql -u root -p
# 执行以下 SQL
CREATE DATABASE senje DEFAULT CHARACTER SET utf8mb4;
CREATE USER 'senje_user'@'localhost' IDENTIFIED BY '您的强密码';
GRANT ALL PRIVILEGES ON senje.* TO 'senje_user'@'localhost';
FLUSH PRIVILEGES;

二、 编译与获取 JPress 运行包

由于官方 Gitee 可能仅提供源码,我们需要手动编译出完整的运行包(Fat Jar/Zip)。

1. 安装 Maven 并编译

sudo yum install maven -y
cd /www/wwwroot/site-source
sudo mvn clean package -Dmaven.test.skip=true

2. 提取运行包

编译成功后,在 starter/target/ 目录下会生成一个约 130MB 的 .zip 文件。这才是包含所有依赖的完整包。

# 解压到运行目录
unzip starter/target/starter-5.0.zip -d /www/wwwroot/site1/

三、 实现多站点部署:端口隔离

若要在一台服务器运行多个网站,必须通过端口区分不同的 Java 进程。

1. 修改站点端口

进入 config 目录,修改 jboot.properties 或 undertow.txt:

站点 A (site1): 保持默认 8080。

站点 B (site2): 修改 undertow.port=8081。

2. 启动进程

使用 nohup 配合 Classpath 模式启动,确保进程在后台持续运行:

# 启动第一个站
cd /www/wwwroot/site1
nohup java -Dfile.encoding=utf-8 -cp "config:lib/*" io.jpress.Starter --server.port=8080 > site1.log 2>&1 &

# 启动第二个站
cd /www/wwwroot/site2
nohup java -Dfile.encoding=utf-8 -cp "config:lib/*" io.jpress.Starter --server.port=8081 > site2.log 2>&1 &

四、 Nginx 核心配置:多域名与验证文件

这是实现“多网站指向”和“根目录放验证文件”的关键步骤。

1. 动静分离逻辑

我们将 Nginx 作为流量入口。当访问 baidu_verify.html 等验证文件时,Nginx 直接读取本地目录;当访问业务页面时,转发给 Java 端口。

2. 配置文件示例 (/etc/nginx/conf.d/senje.conf)

server {
    listen 80;
    server_name www.site1.com; # 您的域名

    # 验证文件物理存放路径
    root /www/wwwroot/site1/public;

    location / {
        # 核心:优先找本地静态文件,找不到再转给 JPress
        try_files $uri @jpress;
    }

    location @jpress {
        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;
    }
}

五、 常见问题排查(避坑指南)

502 Bad Gateway: 通常是 Java 进程没启动成功。检查 tail -f site.log,看是否报 port 8080 not available。

连接超时 (Timed Out): 检查阿里云控制台的安全组,必须放行入方向的 TCP 80 端口。

无法读取 Jar 包: 确保解压的是 130MB 左右的完整包,而不是 9KB 的代码包。

验证文件 404: 确保 Nginx 的 root 路径准确指向了存放 .html 文件的 public 文件夹。

六、 总结

通过 Nginx + 多 Undertow 实例 的架构,我们不仅实现了资源的高效利用,还通过 try_files 指令完美解决了各大搜索引擎验证文件的放置问题。