船说 CMS 页面 504 超时怎么优化
学完这篇,你能按「先定位、再调参、最后从数据量和模板下手」的顺序,把船说CMS 页面的 504 Gateway Timeout 从反复出现压到基本不再出现。
504 不是网站自己报的错,而是 Nginx/IIS 前面的反向代理等后端等超时了。所以优化分两条线:一是让后端跑得更快,二是把等待时间调得更长。先做第一条,第二条只是兜底。
第一步:确认是哪一类页面超时,得到「问题范围」
先登录后台,地址是 你的域名/admin,输入管理员账号进入。左侧菜单点「系统」→「系统日志」,看最近 7 天的报错时间点,记下是整点集中出现(多半是计划任务/采集),还是随机出现(多半是慢查询)。
接着在浏览器按 F12 打开 Network 面板,重新访问超时的那条 URL,看请求卡在哪个接口。如果是列表页、搜索页超时,基本是数据库查询;如果是「生成静态」「批量更新」这类后台操作超时,是脚本执行时间不够。
注意:不要一上来就改超时时间。只调大超时,慢查询照样把数据库连接占满,整站会一起 504。
第二步:调大服务器等待时间,得到「不再轻易断连」
Nginx 环境下,编辑站点配置文件(一般在 /www/server/panel/vhost/nginx/你的域名.conf 或 /etc/nginx/conf.d/),在 location ~ \.php 或 location / 段里加:
fastcgi_read_timeout 300s;
fastcgi_connect_timeout 60s;
proxy_read_timeout 300s;
proxy_connect_timeout 60s;
同时改 php.ini 里的 max_execution_time = 300、max_input_time = 300,php-fpm 的 request_terminate_timeout = 300。改完执行 nginx -t 检查语法,再 systemctl reload nginx 和 systemctl restart php-fpm。
IIS 环境下,在站点根目录 web.config 的 <system.web> 节点里加 <httpRuntime executionTimeout="300" maxRequestLength="102400" />,再打开 IIS 管理器 → 选中站点 → 「高级设置」→「连接限制」→「连接超时」设为 300 秒。
注意:PHP 的
max_execution_time对数据库查询本身不生效,SQL 慢查询要靠下一步解决,别误以为调了它就万事大吉。
第三步:优化数据库,得到「查询时间从十几秒降到几百毫秒」
船说CMS 的新闻表、产品表跑到 5 万条以上、又没建索引时,列表页很容易 504。
用 phpMyAdmin 或 Navicat 连上数据库,找到主表(一般叫 cs_article、cs_content 这类前缀),执行:
ALTER TABLE cs_article ADD INDEX idx_cate_time (cateid, addtime);
ALTER TABLE cs_article ADD INDEX idx_status (status);
然后清理无用数据:后台「内容」→「回收站」→ 全选→「彻底删除」;「系统」→「数据库管理」→「优化表」全部勾选执行。日志表(访问统计、采集记录)超过 10 万行就定期清空。
注意:加索引前先备份数据库。大表(超过 100 万行)直接 ALTER 会锁表,建议在凌晨低峰期操作。
第四步:开启缓存与静态化,得到「大部分请求不查库」
后台「系统」→「系统设置」→「性能设置」,把「开启页面缓存」设为是,缓存时间填 300 秒;「开启数据库查询缓存」也设为是。
再到「栏目管理」,对更新不频繁的栏目点「生成静态」,生成模式选「全站生成 HTML」。首页、栏目页、文章页变静态后,请求直接由 Nginx 返回文件,根本不会走到后端。
第五步:把批量操作拆小,得到「采集和批量生成不再触发超时」
采集和批量更新最容易 504。后台「采集」→「采集设置」里,把「每次采集条数」从默认的 100 改成 20~30;「内容管理」里批量生成时,每次只勾选 200 条左右,分几批做完。
注意:模板里循环标签嵌套超过三层、或者在循环内部再调一次数据库标签,会让单页查询次数翻几十倍。检查模板文件,把能提前取的数据提到循环外面。
小结
- 504 是代理等后端超时,先定位是数据库慢还是脚本执行久,别急着改超时。
- Nginx 调
fastcgi_read_timeout和proxy_read_timeout,IIS 调executionTimeout,两边都要配合 PHP/应用池设置。 - 数据量大的核心表必须加
cateid + addtime组合索引,并清空回收站和日志表。 - 后台开启页面缓存、栏目生成静态 HTML,是最省事的长期方案。
- 采集、批量生成一律分批,每批控制在 200 条以内。
原文链接:https://www.gj0.com/thread-821.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。