原因:使用splash经常出现 504 Gateway Time-out错误,很头疼,查了一圈,在官方文档那里的到若干建议或者说解决注意方法。
splash 504原因官方解释:
HTTP 504错误意味着对Splash的请求花费超过超时秒数(默认为30秒) - Splash在超时后中止脚本执行。 要覆盖超时值,请将’timeout’参数传递给您正在使用的Splash端点。 请注意,允许的最大超时值受最大超时设置的限制,默认情况下为60秒。 换句话说,默认情况下,您无法传递?timeout = 300来运行长脚本 - 将返回错误。
解决办法:
在docker启动splash时,设置max timeout:
$ docker run -it -p 8050:8050 scrapinghub/splash --max-timeout 3600
关于504,官方文档的若干建议:
1.网站速度慢一个网站可能真的很慢,或者它可以尝试获取一些非常慢的远程资源。如果网站本身很慢,则无法增加超时和降低请求率。但是,问题往往存在于第三方跟踪器或广告等不可靠的远程资源中。默认情况下,Splash会等待加载所有远程资源,但在大多数情况下,最好不要永远等待它们。在超时后中止资源加载并为整个页面提供渲染使用资源超时的机会。对于render。***端点使用’resource_timeout’参数;执行或运行使用splash.resource_timeout或request:set_timeout(请参阅splash:on_request)。始终设置resource_timeout是一个很好的实践;类似于resource_timeout = 20的东西通常效果很好。
2. Splash Lua脚本做了太多事情当脚本抓取很多页面或使用大量延迟时,超时是不可避免的。有时你必须运行这样的脚本;在这种情况下,增加–max-timeout Splash选项并使用更大的超时值。但在增加超时之前,请考虑将脚本拆分为较小的步骤并将它们单独发送到Splash。例如,如果您需要获取100个网站,请不要编写一个Splash Lua脚本,该脚本会获取100个URL并获取它们 - 编写一个Splash Lua脚本,该脚本需要1个URL并获取它,并向Splash发送100个请求。这种方法有许多好处:它使脚本更简单,更健壮,并且可以实现并行处理。
3. Splash实例重载当Splash过载时,它可能会开始产生504错误。 Splash并行呈现请求,但它不会同时呈现所有请求 - 并发性仅限于使用–slots选项在启动时设置的值。当使用所有槽时,请求被放入队列中。事情是,一旦Splash收到请求,超时开始打勾,而不是当Splash开始渲染它时。如果请求长时间停留在内部队列中,即使网站速度很快且启动能够呈现网站,它也可能会超时。为了提高渲染速度并解决队列问题,建议启动多个Splash实例并使用能够维护自己的请求队列的负载均衡器。 HAProxy具有所有必要的功能;在这里查看示例配置。负载均衡器中的共享请求队列也有助于提高可靠性:如果需要重新启动Splash实例,则不会丢失请求。