我们的日常需求中会有一些需要渲染javascript的场景,比如爬虫服务、自动化测试、生成复杂的echarts报表等等。之前在java开发中使用较多的是PhantomJS,但是目前PhantomJS已经不再维护升级,并且在使用上也不够便利。这里笔者推荐另外一款神器--splash。
splash是一个webkit内核的headless浏览器环境,可以获取渲染后的HTML内容、导出har格式的浏览记录、对网页指定位置进行截图生成图片以及通过Lua脚本动态执行JS等功能,并且提供了便利的HTTP API方式进行操作,可以通过各种客户端语言进行方便集成。splash中文文档可以参考以下地址:https://splash-cn-doc.readthedocs.io/zh_CN/latest/index.html
下面开始介绍splash在centos7环境下的安装,这里我是通过docker方式进行安装,也可以参照在线文档在非容器环境进行安装。
1.添加163yum源(根据系统修改repo版本)
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo -P /etc/yum.repos.d/
2.安装docker(默认目录在/var/lib/docker下面,如果系统盘小,需要建立一个软链接到大的硬盘)
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#下载速度慢可以替换为阿里云源
#yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y yum-utils device-mapper-persistent-data lvm2
yum install docker-ce-19.03.2 -y
3.安装docker-compose
curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod u+x /usr/local/bin/docker-compose
4.启动docker
将docker配置文件拷贝到/usr/local/docker/docker_compose_conf 目录下,执行:
/bin/systemctl daemon-reload
/bin/systemctl start docker.service
COMPOSE_HTTP_TIMEOUT=300 /usr/local/bin/docker-compose -f /usr/local/docker/docker_compose_conf/docker-compose.yml down --remove-orphans
COMPOSE_HTTP_TIMEOUT=300 /usr/local/bin/docker-compose -f /usr/local/docker/docker_compose_conf/docker-compose.yml up -d
在docker下载haproxy等过程中,如果出现ssl相关的错误,需要先更新机器ssl相关软件
yum -y install ca-certificates openssl nss curl
5.生产环境我们往往需要配置多个splash实例,通过代理服务器进行负载均衡,否则经常会发生504超时(参考https://splash-cn-doc.readthedocs.io/zh_CN/latest/faq.html#i-m-getting-lots-of-504-timeout-errors-please-help),这里以配置两个splash实例并通过haproxy进行负载均衡为例,配置文件docker-compose.yml内容如下:
version: '2'
services:
haproxy:
image: haproxy:1.7
ports:
- "127.0.0.1:60040:9040"
- "127.0.0.1:60050:9050"
links:
- splash00
- splash01
volumes:
- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
restart: always
splash00:
image: scrapinghub/splash:latest
command: --max-timeout 3600 --slots 10 --maxrss 1000 --verbosity 1 --disable-private-mode
expose:
- 9050
mem_limit: 1000m
memswap_limit: 1000m
restart: always
splash01:
image: scrapinghub/splash:latest
command: --max-timeout 3600 --slots 10 --maxrss 1000 --verbosity 1 --disable-private-mode
expose:
- 9050
mem_limit: 1000m
memswap_limit: 1000m
restart: always
6.haproxy.cfg内容如下:
global
maxconn 1280
stats socket /tmp/haproxy
userlist users
user xxx insecure-password xxx
defaults
log global
mode http
option abortonclose
compression algo gzip
compression type text/html text/plain application/json
timeout connect 3600s
timeout client 3600s
timeout server 3600s
listen stats
bind 0.0.0.0:9040
mode http
stats enable
stats hide-version
stats show-legends
stats show-desc Splash Cluster
stats uri /
stats refresh 10s
stats realm Haproxy\ Statistics
stats auth xxx
frontend http-in
bind 0.0.0.0:9050
backend splash-cluster
option httpchk GET /
balance leastconn
retries 3
option redispatch
server splash-00 splash00:9050 check maxconn 0 inter 10s fall 10 observe layer4
server splash-01 splash01:9050 check maxconn 0 inter 10s fall 10 observe layer4
backend splash-misc
balance roundrobin
server splash-00 splash00:9050 check fall 15
server splash-01 splash01:9050 check fall 15
7.启动后通过docker ps -a命令可以查看到有两个splash实例处于up状态,此时访问ip:60050即可得到如下界面:
8.splash的操作可以参考中文文档,另外有几个坑这里记录一下:
- docker环境下的网络应用会受到iptables影响,如果修改了防火墙规则重启iptables,splash也 需要重启,否则会造成网络不通导致splash dns解析失败等情况。
- 如果出现运行一段时间后splash网络不通,查看ip路由转发是否开启sysctl net.ipv4.ip_forward 如果=1说明开启,否则未开启(每次启动docker服务会开启,如果iptables或者网络服务重启则会刷新,所以最终还是要改配置开启ip路由转发服务)。如果未开启ip路由转发,则echo 'net.ipv4.ip_forward = 1' | sudo tee -a /usr/lib/sysctl.d/50-default.conf写入配置,sudo sysctl -p /usr/lib/sysctl.d/50-default.conf 重载配置;如果经常出现splash返回network3错误,可以尝试:systemctl stop docker,ip link set dev docker0 down,systemctl start docker