当前位置: 首页 > news >正文

宝塔面板+CentOS 7.9保姆级教程:从零部署HOJ在线判题系统(含域名HTTPS配置)

宝塔面板+CentOS 7.9保姆级教程:从零部署HOJ在线判题系统(含域名HTTPS配置)

对于想要搭建私有在线编程练习平台的个人开发者或小型团队来说,HOJ(Hust Online Judge)是一个功能完善且易于二次开发的开源判题系统。本文将手把手教你如何通过宝塔面板这一可视化工具,在CentOS 7.9系统上完成从环境准备到域名配置的全流程部署。

1. 环境准备与基础配置

在开始部署之前,我们需要确保服务器满足HOJ运行的基本要求。推荐使用至少2核CPU、4GB内存的云服务器,系统盘空间不小于50GB。如果你的服务器配置较低,可能需要调整部分参数以获得更好的性能。

首先,登录你的CentOS 7.9服务器,执行以下命令更新系统并安装必要组件:

yum update -y yum install -y wget curl git unzip

接下来,我们需要安装宝塔面板。宝塔提供了极其友好的Web界面,大大简化了服务器管理流程。运行以下命令一键安装最新版宝塔面板:

curl -sSO http://download.bt.cn/install/install_panel.sh && bash install_panel.sh

安装完成后,终端会显示面板访问地址、用户名和初始密码。记下这些信息,然后在浏览器中访问面板地址。首次登录后,系统会提示你安装推荐的运行环境套件。

提示:出于安全考虑,强烈建议在首次登录后立即修改默认的宝塔面板端口和密码。

在宝塔面板的"软件商店"中,我们需要安装以下组件:

  • Nginx 1.20+
  • MySQL 5.7+
  • PHP 7.4(虽然HOJ主要使用Java,但部分功能可能需要PHP支持)
  • PM2管理器(用于管理Node.js进程)
  • Docker管理器(HOJ的判题服务基于Docker运行)

2. HOJ核心服务部署

HOJ系统由多个组件构成,包括前端界面、后端API服务和判题服务。我们将分步骤安装这些组件。

2.1 数据库配置

首先在宝塔面板中创建HOJ所需的数据库:

  1. 进入"数据库"选项卡,点击"添加数据库"
  2. 填写数据库名(如hoj),用户名和密码
  3. 字符集选择utf8mb4以支持完整的Unicode字符
  4. 权限设置为"本地服务器"

创建完成后,我们需要导入HOJ的初始数据库结构。下载HOJ官方提供的SQL文件:

wget https://gitee.com/himitzh0730/hoj/raw/master/hoj.sql -O /www/backup/hoj.sql

然后通过宝塔的"数据库"管理界面导入这个SQL文件到刚才创建的数据库中。

2.2 后端服务部署

HOJ的后端基于Spring Boot开发,我们可以直接从GitHub或Gitee获取最新代码:

cd /www/wwwroot git clone https://gitee.com/himitzh0730/hoj.git

克隆完成后,进入项目目录配置后端服务:

cd hoj/backend cp application.yml.example application.yml nano application.yml

在配置文件中,需要修改以下关键参数:

  • spring.datasource部分:填写之前创建的数据库连接信息
  • judge.token:设置一个安全的判题服务通信令牌
  • email部分:配置SMTP邮件服务(用于用户注册和密码找回)

保存配置后,使用Maven构建项目:

mvn clean package -DskipTests

构建完成后,生成的jar包位于target目录下。我们可以使用宝塔的"PM2管理器"来管理这个Java服务:

  1. 在PM2管理器中点击"添加项目"
  2. 项目路径选择/www/wwwroot/hoj/backend/target/hoj-backend.jar
  3. 启动方式选择"Java"
  4. 点击"添加"启动服务

2.3 前端服务部署

HOJ的前端基于Vue.js开发,部署前需要先安装Node.js环境。在宝塔面板中:

  1. 打开"PM2管理器"
  2. 切换到"Node版本"选项卡
  3. 安装Node.js 14.x或更高版本

