docker-compose 搭建splash集群

目錄結(jié)構(gòu)

.
├── docker-compose.yaml
├── nginx
│   └── nginx.conf
└── script
    ├── run.sh
    └── splash_listener.py

docker-compose.yaml

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

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;
        }    
    }
}

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)聽(tīng)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)

run.sh

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
python /app/splash_listener.py
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末曲横,一起剝皮案震驚了整個(gè)濱河市喂柒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胜榔,老刑警劉巖胳喷,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異夭织,居然都是意外死亡吭露,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)尊惰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)讲竿,“玉大人,你說(shuō)我怎么就攤上這事弄屡√赓鳎” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵膀捷,是天一觀的道長(zhǎng)迈嘹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)全庸,這世上最難降的妖魔是什么秀仲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮壶笼,結(jié)果婚禮上神僵,老公的妹妹穿的比我還像新娘。我一直安慰自己覆劈,他們只是感情好保礼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布沛励。 她就那樣靜靜地躺著,像睡著了一般炮障。 火紅的嫁衣襯著肌膚如雪目派。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,245評(píng)論 1 299
  • 那天胁赢,我揣著相機(jī)與錄音址貌,去河邊找鬼。 笑死徘键,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遍蟋。 我是一名探鬼主播吹害,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼虚青!你這毒婦竟也來(lái)了它呀?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤棒厘,失蹤者是張志新(化名)和其女友劉穎纵穿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體奢人,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谓媒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了何乎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片句惯。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖支救,靈堂內(nèi)的尸體忽然破棺而出抢野,到底是詐尸還是另有隱情,我是刑警寧澤各墨,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布指孤,位于F島的核電站,受9級(jí)特大地震影響贬堵,放射性物質(zhì)發(fā)生泄漏恃轩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一扁瓢、第九天 我趴在偏房一處隱蔽的房頂上張望详恼。 院中可真熱鬧,春花似錦引几、人聲如沸昧互。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)敞掘。三九已至叽掘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玖雁,已是汗流浹背更扁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赫冬,地道東北人浓镜。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像劲厌,于是被迫代替她去往敵國(guó)和親膛薛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

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