运行 Scrapyd 在后台/作为服务的首选方式

Preferred way to run Scrapyd in the background / as a service

我正在尝试 运行 在虚拟 Ubuntu 16.04 服务器上使用 Scrapyd,我通过 SSH 连接到该服务器。当我 运行 简单地 运行ning

$ scrapyd

我可以通过 http://82.165.102.18:6800.

连接到 Web 界面

但是,一旦我关闭 SSH 连接,Web 界面就不再可用,因此,我想我需要 运行 Scrapyd 以某种方式在后台作为服务。

经过一些研究,我发现了一些建议的解决方案:

有人知道最好/推荐的解决方案是什么吗?不幸的是,Scrapyd documentation 相当单薄且已过时。

对于某些背景,我每天需要 运行 大约 10-15 个蜘蛛。

将ScrapyD设为系统服务

sudo nano /lib/systemd/system/scrapyd.service

然后复制粘贴如下

[Unit]
Description=Scrapyd service
After=network.target

[Service]
User=<YOUR-USER>
Group=<USER-GROUP>
WorkingDirectory=/any/directory/here
ExecStart=/usr/local/bin/scrapyd

[Install]
WantedBy=multi-user.target

然后启用服务

systemctl enable scrapyd.service

然后启动服务

systemctl start scrapyd.service

不推荐的另一种方法

使用这个命令。

cd /path/to/your/project/folder && nohup scrapyd >& /dev/null &

现在您可以关闭 SSH 连接,但 scrapyd 将保持 运行ning。

并确保每当您的服务器重新启动并自动启动 scrapyd 运行s。这样做

从您的终端复制 echo $PATH 的输出,然后通过 crontab -e

打开您的 crontab

现在在该文件的最顶部,写下这个

PATH=YOUR_COPIED_CONTENT

现在在你的 crontab 的末尾,写下这个。

@reboot cd /path/to/your/project/folder && nohup scrapyd >& /dev/null &

这意味着,每次您的服务器重新启动时,上面的命令都会自动 运行

如果你在 Ubuntu 服务器上安装了 Scrapyd,我会将此命令放在 /etc/rc.local 文件的末尾:

<path_to_scrapyd_binary>/scrapyd > /dev/null 2>&1 &

其中 <path_to_scrapyd_binary> 可能类似于 /usr/local/bin/etc/rc.local 最适合您不想构建自己的服务文件或启动脚本的情况。还建议将命令放入 Cron table 和 @reboot,但由于某些原因,这有时对我不起作用(尽管我没有深入研究这些原因)。

我现在的首选仍然是在 Docker 中部署 Scrapyd。您可以从 Docker Hub 获取 Scrapyd image。或者,如果您有特定需求,您可以自己构建映像。我选择了第二个选项。为此,我首先部署了自己的 Docker 存储库。完成后,我使用 Dockerfile:

构建了自己的 Scrapyd 图像
FROM ubuntu:16.04

RUN apt-get update -q \
 && apt-get install -y --no-install-recommends \
    build-essential \
    ca-certificates \
    curl \
    libffi-dev \
    libjpeg-turbo8 \
    liblcms2-2 \
    libssl-dev \
    libtiff5 \
    libtool \
    libwebp5 \
    python \
    python-dev \
    zlib1g \
 && curl -sSL https://bootstrap.pypa.io/get-pip.py | python \
 && pip install --no-cache-dir \
    docker \
    future \
    geocoder \
    influxdb \
    Pillow \
    pymongo \
    scrapy-fake-useragent \
    scrapy_splash \
    scrapyd \
    selenium \
    unicode-slugify \
 && apt-get purge -y --auto-remove \
    build-essential \
    curl \
    libffi-dev \
    libssl-dev \
    libtool \
    python-dev \
 && rm -rf /var/lib/apt/lists/*

COPY ./scrapyd.conf /etc/scrapyd/

VOLUME /etc/scrapyd /var/lib/scrapyd
EXPOSE 6800

CMD ["scrapyd", "--logfile=/var/log/scrapyd.log", "--pidfile="]

构建映像并将其推送到注册表后,我可以将其部署到我需要的任意数量的工作服务器(或者,当然,本地)。拉取镜像后(来自 Docker Hub 的镜像或您自己的镜像),您可以使用以下命令启动它:

sudo docker run --name=scrapyd -d -p 6800:6800 --restart=always -v /var/lib/scrapyd:/var/lib/scrapyd --add-host="dockerhost:"`ip addr show docker0 | grep -Po 'inet \K[\d.]+'` <location>/scrapyd

其中 <location> 是 Docker Hub 帐户,或者它指向您自己的注册表。每次 Docker 服务(重新)启动(--restart=always 选项)时,这个相当复杂的命令都会在后台启动 Scrapyd 图像(-d 选项)监听端口 6800。它还将您的主机 IP 地址作为 dockerhost 发布到容器,以防您需要访问主机上的其他(可能 Dockerized)服务。

Supervisor 是守护 scrapyd 的好方法。安装通常很简单。设置完成后,启动和停止服务就像:

$ supervisorctl start scrapyd
$ supervisorctl stop scrapyd

如果选择这条路线,注意supervisord可能会抛出找不到配置文件的警告。解决此问题的一种方法是简单地在 init.d 脚本中添加对配置的引用:

prog_bin="${exec_prefix}/bin/supervisord -c /etc/supervisord.conf"

要将 scrapyd 运行 作为守护进程,您只需执行以下操作:

$ scrapyd &

最后的 & 使 scrapyd 运行 成为守护进程。

或者,您可以运行以下命令将服务加载到scrapy文件夹:

$ daemon --chdir=/home/ubuntu/crawler scrapyd

如您所述,要使用 "daemon",您需要先通过

在 ubuntu 上安装守护程序

$ sudo apt-get install daemon

通过执行上述方法之一将 scrapyd 运行 作为守护进程后,您应该能够在关闭 ssh 连接后访问 scrapyd 网络界面。