[补充] 云服务器下docker部署scrapyd 添加日志解析和supervisor

之前的一篇帖子里曾经在Ubuntu云服务器上部署了Scrapyd容器,帖子如下:云服务器下docker部署scrapyd

目前需要对scrapyd添加了日志解析,该库的名称为logparser,它被用作在scrapyweb中解析scrapyd的日志。这里不介绍scrapyweb,感兴趣的可以去github上了解。

logparser库的工作原理是每隔一段时间(默认10s)查看一下日志文件夹,然后解析,并生成stats.json文件。scrapyd在开启了端口后可以访问scrapyd的目录,因此可以在不修改scrapyd的情况下对日志解析,举个例子,下面是我的scrapyd的工作目录:

[补充] 云服务器下docker部署scrapyd 添加日志解析和supervisor_第1张图片

目前我们只关注logs文件夹,如果此时的scrapyd服务器可以被访问的话,那么输入ip:port/logs则显示:

[补充] 云服务器下docker部署scrapyd 添加日志解析和supervisor_第2张图片

 stats.json的内容如下:

{
    "status": "ok",
    "datas": {},
    "settings_py": "/usr/local/lib/python3.7/site-packages/logparser/settings.py",
    "settings": {
        "scrapyd_server": "127.0.0.1:6800",
        "scrapyd_logs_dir": "/opt/logs",
        "parse_round_interval": 10,
        "enable_telnet": true,
        "override_telnet_console_host": "",
        "log_encoding": "utf-8",
        "log_extensions": [
            ".log",
            ".txt"
        ],
        "log_head_lines": 100,
        "log_tail_lines": 200,
        "log_categories_limit": 10,
        "jobs_to_keep": 100,
        "chunk_size": 10000000,
        "delete_existing_json_files_at_startup": false,
        "keep_data_in_memory": false,
        "verbose": false,
        "main_pid": 0
    },
    "last_update_timestamp": 1582347412,
    "last_update_time": "2020-02-22 04:56:52",
    "logparser_version": "0.8.2"
}

由于当前的scrapyd服务器上并没有运行scrapy项目,所以datas那一栏的数据为空。


在大致了解了logparser的工作原理后,我们开始分析Dockerfille的编写,一般情况下,一个Docker容器只能运行一个进程,如果想要运行多个进程的话,就需要自己编写shell脚本或者使用supervisor等工具,本次采用第二种方案。

supervisor只能运行在类UNIX系统下,它主要负责管理进程,并且还提供了一个可视化的管理工具,如图所示:

[补充] 云服务器下docker部署scrapyd 添加日志解析和supervisor_第3张图片

 接下来就开始Dockerfile的编写:

FROM python:3.7
ENV REFRESHED_AT 2020-02-22
ENV PATH /usr/local/bin:$PATH

#add the scrapyd configure file
ADD ./scrapyd.conf /etc/scrapyd/scrapyd.conf

#add requirements.txt
ADD requirements.txt /opt/requirements.txt
WORKDIR /opt

#install scrapyd
RUN pip3 install  -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
# install logparser
RUN pip3 install  -i https://pypi.tuna.tsinghua.edu.cn/simple logparser
# 安装supervisor
RUN pip3 install  -i https://pypi.tuna.tsinghua.edu.cn/simple supervisor
#拷贝supervisor
COPY supervisord.conf /etc/supervisor/
COPY supervisord_scrapyd.conf /etc/supervisor/
COPY supervisord_logparser.conf /etc/supervisor/

#设置容器启动时执行的命令
ENTRYPOINT ["supervisord", "-nc", "/etc/supervisor/supervisord.conf"]

EXPOSE 6800
EXPOSE 6801

前面几行依然是安装scrapyd,这里不再赘述。之后的两个pip命令,我们分别安装了logparser和supervisor;然后把supervisor需要的配置文件拷贝到/etc/supervisor/下,之后以前台运行supervisor;最后我们暴露了6800端口和6801端口,6801端口分配给了supervisor。

接下来是docker-compose.yml,该文件是Docker Compose所需要的配置文件,旨在文件化docker build run等命令:

version: "2.2"
services:
   detail:
     build: .
     volumes:
       - .:/opt
     ports:
       - "6800:6800"
       - "6801:6801"

然后是supervisor的配置文件,该配置文件可以通过以下的命令生成:

echo_supervisord_conf > supervisord.conf

默认的配置文件基本够用,稍微删减部分注释的结果如下:

[unix_http_server]
file=/tmp/supervisor.sock   ; the path to the socket file

[inet_http_server]         ;HTTP服务器,提供web管理界面
port=0.0.0.0:6801        ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
username=qwerty1234              ;登录管理后台的用户名
password=qwerty1234               ;登录管理后台的密码

[supervisord]
logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
loglevel=info                ; log level; default info; others: debug,warn,trace
pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false               ; start in foreground if true; default false
minfds=1024                  ; min. avail startup file descriptors; default 1024
minprocs=200                 ; min. avail process descriptors;default 200 

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket

;[program:theprogramname]
;command=/bin/cat              ; the program (relative uses PATH, can take args)
;autostart=true                ; start at supervisord start (default: true)
;startsecs=1                   ; # of secs prog must stay up to be running (def. 1)
;startretries=3                ; max # of serial start failures when starting (default 3)
;autorestart=unexpected        ; when to restart if exited after running (def: unexpected)

[include]
files = supervisord_scrapyd.conf supervisord_logparser.conf

改动的地方如下:

  1. inet_http_server,用于外部访问http服务器
  2. include 添加了logparser和scrapyd的进程配置文件

 supervisor_scrapyd.conf文件如下:

[program:scrapyd]
command=/usr/local/bin/python /usr/local/bin/scrapyd
autostart=true
startreties=3
autorestart=unexpected

supervisor_logparser.conf

[program:logparser]
command=/usr/local/bin/python /usr/local/bin/logparser -dir /opt/logs
autostart=true
startreties=3
autorestart=unexpected

 

配置文件终于列完了,接下来就是创建docker镜像了:

docker-compose up -d

该命令会首先创建镜像(如果不存在的话),然后以后台的方式运行镜像。

 

参考:

  • Supervisor使用详解

  • Docker容器内多进程管理(一)——supervisor

你可能感兴趣的:(随笔)