Xiuno BBS 网站性能优化与安全加固实战
接手一个跑了多年的 Xiuno BBS 站点,打开首页等了三四秒才出来,而且用户反馈有时候还会报错。一番检查发现,这个站不仅慢,安全漏洞也不少。记录一下这次的排查和修复过程。
问题排查
性能方面
先用 curl 测了本地 TTFB:
curl -sk -o /dev/null -w "TTFB: %{time_starttransfer}s\n" http://127.0.0.1:91/
TTFB: 0.237s首页 237ms,还不算太离谱,但考虑到这是在服务器本地测的(跳过网络延迟),实际用户端至少 1-2 秒。
接着看 PHP 配置,发现问题了:
grep opcache /www/server/php/82/etc/php.ini
;zend_extension=opcache
;opcache.enable=1
;opcache.memory_consumption=128OPcache 所有配置行全被注释掉了。这意味着每次请求 PHP 都要重新编译所有脚本,没有缓存。
MySQL 方面也不乐观:
mysql> SHOW VARIABLES LIKE 'query_cache%';
query_cache_type OFF
query_cache_size 67108864查询缓存虽然配了 64MB 内存,但功能根本没启用。
安全方面
服务器扫描发现了几个严重问题:
- 根目录下有个
p123.php后门脚本,硬编码密码123123123123aaaa conf/conf.php可以直接访问,里面是数据库账号密码xiunophp/xiunophp.php核心框架文件也能直接下载- MySQL 3306 端口全网监听
- PHP
display_errors = On在生产环境开着 - 没有任何安全头(X-Frame-Options, HSTS 等)
修复过程
第一步:删除后门
rm -f /path/to/site/p123.php确认返回 404。
第二步:启用 OPcache(效果最明显)
编辑 php.ini,取消注释 OPcache 相关配置,并且一定要加上 zend_extension=opcache.so——OPcache 是 Zend Extension,不是普通 PHP Extension,配置了 enable 但没加载模块是不会生效的。
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60第三步:关闭 display_errors
display_errors = Off第四步:限制敏感路径
这里踩了一个坑。最初用 Nginx 的 location ~* /(conf|xiunophp)/ { return 404; } 来屏蔽敏感目录,发现没用。原因是 PHP 处理规则 location ~ [^/]\\.php(/|$) 在全局配置中先被匹配到,PHP 文件被直接交给 FPM 处理了,永远不会走到后面的 deny 规则。
解决办法:使用 ^~ 前缀位置,优先级高于所有正则位置:
location ^~ /conf/ { return 404; }
location ^~ /xiunophp/ { return 404; }
location ^~ /install0/ { return 404; }
location ^~ /backup/ { return 404; }^~ 前缀在 Nginx 位置匹配中优先级高于 ~ 和 ~* 正则匹配,所以即使 PHP 文件也会被拦截。
第五步:添加安全头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
server_tokens off;第六步:MySQL 安全加固
bind-address = 127.0.0.1MySQL 从全网监听改为只绑定本地。
第七步:启用查询缓存
这个站用的是 MyISAM 表(20 个表,共 574MB 数据),没有事务需求,查询缓存很适合:
query_cache_type = 1第八步:Cookie 加 SameSite
在 PHP 的 setcookie() 调用中使用 PHP 7.3+ 的 array 语法添加 samesite 属性:
setcookie('bbs_token', $token, [
'expires' => $time + 8640000,
'path' => $conf['cookie_path'],
'samesite' => 'Lax'
]);优化效果
修复前: 首页 TTFB 237ms, 论坛 81ms
修复后: 首页 TTFB 38ms, 论坛 18ms首页加载速度提升约 84%。OPcache 的功劳最大——从前每次请求都要重新编译 PHP 脚本,现在全部缓存在内存中。
总结
这次修复最大的体会:
- OPcache 是 PHP 站点性价比最高的优化手段,启用后效果立竿见影。
- Nginx 的
^~位置前缀比正则~优先级高,做安全拦截时必须用这个才能盖过 PHP 处理规则。 - 老站点的安全检查不能只看应用层——后门文件、配置文件暴露、数据库开公网这些底层问题更致命。
- Cookie SameSite 在 PHP 7.3+ 直接用 array 参数就能搞定,不用改太多代码。