绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
网络爬虫之Splash负载均衡配置
2020-05-25 17:26:21

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 {
    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 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 哈希负载均衡,配置如下:

upstream 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 来说不需要。

我们可以根据不同的情形选用不同的配置,配置完成后重启一下 Nginx 服务:

sudo nginx -s reload

这样直接访问 Nginx 所在服务器的 8050 端口即可实现负载均衡了。

3. 配置认证

现在 Splash 是公开访问的,如果我们不想让其被公开访问还可以配置认证,仍然借助于 Nginx 即可,可以在 server 的 location 字段中添加一个 auth_basic 和 auth_basic_user_file 字段,配置如下:

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;
            auth_basic "Restricted";
            auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
        }
    }
}

在这里使用的用户名密码配置放置在 /etc/nginx/conf.d 目录,我们需要使用 htpasswd 命令创建,例如创建一个用户名为 admin 的文件,命令如下:

htpasswd -c .htpasswd admin

接下就会提示我们输入密码,输入两次之后,就会生成密码文件,查看一下内容:

cat .htpasswd 
admin:5ZBxQr0rCqwbc

配置完成之后我们重启一下 Nginx 服务,运行如下命令:

sudo nginx -s reload

这样访问认证就成功配置好了。

4. 测试

后我们可以用代码来测试一下负载均衡的配置,看看到底是不是每次请求会切换IP,利用 httpbin.org/get 测试即可,代码实现如下:

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 别名。

多次运行代码之后可以发现每次请求的 IP 都会变化:

如次的结果:

41.159.27.223

第二次的结果:

41.159.27.9

这就说明负载均衡已经成功实现了。

5. 结语

本节我们成功实现了负载均衡的配置,配置了负载均衡之后可以多个 Splash 服务共同合作,减轻单个服务的负载,还是比较有用的。


作者:崔庆才 Python爱好者社区专栏作者 授权原创发布,请勿转载,谢谢。
出处:Splash负载均衡配置
配套视频教程:Python3爬虫三大案例实战分享:猫眼电影、今日头条街拍美图、淘宝美食 Python3爬虫三大案例实战分享
公众号:Python爱好者社区(微信ID:python_shequ)

小编个人微信:tsdatajob ,来不急回复的,可以加小编微信沟通,谢谢。

分享好友

分享这个小栈给你的朋友们,一起进步吧。

唠唠叨叨负载均衡
创建时间:2020-05-25 14:12:28
唠唠叨叨负载均衡
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 小雨滴
    专家
戳我,来吐槽~