前一篇帖子(雲服務器下docker部署scrapyd)中介紹瞭如何把Scrapyd容器化,並部署在雲服務器中。但是並沒有添加用戶驗證,也就是說,如果該Scrapyd是可以任何人訪問的,那麼只要知道IP地址和端口,總會有人想拿它做壞事,比如我的服務器中就出現了以下的情況:
redis解決相對比較簡單,只需要在redis.conf配置文件中添加一個較爲複雜的密碼即可,而Scrapyd出現這種情況有以下幾種辦法:
- 不允許外部訪問;
- 對scrapyd源代碼進行魔改;
- 在Scrapyd外添加Nginx作爲反向代理
這裏採用第三種解決辦法(第一種稱不上什麼解決辦法),相關配置文件見github
首先,大致捋一下思路,這裏使用兩個容器:Nginx和Scrapyd容器,他們之間通過docker的內部網絡進行通信,而爲了方便操作,這裏使用的是docker-compose,首先,目錄結構如下:
docker-compose.yml是dockerc-compose所需要的的文件,可以理解它是docker run命令的文件化;外層的Dockerfile負責scrapyd容器,nginx文件夾內的文件則負責Nginx容器;supervisor*.conf 則是supervisor的配置文件。
這裏插一句,目前Scrapyd容器中藥開啓兩個進程,分別是官方的Scrapyd進程和logparser進程,logparser負責整理日誌並向外提供日誌分析結果,該庫的優點在於不用修改scrapyd而能對日誌進行解析
在新版的scrapyd容器中,將由supervisor負責開啓scrapyd進程和logparser進程。
接着我們打開docker-compose.yml:
version: "2.2"
services:
scrapyd:
build: .
image: scrapyd
volumes:
- .:/opt
nginx:
build: ./nginx
ports:
- "6800:6800"
links:
- "scrapyd:scrapyd"
我們創建了scrapyd鏡像和nginx鏡像,然後我們打開了nginx容器的6800端口,並可以讓nginx容器可以訪問到scrapyd容器。
然後是根目錄下的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、sshd、crond配置到相關目錄
COPY supervisord.conf /etc/supervisor/
COPY supervisord_scrapyd.conf /etc/supervisor/
COPY supervisord_logparser.conf /etc/supervisor/
#設置容器啓動時執行的命令
# ENTRYPOINT ["/usr/bin/supervisord", "-nc", "/etc/supervisor/supervisord.conf"]
ENTRYPOINT ["supervisord", "-nc", "/etc/supervisor/supervisord.conf"]
EXPOSE 6800
EXPOSE 6801
多的一部分是supervisor的安裝、配置文件的賦值和啓動命令的改變。supervisor的相關配置文件內容見github地址。
接着是nginx的Dockerfile文件:
FROM nginx
ADD default.conf /etc/nginx/conf.d/
ADD passwd /etc/nginx/
nginx使用的是官方鏡像,這裏僅僅把配置文件添加到相應的文件夾下即可。
passwd爲linux下的htpasswd命令導出的一個關於賬號和密碼的字符串,網上提供了在線工具,打開該工具,比如賬號爲zhangsan,密碼爲lisi,那麼生成的md5可能是下面的結果:
zhangsan:$apr1$m2btnlgu$YOfDkzstJHvYk8CpQDbdK0
把結果保存到passwd文件。接着是default.conf:
server {
listen 6800;
server_name _;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
proxy_pass http://scrapyd:6800; # 轉發
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
auth_basic "Please input password";
auth_basic_user_file /etc/nginx/passwd;
}
}
nginx負責監聽6800端口,並把請求轉發給http://scrapyd:6800,同時開啓了用戶驗證,只有滿足驗證的用戶纔可以訪問真正的頁面。
接着就可以在項目的根目錄下進行鏡像的創建和啓動了:
docker-compose up
該命令會創建鏡像(如果沒有鏡像的話),然後以前臺的方式運行,此時訪問對應的地址時,則會首先進行驗證,如圖:
如果使用requests進行發送scrapyd請求的話,可以使用:
>>> from requests.auth import HTTPBasicAuth
>>> requests.get('https://api.github.com/user', auth=HTTPBasicAuth('user', 'pass'))
<Response [200]>
詳情見:身份認證