CentOS 7下使用宝塔面板搭建HOJ在线判题系统
1. 项目概述与背景HOJ作为一款开源的在线判题系统在编程竞赛和算法训练领域有着广泛应用。基于CentOS系统配合宝塔面板搭建HOJ的方案因其操作便捷性受到许多技术爱好者的青睐。本次搭建的核心在于数据库配置和关键脚本的实现这是确保判题系统稳定运行的基础架构。在CentOS 7环境下我们选择宝塔面板作为运维管理工具它能显著降低服务器环境配置的复杂度。数据库部分采用MySQL 8.0作为HOJ的数据存储引擎这是考虑到其良好的事务支持和高并发读写性能完全满足在线判题系统对数据一致性的严格要求。提示建议使用CentOS 7.6以上版本这个版本对宝塔面板的兼容性最佳且系统稳定性经过长期验证。2. 环境准备与基础配置2.1 系统初始化设置在开始安装前需要对CentOS系统进行基础优化# 更新系统组件 yum update -y # 安装常用工具 yum install -y wget curl vim git unzip # 关闭不必要的服务 systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config2.2 宝塔面板安装与优化执行官方安装命令获取最新版宝塔面板wget -O install.sh http://download.bt.cn/install/install_6.0.sh sh install.sh安装完成后通过面板推荐安装以下组件Nginx 1.20高性能Web服务器MySQL 8.0数据库服务PHP 7.4部分HOJ组件依赖PM2管理器Node.js进程管理注意安装MySQL时务必选择8.0版本HOJ的部分功能如窗口函数依赖此版本特性。同时建议设置root密码强度不低于12位包含大小写字母、数字和特殊字符。3. 数据库部署与配置3.1 MySQL参数调优在宝塔面板的MySQL设置中需要调整以下关键参数[mysqld] innodb_buffer_pool_size 2G # 建议为物理内存的50%-70% innodb_log_file_size 256M max_connections 500 query_cache_size 64M character-set-server utf8mb4 collation-server utf8mb4_unicode_ci这些参数优化主要考虑增大缓冲池提升查询性能调整日志文件大小平衡IO性能提高最大连接数应对并发访问使用utf8mb4字符集完整支持emoji等特殊字符3.2 HOJ数据库初始化通过宝塔面板的phpMyAdmin导入HOJ提供的SQL初始化脚本-- 创建数据库 CREATE DATABASE hoj CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 授权特定用户生产环境建议使用最小权限原则 CREATE USER hoj_userlocalhost IDENTIFIED BY StrongPassword123!; GRANT ALL PRIVILEGES ON hoj.* TO hoj_userlocalhost; FLUSH PRIVILEGES;导入完成后需要特别检查以下表结构是否完整problem题目表user用户表judge判题记录表contest比赛表4. 关键脚本实现与部署4.1 判题服务脚本判题核心脚本judge-server.sh需要放置在/usr/local/hoj/judge目录下#!/bin/bash # HOJ判题服务守护进程 JUDGE_PATH/hoj/judge LOG_FILE/var/log/hoj-judge.log while true; do # 检查判题进程是否存在 if ! pgrep -f hoj-judge /dev/null; then echo $(date) - 判题服务未运行正在启动... $LOG_FILE nohup $JUDGE_PATH/hoj-judge $LOG_FILE 21 fi sleep 30 done设置脚本可执行权限并加入开机启动chmod x /usr/local/hoj/judge/judge-server.sh echo reboot root /usr/local/hoj/judge/judge-server.sh /etc/crontab4.2 数据库备份脚本定期备份脚本db-backup.sh配置#!/bin/bash # HOJ数据库备份脚本 BACKUP_DIR/backup/hoj-db DATE$(date %Y%m%d) MYSQL_USERhoj_user MYSQL_PASSStrongPassword123! DB_NAMEhoj # 创建备份目录 mkdir -p $BACKUP_DIR # 执行备份 mysqldump -u$MYSQL_USER -p$MYSQL_PASS $DB_NAME | gzip $BACKUP_DIR/hoj_$DATE.sql.gz # 删除7天前的备份 find $BACKUP_DIR -name hoj_*.sql.gz -mtime 7 -exec rm {} \;配置每日凌晨3点自动执行chmod x /root/db-backup.sh echo 0 3 * * * root /root/db-backup.sh /etc/crontab5. 性能优化与安全加固5.1 数据库索引优化针对HOJ的高频查询场景建议添加以下索引-- 题目表查询优化 ALTER TABLE problem ADD INDEX idx_visible_id (visible, id); ALTER TABLE problem ADD INDEX idx_author (author); -- 判题记录查询优化 ALTER TABLE judge ADD INDEX idx_submit_time (submit_time); ALTER TABLE judge ADD INDEX idx_uid_pid (user_id, problem_id); -- 比赛查询优化 ALTER TABLE contest ADD INDEX idx_start_end_time (start_time, end_time);5.2 系统安全配置修改MySQL默认端口[mysqld] port 3307配置Nginx访问限制location /admin/ { allow 192.168.1.0/24; deny all; auth_basic Restricted; auth_basic_user_file /etc/nginx/htpasswd; }安装fail2ban防御暴力破解yum install -y fail2ban systemctl enable fail2ban systemctl start fail2ban6. 常见问题排查指南6.1 数据库连接失败现象HOJ前端显示数据库连接错误排查步骤检查MySQL服务状态systemctl status mysqld验证用户权限SHOW GRANTS FOR hoj_userlocalhost;检查最大连接数是否耗尽SHOW STATUS LIKE Threads_connected;6.2 判题服务异常现象提交代码后长时间无判题结果解决方案检查判题服务日志tail -f /var/log/hoj-judge.log验证判题进程是否存在ps aux | grep hoj-judge检查判题机资源使用情况top -u hoj6.3 性能瓶颈分析当系统响应变慢时可按以下顺序排查数据库慢查询分析SET GLOBAL slow_query_log ON; SET GLOBAL long_query_time 1;检查服务器负载vmstat 1分析Nginx访问日志goaccess /www/wwwlogs/access.log7. 维护与监控方案7.1 资源监控配置安装node_exporter用于Prometheus监控wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz tar xvf node_exporter-* cp node_exporter-*/node_exporter /usr/local/bin/ useradd -rs /bin/false node_exporter创建systemd服务[Unit] DescriptionNode Exporter Afternetwork.target [Service] Usernode_exporter Groupnode_exporter ExecStart/usr/local/bin/node_exporter [Install] WantedBymulti-user.target7.2 日志轮转配置在/etc/logrotate.d/hoj中添加/var/log/hoj-judge.log { daily missingok rotate 30 compress delaycompress notifempty create 640 hoj hoj sharedscripts postrotate /usr/bin/systemctl reload hoj-judge /dev/null endscript }在实际部署过程中我发现判题服务的稳定性很大程度上取决于数据库配置的合理性。特别是在高并发场景下适当调整InnoDB缓冲池大小和连接数参数可以显著提升系统响应速度。另外定期维护数据库索引和统计信息也能有效预防性能劣化。