阿里云 ECS 从零部署 JPress 实战手册:多站点与 Nginx 全攻略
本文将记录如何在阿里云空的 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 指令完美解决了各大搜索引擎验证文件的放置问题。