Splash测试页面超时问题排查(Windows+Docker环境)
我之前在Windows上用Docker跑Splash时,也踩过超时设置不生效的坑,折腾了好一阵才搞定。下面一步步给你拆解解决思路:
1. 先确认Docker启动参数是否正确传递全局最大超时
Splash的全局最大超时上限是在启动容器时通过命令行参数定义的,默认90秒。你必须把--max-timeout参数放在镜像名后面(Docker的参数规则:镜像名之后的是容器内部程序的参数),比如要改成300秒(5分钟):
docker run -p 8050:8050 scrapinghub/splash --max-timeout 300
如果之前已经启动过Splash容器,得先停掉旧容器再重新启动:
# 停止容器(假设容器名是splash) docker stop splash # 删除容器 docker rm splash # 后台启动带新参数的容器 docker run -d --name splash -p 8050:8050 scrapinghub/splash --max-timeout 300
2. 验证全局超时是否生效
启动后打开Splash的测试页面http://localhost:8050,拉到页面底部的Render Options区域,看timeout的最大值是不是你设置的300秒。如果还是90,说明启动参数没生效——大概率是你把--max-timeout写在了镜像名前面(那会被当成Docker的参数,而不是Splash的)。
3. 自定义脚本必须显式设置超时
就算全局最大超时改了,如果你在Lua脚本里没主动设置超时,Splash还是会用默认的30秒(测试页面的默认值)。所以脚本里一定要加上set_timeout,而且数值不能超过你设置的全局上限:
比如在测试页面的Lua Script标签里写:
function main(splash, args) splash:set_timeout(300) -- 和全局最大超时保持一致或更小 -- 你的长执行逻辑,比如等待慢加载的页面 assert(splash:go(args.url)) assert(splash:wait(150)) -- 等待150秒,这时候就不会触发超时了 return splash:png() end
如果用HTTP API调用,也要显式带上timeout参数:
curl 'http://localhost:8050/render.html?url=http://your-slow-page.com&timeout=300'
4. Windows Docker的特殊坑点
Windows上的Docker Desktop有时候会因为缓存或配置挂载问题导致参数不生效,可以试试:
- 重启Docker Desktop,清除容器缓存
- 如果用Docker Compose管理,要在
docker-compose.yml里明确配置Splash的命令参数:
version: '3' services: splash: image: scrapinghub/splash ports: - "8050:8050" command: --max-timeout 300
然后重新部署:
docker-compose down docker-compose up -d
5. 排查系统层面的限制
如果还是超时,可能是Docker容器的资源配额不够(比如CPU/内存不足导致页面加载被强制终止)。可以打开Docker Desktop的设置,给Splash容器分配更多的内存和CPU资源试试。
内容的提问来源于stack exchange,提问作者Lore

