用Splash作頁面抓取時,若是爬取的量很是大,任務很是多,用一個Splash服務來處理的話,未免壓力太大了,此時能夠考慮搭建一個負載均衡器來把壓力分散到各個服務器上。這至關於多臺機器多個服務共同參與任務的處理,能夠減少單個Splash服務的壓力。html
要搭建Splash負載均衡,首先要有多個Splash服務。假如這裏在4臺遠程主機的8050端口上都開啓了Splash服務,它們的服務地址分別爲41.159.27.223:8050、41.159.27.221:8050、41.159.27.9:8050和41.159.117.119:8050,這4個服務徹底一致,都是經過Docker的Splash鏡像開啓的。訪問其中任何一個服務時,均可以使用Splash服務。nginx
接下來,能夠選用任意一臺帶有公網IP的主機來配置負載均衡。首先,在這臺主機上裝好Nginx,而後修改Nginx的配置文件nginx.conf,添加以下內容:bash
http { upstream splash { least_conn; server 41.159.27.223:8050; server 41.159.27.221:8050; server 41.159.27.9:8050; server 41.159.117.119:8050; } server { listen 8050; location / { proxy_pass http://splash; } }}複製代碼
這樣咱們經過upstream
字段定義了一個名字叫做splash
的服務集羣配置。其中least_conn
表明最少連接負載均衡,它適合處理請求處理時間長短不一形成服務器過載的狀況。服務器
固然,咱們也能夠不指定配置,具體以下:微信
upstream splash { server 41.159.27.223:8050; server 41.159.27.221:8050; server 41.159.27.9:8050; server 41.159.117.119:8050;}upstream splash { server 41.159.27.223:8050; server 41.159.27.221:8050; server 41.159.27.9:8050; server 41.159.117.119:8050;}
複製代碼
這樣默認以輪詢策略實現負載均衡,每一個服務器的壓力相同。此策略適合服務器配置至關、無狀態且短平快的服務使用。網絡
另外,咱們還能夠指定權重,配置以下:負載均衡
123456upstream splash { server 41.159.27.223:8050 weight=4; server 41.159.27.221:8050 weight=2; server 41.159.27.9:8050 weight=2; server 41.159.117.119:8050 weight=1;}複製代碼
這裏weight
參數指定各個服務的權重,權重越高,分配處處理的請求越多。假如不一樣的服務器配置差異比較大的話,可使用此種配置。測試
最後,還有一種IP散列負載均衡,配置以下:ui
1234567upstream splash { ip_hash; server 41.159.27.223:8050; server 41.159.27.221:8050; server 41.159.27.9:8050; server 41.159.117.119:8050;}複製代碼
服務器根據請求客戶端的IP地址進行散列計算,確保使用同一個服務器響應請求,這種策略適合有狀態的服務,好比用戶登陸後訪問某個頁面的情形。對於Splash來講,不須要應用此設置。lua
咱們能夠根據不一樣的情形選用不一樣的配置,配置完成後重啓一下Nginx服務:
1
|
sudo nginx -s reload
|
這樣直接訪問Nginx所在服務器的8050端口,便可實現負載均衡了。
如今Splash是能夠公開訪問的,若是不想讓其公開訪問,還能夠配置認證,這仍然藉助於Nginx。能夠在server
的location
字段中添加auth_basic
和auth_basic_user_file
字段,具體配置以下:
1234567891011121314151617http { upstream splash { least_conn; server 41.159.27.223:8050; server 41.159.27.221:8050; server 41.159.27.9:8050; server 41.159.117.119:8050; } server { listen 8050; location / { proxy_pass http://splash; auth_basic "Restricted"; auth_basic_user_file /etc/nginx/conf.d/.htpasswd; } }}複製代碼
這裏使用的用戶名和密碼配置放置在/etc/nginx/conf.d目錄下,咱們須要使用htpasswd
命令建立。例如,建立一個用戶名爲admin
的文件,相關命令以下:
1
|
htpasswd -c .htpasswd admin
|
接下來就會提示咱們輸入密碼,輸入兩次以後,就會生成密碼文件,其內容以下:
1
2
|
cat .htpasswd
admin:5ZBxQr0rCqwbc
|
配置完成後,重啓一下Nginx服務:
1
|
sudo nginx -s reload
|
這樣訪問認證就成功配置好了。
最後,咱們能夠用代碼來測試一下負載均衡的配置,看看究竟是不是每次請求會切換IP。利用httpbin.org/get測試便可,實現代碼以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import requests
from urllib.parse import quote
import re
lua = '''
function main(splash, args)
local treat = require("treat")
local response = splash:http_get("http://httpbin.org/get")
return treat.as_string(response.body)
end
'''
url = 'http://splash:8050/execute?lua_source=' + quote(lua)
response = requests.get(url, auth=('admin', 'admin'))
ip = re.search('(\d+\.\d+\.\d+\.\d+)', response.text).group(1)
print(ip)
|
這裏URL中的splash字符串請自行替換成本身的Nginx服務器IP。這裏我修改了Hosts,設置了splash爲Nginx服務器IP。
屢次運行代碼以後,能夠發現每次請求的IP都會變化,好比第一次的結果:
1
|
41.159.27.223
|
第二次的結果:
1
|
41.159.27.9
|
這就說明負載均衡已經成功實現了。
本節中,咱們成功實現了負載均衡的配置。配置負載均衡後,能夠多個Splash服務共同合做,減輕單個服務的負載,這仍是比較有用的。
本資源首發於崔慶才的我的博客靜覓: Python3網絡爬蟲開發實戰教程 | 靜覓
如想了解更多爬蟲資訊,請關注個人我的微信公衆號:進擊的Coder
weixin.qq.com/r/5zsjOyvEZ… (二維碼自動識別)