然后进入前端目录进行构建:

cd /www/wwwroot/hoj/web npm install npm run build

构建完成后,生成的静态文件会放在dist目录中。我们需要在宝塔面板中创建一个新的网站来托管这些文件:

  1. 进入"网站"选项卡,点击"添加站点"
  2. 填写域名(如果没有域名可暂时使用服务器IP)
  3. 根目录指向/www/wwwroot/hoj/web/dist
  4. 其他设置保持默认

3. 判题服务配置

HOJ的判题服务运行在Docker容器中,这是确保代码执行环境隔离和安全的关键组件。首先确保宝塔的Docker管理器已正确安装并运行。

然后创建判题服务的配置文件:

mkdir -p /etc/hoj/judge nano /etc/hoj/judge/docker-config.yml

配置文件内容示例:

judge: server: name: judge-server host: localhost port: 8088 token: your_secure_token_here # 需与后端配置一致

启动判题服务容器:

docker run -d \ --name hoj-judge \ -v /etc/hoj/judge:/config \ -v /var/hoj/judge:/judge \ -p 8088:8088 \ --restart always \ registry.cn-shanghai.aliyuncs.com/hoj/judge

在宝塔面板的"安全"选项卡中,确保以下端口已放行:

  • 80/443(HTTP/HTTPS)
  • 8080(后端API)
  • 8088(判题服务)
  • 3306(MySQL,建议仅限本地访问)

4. 域名与HTTPS配置

为你的HOJ系统配置域名和HTTPS可以提升安全性和专业性。假设你已经有一个域名并解析到了服务器IP。

在宝塔面板中:

  1. 进入"网站"选项卡,找到之前创建的HOJ站点
  2. 点击"设置",选择"SSL"
  3. 选择"Let's Encrypt"免费证书
  4. 勾选要申请的域名和"强制HTTPS"选项
  5. 点击"申请"

证书申请成功后,我们需要配置Nginx反向代理,使前端能够访问后端API。编辑站点的Nginx配置文件,在server块中添加以下内容:

