docker-compose 搭建splash集群

近日蜓谋,朋友推薦了一個(gè)好用的工具区匣,叫做splash. 是一個(gè)使用webdriver進(jìn)行瀏覽器動(dòng)態(tài)渲染的工具偷拔,非常的高效,可靠亏钩。剛好趁著周末閑來(lái)無(wú)事莲绰,在自身服務(wù)器上進(jìn)行一下程序的部署工作。

如果存在二次開發(fā)需求的朋友可以去git上下載項(xiàng)目源代碼 :spash git地址?

首先姑丑,我們使用docker-compose進(jìn)行程序的部署維護(hù)工作蛤签。docker-compose是一個(gè)用來(lái)定義和運(yùn)行復(fù)雜應(yīng)用的Docker工具。

這里我們不在講述安裝方法栅哀,具體的安裝方法可以參考?docker-compose教程(安裝震肮,使用, 快速入門)

安裝第一步:? 下載創(chuàng)建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

這時(shí)候就可以執(zhí)行docker-compose命令去啟動(dòng)splash了。

啟動(dòng)命令如下:

docker-compose up //程序控制臺(tái)啟動(dòng)

docker-compose up -d //程序后臺(tái)啟動(dòng)

在啟動(dòng)的時(shí)候痴柔,docker-compose 會(huì)自動(dòng)下載yaml文件中的nginx的鏡像于python3.8的鏡像沦偎,當(dāng)然如果各位大佬對(duì)于nginx于python版本有要求的話,可以自行更改docker-compose.yaml文件中的版本控制部分咳蔚。

如發(fā)生報(bào)錯(cuò):

? ? 發(fā)現(xiàn)nginx啟動(dòng)報(bào)錯(cuò)豪嚎,且報(bào)錯(cuò)內(nèi)容如下:

? ?

nginx啟動(dòng)報(bào)錯(cuò)

則是因?yàn)槌绦蜃詣?dòng)想要幫你創(chuàng)建的nginx.conf配置文件。但是因?yàn)槌绦騜ug的問(wèn)題谈火,niginx文件侈询,被創(chuàng)建成了一個(gè)名叫nginx.conf的文件夾所以導(dǎo)致報(bào)錯(cuò)。這里我們只需要?jiǎng)?chuàng)建一個(gè)nginx.conf的文件即可糯耍。 具體文件內(nèi)容為:

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;

? ? ? ? }? ?

? ? }

}

然后再次啟動(dòng)即可扔字。

如果這時(shí)候依舊發(fā)生報(bào)錯(cuò),且錯(cuò)誤內(nèi)容為(問(wèn)題無(wú)法重現(xiàn)谍肤,就不貼圖了):python的鏡像無(wú)法啟動(dòng):

則是因?yàn)槟闳鄙賞ython的執(zhí)行腳本以及啟動(dòng)腳本:

? ?python 執(zhí)行腳本如下:?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):

? ? ? ? """

? ? ? ? 獲得一個(gè)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啦租,測(cè)試splash服務(wù)是否正常

? ? ? ? :return: 正常,True,無(wú)法訪問(wèn),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'請(qǐng)求出錯(cuò).{}'.format(e))

? ? ? ? ? ? return False

? ? ? ? if resp.status_code != 200:

? ? ? ? ? ? self.logger.error(u'狀態(tài)碼異常.{}'.format(resp.status_code))

? ? ? ? ? ? return False

? ? ? ? return True

? ? def listen_splash(self):

? ? ? ? """

? ? ? ? 監(jiān)聽splash荒揣,嘗試連接splash,直到成功或者失敗self.splash_ping_times次焊刹。

? ? ? ? :return: 成功系任,True恳蹲,失敗,F(xiàn)alse

? ? ? ? """

? ? ? ? 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服務(wù)異常俩滥,重啟服務(wù)'.format(splash['name']))

? ? ? ? ? ? else:

? ? ? ? ? ? ? ? self.logger.info(u'{} splash服務(wù)正常'.format(splash['name']))

if __name__ == '__main__':

? ? import time

? ? while True:

? ? ? ? Listener().listen_splash()

? ? ? ? time.sleep(60*5)

python腳本啟動(dòng)如下:run.sh

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests

python /app/splash_listener.py

將兩個(gè)文件復(fù)制到docker-compose的同級(jí)目錄script文件夾下即可嘉蕾。

然后再次使用docker-compose up 命令進(jìn)行程序的啟動(dòng)。

以上便是我在使用docker-compose安裝splash程序過(guò)程中所遇到的問(wèn)題霜旧。特此記錄一下

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末错忱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子挂据,更是在濱河造成了極大的恐慌以清,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崎逃,死亡現(xiàn)場(chǎng)離奇詭異掷倔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)个绍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門勒葱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人巴柿,你說(shuō)我怎么就攤上這事凛虽。” “怎么了广恢?”我有些...
    開封第一講書人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵凯旋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我袁波,道長(zhǎng)瓦阐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任篷牌,我火速辦了婚禮睡蟋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘枷颊。我一直安慰自己戳杀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開白布夭苗。 她就那樣靜靜地躺著信卡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪题造。 梳的紋絲不亂的頭發(fā)上傍菇,一...
    開封第一講書人閱讀 52,807評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音界赔,去河邊找鬼丢习。 笑死牵触,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咐低。 我是一名探鬼主播揽思,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼见擦!你這毒婦竟也來(lái)了钉汗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鲤屡,失蹤者是張志新(化名)和其女友劉穎损痰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體执俩,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡徐钠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了役首。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尝丐。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖衡奥,靈堂內(nèi)的尸體忽然破棺而出爹袁,到底是詐尸還是另有隱情,我是刑警寧澤矮固,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布失息,位于F島的核電站,受9級(jí)特大地震影響档址,放射性物質(zhì)發(fā)生泄漏盹兢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一守伸、第九天 我趴在偏房一處隱蔽的房頂上張望绎秒。 院中可真熱鬧,春花似錦尼摹、人聲如沸见芹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)玄呛。三九已至,卻和暖如春和二,著一層夾襖步出監(jiān)牢的瞬間徘铝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庭砍,地道東北人场晶。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓混埠,卻偏偏與公主長(zhǎng)得像怠缸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钳宪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容