在 HUSTOJ 的高并发运维中,随着单机承载的访问量上升,或者当我们走向分布式多机部署时,默认的本地文件 Session 存储机制往往会成为性能瓶颈。
今天我们就来彻底聊聊如何将 HUSTOJ 的 Session 移交到 Redis 手中,提升系统响应速度并为后续的分布式扩展打下基础。
为什么是 Redis?
默认情况下,PHP 将 Session 以文件形式存储在服务器硬盘上(通常在 /var/lib/php/sessions)。每次用户请求,PHP 都需要进行磁盘 I/O 来读写 Session 文件。
当并发量激增,或者判题机与 Web 端交互频繁时,频繁的磁盘读写会导致严重的 I/O 等待。而 Redis 作为基于内存的键值存储系统,其读写速度远超磁盘。将 Session 托管给 Redis,不仅能极大减轻磁盘负担,还能完美解决多台 Web 服务器共享登录状态的问题。
第一步:环境安装
在 Ubuntu/Debian 体系下,我们通过原生包管理器即可快速完成基础组件的部署。
# 安装 Redis 服务端sudo apt-get updatesudo apt-get install redis-server# 安装 PHP 的 Redis 扩展(以 PHP 8.1 为例,请根据实际版本调整)sudo apt-get install php-redis
第二步:配置 PHP 托管 Session
我们需要修改 PHP-FPM 的配置文件,让 PHP 知道不再使用 files 驱动,而是改用 redis。
打开配置文件(路径根据你的实际 PHP 版本调整,如 8.1):
sudo nano /etc/php/8.1/fpm/php.ini
找到并修改以下关键项:
# 指定使用 redis 扩展接管 sessionsession.save_handler = redis# 指定 Redis 的连接地址。如果是本地,默认如下:session.save_path = ”tcp://127.0.0.1:6379”# 顺便检查或设置 Session 的过期时间(单位:秒,此处默认 1440 秒即 24 分钟)session.gc_maxlifetime = 1440
服务重启提示:修改 php.ini 后,必须重启 PHP-FPM 服务才能使配置生效。
sudo systemctl restart php8.1-fpm
第三步:Redis 安全加固与内存优化
Session 中包含用户的登录凭证,安全至关重要。
打开 Redis 配置文件:
sudo nano /etc/redis/redis.conf
1. 拒绝公网监听
如果你的 Redis 和 Web 服务在同一台机器上,强烈建议只监听本地环回接口:
切勿将其修改为 0.0.0.0 暴露给公网。
2. 设置访问密码
如果是跨服务器分布式部署,Redis 必须监听内网 IP。此时,务必开启密码认证。
在 redis.conf 中找到 requirepass 这一行,取消注释并设置强密码:
requirepass YourStrongPasswordHere
3. 带密码的 PHP 配置
如果在 Redis 中设置了密码,PHP 的 session.save_path 也需要同步修改,格式如下:
session.save_path = ”tcp://127.0.0.1:6379?auth=YourStrongPasswordHere”
4. 小内存服务器的边界设置
如果 HUSTOJ 运行在小内存云服务器上,必须限制 Redis 的最大内存占用,防止其因内存耗尽触发系统的 OOM killer 导致服务崩溃。
在 redis.conf 中配置:
# 限制最大使用内存(例如 512MB,根据实际剩余内存调整)maxmemory 512mb# 内存满了之后的淘汰策略:优先淘汰设置了过期时间的 key(适合 session 场景)maxmemory-policy volatile-lru
修改完 Redis 配置后,同样需要重启服务:
sudo systemctl restart redis-server
第四步:多机分布式部署的额外注意项
如果你正在对 HUSTOJ 进行前后端分离或多判题机/多 Web 的分布式部署,Web 服务器需要跨服务器访问阿里云等云厂商上的 Redis 节点:
- 安全组配置:必须在阿里云控制台的安全组规则中,放行 TCP 6379 端口。为了安全,源 IP 请务必限制为 Web 服务器的内网 IP,切勿对所有人开放。
- 内网通信:跨服务器连接时,
session.save_path 中的 IP 应填写 Redis 服务器的内网 IP,以保证通信效率并免去公网流量费用。
结语
将 Session 注入 Redis 后,HUSTOJ 在处理高并发交题、刷新榜单时的响应速度会有明显的提升。简单几步配置,即可为你的 OJ 带来更稳健的底层支撑。