近日,朋友推荐了一个好用的工具,叫做splash. 是一个使用webdriver进行浏览器动态渲染的工具,非常的高效,可靠。刚好趁着周末闲来无事,在自身服务器上进行一下程序的部署工作。
如果存在二次开发需求的朋友可以去git上下载项目源代码 :spash git地址
首先,我们使用docker-compose进行程序的部署维护工作。docker-compose是一个用来定义和运行复杂应用的Docker工具。
这里我们不在讲述安装方法,具体的安装方法可以参考 docker-compose教程(安装,使用, 快速入门)
安装第一步: 下载创建spash的docker镜像。
docker pull scrapinghub/splash
安装第二步:配置docker-compose.yaml文件,我这里贴出了我自己的docker-compose文件,供大家食用:version: "3"
services:
nginx:
image: nginx
container_name: splash_nginx
restart: always
ports:
- 8050:80
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
depends_on:
- splash1
- splash2
listener:
image: python:3.8
hostname: listener
volumes:
- ./script:/app
command: bash /app/run.sh
depends_on:
- splash1
- splash2
splash1:
hostname: splash1
container_name: splash_1
image: scrapinghub/splash
restart: always
splash2:
hostname: splash2
container_name: splash_2
image: scrapinghub/splash
restart: always
这时候就可以执行docker-compose命令去启动splash了。
启动命令如下:
docker-compose up //程序控制台启动
docker-compose up -d //程序后台启动
在启动的时候,docker-compose 会自动下载yaml文件中的nginx的镜像于python3.8的镜像,当然如果各位大佬对于nginx于python版本有要求的话,可以自行更改docker-compose.yaml文件中的版本控制部分。
如发生报错:
发现nginx启动报错,且报错内容如下:
则是因为程序自动想要帮你创建的nginx.conf配置文件。但是因为程序bug的问题,niginx文件,被创建成了一个名叫nginx.conf的文件夹所以导致报错。这里我们只需要创建一个nginx.conf的文件即可。 具体文件内容为:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
client_max_body_size 10m;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
upstream tomcat_client {
server splash1:8050 weight=1;
server splash2:8050 weight=1;
}
server {
server_name "";
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
location / {
proxy_pass http://tomcat_client;
proxy_redirect default;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
然后再次启动即可。
如果这时候依旧发生报错,且错误内容为(问题无法重现,就不贴图了):python的镜像无法启动:
则是因为你缺少python的执行脚本以及启动脚本:
python 执行脚本如下: splash_listener.py
# -*- coding:utf-8 -*-
# @Author: wmy
# @Time: 2020/7/3
# @Description:
import sys
import subprocess
import requests
import logging
class Listener(object):
def __init__(self):
self.splash_timeout = 10
self.splash_ping_times = 2
self.logger = self.get_logger()
self.splash_servers = [
{
'host': 'splash1',
'port': '8050',
'name': 'splash_1',
},
{
'host': 'splash2',
'port': '8050',
'name': 'splash_2',
},
]
def get_logger(self, name='splash_listener', level=logging.INFO):
"""
获得一个logger
:param name:
:param level:
:return:
"""
logger = logging.getLogger(name)
logger.setLevel(level)
stream_handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s: - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
return logger
def ping_splash(self, splash_host, splash_port):
"""
尝试连接splash,测试splash服务是否正常
:return: 正常,True,无法访问,False
"""
splash_url = 'http://{}:{}'.format(splash_host, splash_port)
try:
resp = requests.get(splash_url, timeout=self.splash_timeout)
except Exception as e:
self.logger.error(u'请求出错.{}'.format(e))
return False
if resp.status_code != 200:
self.logger.error(u'状态码异常.{}'.format(resp.status_code))
return False
return True
def listen_splash(self):
"""
监听splash,尝试连接splash,直到成功或者失败self.splash_ping_times次。
:return: 成功,True,失败,False
"""
for splash in self.splash_servers:
mark = False
# check splash
for i in range(self.splash_ping_times):
if self.ping_splash(splash['host'], splash['port']):
mark = False
else:
mark = True
if mark:
# restart splash
subprocess.Popen(args=['docker', 'restart', splash['name']])
self.logger.error(u'{} splash服务异常,重启服务'.format(splash['name']))
else:
self.logger.info(u'{} splash服务正常'.format(splash['name']))
if __name__ == '__main__':
import time
while True:
Listener().listen_splash()
time.sleep(60*5)
python脚本启动如下:run.sh
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
python /app/splash_listener.py
将两个文件复制到docker-compose的同级目录script文件夹下即可。
然后再次使用docker-compose up 命令进行程序的启动。
以上便是我在使用docker-compose安装splash程序过程中所遇到的问题。特此记录一下