location /api/ { proxy_pass http://localhost: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; } location /judge/ { proxy_pass http://localhost:8088/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }

保存配置后重启Nginx服务。现在你的HOJ系统应该可以通过HTTPS访问了。

5. 系统初始化与测试

首次访问你的HOJ系统时,需要使用默认管理员账号登录:

  • 用户名:hoj
  • 密码:hoj123456

登录后立即修改管理员密码,然后进行以下基本配置:

  1. 系统设置:配置站点名称、LOGO、备案信息等
  2. 判题机管理:确认判题服务状态为"正常"
  3. 邮件配置:设置SMTP服务以启用用户注册和密码找回功能
  4. 题目导入:可以通过后台批量导入题目

为了测试系统是否正常工作,可以尝试:

  1. 注册一个新用户
  2. 创建或导入一个简单的编程题目(如A+B Problem)
  3. 提交代码验证判题功能是否正常

6. 常见问题排查

在部署过程中可能会遇到一些问题,以下是几个常见问题的解决方法:

判题服务无法连接

  • 检查judge.token在后端和判题服务配置中是否一致
  • 确保8088端口已开放且未被防火墙拦截
  • 查看判题容器日志:docker logs hoj-judge

前端无法访问API

  • 确认Nginx反向代理配置正确
  • 检查后端服务是否正常运行:pm2 list
  • 查看后端日志:pm2 logs hoj-backend

数据库连接问题

  • 确认MySQL用户有远程连接权限(如果前后端分离部署)
  • 检查application.yml中的数据库连接信息
  • 确保MySQL的max_connections设置足够大

性能优化建议

  • 对于高并发场景,考虑增加判题服务实例:docker-compose scale judge=3
  • 调整MySQL的缓冲池大小:innodb_buffer_pool_size = 1G(根据内存调整)
  • 启用Nginx的gzip压缩和静态文件缓存

7. 二次开发与扩展

HOJ系统具有良好的扩展性,可以根据需要进行二次开发。以下是一些常见的定制方向:

前端定制

  • 修改/web/src中的Vue组件来调整界面
  • 更新/web/public中的静态资源(如LOGO、favicon)
  • 调整主题颜色:修改/web/src/styles/variables.scss

后端功能扩展

  • 添加新的API接口:在/backend/src/main/java相应包中创建新类
  • 修改业务逻辑:调整service层代码
  • 添加新的数据库表:创建Flyway迁移脚本

判题语言支持

  • 添加新的编程语言:修改判题服务的/judge/languages配置
  • 调整资源限制:更新/judge/config中的限制参数

开发完成后,重新构建并部署相应组件即可生效。建议在本地开发环境进行修改和测试,然后再部署到生产服务器。

http://www.jsqmd.com/news/646518/

相关文章:

  • TEKLauncher深度解析:如何打造ARK生存进化终极启动器
  • MySQL三级模式结构实战:从外模式到内模式的完整解析(附常见面试题)
  • 大模型的工程原理 第1章 初识大模型
  • Qwen2.5-VL图像预处理实战:从源码到Patch切分的完整流程解析
  • 保姆级教程:HBuilderX + DevEco Studio 4.1.1 搞定 uni-app x 鸿蒙调试证书(含CSR文件生成避坑点)
  • MD380与MD500变频器源码解析:高效转子电阻与漏感辨识方法,适用于TMS320F系列处理器
  • ROS Melodic复合机器人仿真:如何用MoveIt!与Arbotix解决机械臂抓取放置的‘最后一厘米’难题
  • 胡桃工具箱完整使用指南:从新手到高手的终极原神辅助工具
  • LangGraph实战:用SQLite和InMemoryStore给你的AI助手加上短期与长期记忆(附完整代码)
  • Python与AKShare实战:构建A股板块轮动监测系统
  • 家庭宽带+旧电脑也能赚钱?手把手教你搭建24小时挂机副业
  • springboot酒店管理系统小程序(文档+源码)_kaic
  • TypeScript的infer推断联合类型的分布条件类型
  • 【多模态大模型容灾备份黄金标准】:20年AI基础设施专家亲授3层异构备份架构与RTO<2分钟实战方案
  • OpenModelica进阶技巧:如何导入第三方库并运行ExothermicReaction案例
  • 电子工程师必看:深度负反馈电路的5个实战应用技巧(附电路图)
  • 告别复杂操作!Win11 OpenClaw一键部署,本地AI自动干活,小白也能上手
  • Jellyfin Android TV客户端版本兼容性终极指南:如何解决连接失败问题
  • 射频工程师的脚本利器:如何用Matlab自动处理ADS仿真数据,优化双输入Doherty功放性能
  • 基于ECMS的混合动力汽车Simulink模型:能量管理研究之利器
  • SQL如何简化长SQL子查询结构_利用CTE公用表表达式优化
  • AI设计助手真能替代UI/UX设计师?2026奇点大会实测数据揭示人机协同临界点
  • AI爆火!产品经理的逆袭之路:掌握这5大技能,升职加薪不是梦!
  • 别再死记硬背了!用Java Socket写一个能翻译的UDP词典服务器(附完整源码)
  • OfflineInsiderEnroll:无需微软账户,Windows预览版体验终极方案
  • HGDB创建只读用户
  • 多模态LLM推理链路混沌实验全记录,深度复现跨模态对齐失效、特征坍缩与token洪水攻击
  • 从零搭建飞控仿真:手把手教你用Simulink实现姿态角速度到机体角速度的转换模块
  • GD32H7 SPI驱动实战:手把手教你用SPI3连接外部Flash(W25Q128)并实现读写
  • 2026奇点智能技术大会前瞻(全球仅8家获准接入的新闻生成API首次披露)