網路爬蟲之Splash負載均衡配置
Splash負載均衡配置
如果我們用 Splash 來做 JavaScript 動態渲染的頁面的抓取的話,如果爬取的量非常大,任務非常多,如果我們用一個 Splash 服務來處理的話未免壓力太大了,所以我們可以考慮搭建一個負載均衡器來把壓力分散到各個伺服器上,這樣相當於多台機器多個服務共同參與任務的處理,可以減小單個 Splash 服務的壓力。
1. 配置Splash服務
要搭建 Splash 負載均衡首先我們需要有多個 Splash 服務,假如在這裡我在四台遠程主機的 8050 埠上都開啟了 Splash 服務,它們的服務地址分別為:41.159.27.223:8050、41.159.27.221:8050、41.159.27.9:8050、41.159.117.119:8050,四個服務完全一致,都是通過 Docker 的 Splash 鏡像開啟的,訪問任何一個服務都可以使用 Splash 服務。
2. 配置負載均衡
接下來我們可以選用任意一台帶有公網 IP 的主機來配置負載均衡,首先需要在這台主機上裝好 Nginx,然後修改 Nginx 的配置文件 nginx.conf,添加如下內容:
http {n upstream splash {n least_conn;n server 41.159.27.223:8050;n server 41.159.27.221:8050;n server 41.159.27.9:8050;n server 41.159.117.119:8050;n }n server {n listen 8050;n location / {n proxy_pass http://splash;n }n }n}n
這樣我們通過 upstream 欄位定義了一個名字叫做 splash 的服務集群配置,least_conn 代表最少鏈接負載均衡,它適合處理請求處理時間長短不一造成伺服器過載的情況。
或者我們也可以不指定配置,配置如下:
upstream splash {n server 41.159.27.223:8050;n server 41.159.27.221:8050;n server 41.159.27.9:8050;n server 41.159.117.119:8050;n}n
這樣默認以輪詢策略實現負載均衡,每個伺服器的壓力相同,此策略適合伺服器配置相當,無狀態且短平快的服務使用。
另外我們還可以指定權重,配置如下:
upstream splash {n server 41.159.27.223:8050 weight=4;n server 41.159.27.221:8050 weight=2;n server 41.159.27.9:8050 weight=2;n server 41.159.117.119:8050 weight=1;n}n
我們通過 weight 指定了各個服務的權重,權重越高分配到處理的請求越多,假如不同的伺服器配置差別比較大的話,就可以使用此種配置。
最後還有一種 IP 哈希負載均衡,配置如下:
upstream splash {n ip_hash;n server 41.159.27.223:8050;n server 41.159.27.221:8050;n server 41.159.27.9:8050;n server 41.159.117.119:8050;n}n
伺服器根據請求客戶端的 IP 地址進行哈希計算,確保使用同一個伺服器響應請求,這種策略適合有狀態的服務,如用戶登錄後訪問某個頁面的情形。不過對於 Splash 來說不需要。
我們可以根據不同的情形選用不同的配置,配置完成後重啟一下 Nginx 服務:
sudo nginx -s reloadn
這樣直接訪問 Nginx 所在伺服器的 8050 埠即可實現負載均衡了。
3. 配置認證
現在 Splash 是公開訪問的,如果我們不想讓其被公開訪問還可以配置認證,仍然藉助於 Nginx 即可,可以在 server 的 location 欄位中添加一個 auth_basic 和 auth_basic_user_file 欄位,配置如下:
http {n upstream splash {n least_conn;n server 41.159.27.223:8050;n server 41.159.27.221:8050;n server 41.159.27.9:8050;n server 41.159.117.119:8050;n }n server {n listen 8050;n location / {n proxy_pass http://splash;n auth_basic "Restricted";n auth_basic_user_file /etc/nginx/conf.d/.htpasswd;n }n }n}n
在這裡使用的用戶名密碼配置放置在 /etc/nginx/conf.d 目錄,我們需要使用 htpasswd 命令創建,例如創建一個用戶名為 admin 的文件,命令如下:
htpasswd -c .htpasswd adminn
接下就會提示我們輸入密碼,輸入兩次之後,就會生成密碼文件,查看一下內容:
cat .htpasswd nadmin:5ZBxQr0rCqwbcn
配置完成之後我們重啟一下 Nginx 服務,運行如下命令:
sudo nginx -s reloadn
這樣訪問認證就成功配置好了。
4. 測試
最後我們可以用代碼來測試一下負載均衡的配置,看看到底是不是每次請求會切換IP,利用 http://httpbin.org/get 測試即可,代碼實現如下:
import requestsnfrom urllib.parse import quotenimport rennlua = nfunction main(splash, args)n local treat = require("treat")n local response = splash:http_get("http://httpbin.org/get")n return treat.as_string(response.body)nendnnnurl = http://splash:8050/execute?lua_source= + quote(lua)nresponse = requests.get(url, auth=(admin, admin))nip = re.search((d+.d+.d+.d+), response.text).group(1)nprint(ip)n
這裡的 URL 中的 splash 請自行替換成自己的 Nginx 伺服器 IP,在這裡我修改了 Hosts 添加了 splash 別名。
多次運行代碼之後可以發現每次請求的 IP 都會變化:
如第一次的結果:
41.159.27.223n
第二次的結果:
41.159.27.9n
這就說明負載均衡已經成功實現了。
5. 結語
本節我們成功實現了負載均衡的配置,配置了負載均衡之後可以多個 Splash 服務共同合作,減輕單個服務的負載,還是比較有用的。
作者:崔慶才 Python愛好者社區專欄作者 授權原創發布,請勿轉載,謝謝。
出處:Splash負載均衡配置 配套視頻教程:Python3爬蟲三大案例實戰分享:貓眼電影、今日頭條街拍美圖、淘寶美食 Python3爬蟲三大案例實戰分享 公眾號:Python愛好者社區(微信ID:python_shequ)小編個人微信:tsdatajob ,來不急回復的,可以加小編微信溝通,謝謝。
推薦閱讀:
