雲服務器下docker部署scrapyd之二:使用Nginx對Scrapyd添加驗證

前一篇帖子(雲服務器下docker部署scrapyd)中介紹瞭如何把Scrapyd容器化,並部署在雲服務器中。但是並沒有添加用戶驗證,也就是說,如果該Scrapyd是可以任何人訪問的,那麼只要知道IP地址和端口,總會有人想拿它做壞事,比如我的服務器中就出現了以下的情況:

Screenshot-0.png
該圖摘自我個人的redis容器,情況與scrapyd相似

 redis解決相對比較簡單,只需要在redis.conf配置文件中添加一個較爲複雜的密碼即可,而Scrapyd出現這種情況有以下幾種辦法:

  1. 不允許外部訪問;
  2. 對scrapyd源代碼進行魔改;
  3. 在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]>

詳情見:身份認證

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章