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=128

OPcache 所有配置行全被注释掉了。这意味着每次请求 PHP 都要重新编译所有脚本,没有缓存。

MySQL 方面也不乐观:

mysql> SHOW VARIABLES LIKE 'query_cache%';
query_cache_type  OFF
query_cache_size  67108864

查询缓存虽然配了 64MB 内存,但功能根本没启用。

安全方面

服务器扫描发现了几个严重问题:

  1. 根目录下有个 p123.php 后门脚本,硬编码密码 123123123123aaaa
  2. conf/conf.php 可以直接访问,里面是数据库账号密码
  3. xiunophp/xiunophp.php 核心框架文件也能直接下载
  4. MySQL 3306 端口全网监听
  5. PHP display_errors = On 在生产环境开着
  6. 没有任何安全头(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.1

MySQL 从全网监听改为只绑定本地。

第七步:启用查询缓存

这个站用的是 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 脚本,现在全部缓存在内存中。

总结

这次修复最大的体会:

  1. OPcache 是 PHP 站点性价比最高的优化手段,启用后效果立竿见影。
  2. Nginx 的 ^~ 位置前缀比正则 ~ 优先级高,做安全拦截时必须用这个才能盖过 PHP 处理规则。
  3. 老站点的安全检查不能只看应用层——后门文件、配置文件暴露、数据库开公网这些底层问题更致命。
  4. Cookie SameSite 在 PHP 7.3+ 直接用 array 参数就能搞定,不用改太多代码。
Last modification:June 16th, 2026 at 07:40 am
如果觉得我的文章对你有用,请随意赞赏