Discuz! / IT相关 · 2026年7月1日

Discuz!X3.5论坛版块开启图片列表模式后对缩略图进行性能优化

Discuz!X3.5论坛版块对手机版默认开启了图片列表模式,在版块有大量图片时,使用手机访问版块将会加载大量缩略图,缩略图的路径示例:/forum.php?mod=image&aid=20436&size=550×350&key=66823191f185c0d6。由于是动态路径,在高并发情况下将会对服务器造成明显压力。

博主使用阿里云ESA对论坛进行了加速,对该路径设置了缓存规则后仍未生效,工单反馈后得到答复:因源站返回set-cookie响应头,ESA不缓存302响应;需确保源站不返回set-cookie才能应用ESA缓存规则。按理说规则权重应当大于默认策略,但工单都明确这么说了又能如何?不如就自行解决吧,编辑文件:/source/function/function_core.php ,找到dsetcookie函数添加以下代码:

if (isset($_GET['mod']) && $_GET['mod'] == 'image') {
    return;
}

以上解决了不被缓存的问题,但经博主观察,ESA对该缓存保留的时间极短(在30分钟内访问7次,5次MISS,2次HIT),已经提了工单反馈还未得到答复,不如先自行解决。

在ESA和论坛服务器之间有nginx进行反代,原有反代location不需要改动,新增一个location,配置代码如下:

location ^~ /forum.php {
    # 仅当 mod=image 时才启用缓存
    set $skip_cache 1;
        if ($arg_mod = "image") {
            set $skip_cache 0;
        }
    proxy_pass https://172.17.84.142:443;
    proxy_http_version 1.1;
    proxy_ssl_server_name on;
    proxy_ssl_name www.jiangdefu.com;

    proxy_set_header Host www.jiangdefu.com;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_set_header Accept-Encoding "";
    
    proxy_cache_bypass $skip_cache;
    proxy_no_cache $skip_cache;
    
    proxy_cache cache_one;
    proxy_cache_key "$scheme$host$request_uri";
    proxy_cache_valid 302 199d;

    # 忽略上游传来的 Set-Cookie 和缓存头
    proxy_ignore_headers Set-Cookie Cache-Control Expires;
    # 删掉上游传来的 Set-Cookie
    proxy_hide_header Set-Cookie;
    # 删掉上游传来的缓存头
    proxy_hide_header Cache-Control;
    proxy_hide_header Expires;


    # 自定义缓存状态响应头,主要在多层缓存中便于定位链路排查
    add_header X-Cache-Status "$upstream_cache_status from Yoer-2";
    # 重写缓存头
    add_header Cache-Control "max-age=17193600, public";
    # 删掉上游传过来的 Vary 头
    proxy_hide_header Vary;
}

根据实际情况修改反代地址和域名,其中199d代表缓存有效期为199天,由于博主使用了多层反代,为了在F12观察缓存情况增加了自定义响应头X-Cache-Status,其中from Yoer-2指缓存状态来自Yoer-2这台服务器,也可根据实际情况修改或删除。

最终效果如图:

2026年7月20日更新:

发现缩略图失效了,查看该目录发现有刚清空迹象,原来是名为 “每日数据清理”(对应脚本:source/include/cron/cron_clean_up_daily.php)的计划任务清理的,执行缩略图清理的代码如下:

removedir($_G['setting']['attachdir'].'image', TRUE);
@touch($_G['setting']['attachdir'].'image/index.htm');

因此不可再采用以上缓存策略,否则会导致缩略图出现404的情况。