Python3爬虫里关于Splash负载均衡配置详解


Posted in Python onJuly 10, 2020

用Splash做页面抓取时,如果爬取的量非常大,任务非常多,用一个Splash服务来处理的话,未免压力太大了,此时可以考虑搭建一个负载均衡器来把压力分散到各个服务器上。这相当于多台机器多个服务共同参与任务的处理,可以减小单个Splash服务的压力。

1. 配置Splash服务

要搭建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服务。

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。利用http://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为Nginx服务器IP。

多次运行代码之后,可以发现每次请求的IP都会变化,比如第一次的结果:

41.159.27.223

第二次的结果:

41.159.27.9

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

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

到此这篇关于Python3爬虫里关于Splash负载均衡配置详解的文章就介绍到这了,更多相关Python3 Splash负载均衡配置内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
浅析Python中signal包的使用
Nov 13 Python
利用python模拟实现POST请求提交图片的方法
Jul 25 Python
Python用于学习重要算法的模块pygorithm实例浅析
Aug 16 Python
用Python PIL实现几个简单的图片特效
Jan 18 Python
Python从文件中读取数据的方法讲解
Feb 14 Python
Django REST framework 如何实现内置访问频率控制
Jul 23 Python
python3.7 利用函数os pandas利用excel对文件名进行归类
Sep 29 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
Nov 29 Python
pycharm新建Vue项目的方法步骤(图文)
Mar 04 Python
keras 获取某层的输入/输出 tensor 尺寸操作
Jun 10 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
Sep 01 Python
jupyter notebook快速入门及使用详解
Nov 13 Python
python3爬虫中异步协程的用法
Jul 10 #Python
浅析Python面向对象编程
Jul 10 #Python
Python爬虫小例子——爬取51job发布的工作职位
Jul 10 #Python
Python 如何对文件目录操作
Jul 10 #Python
Python下划线5种含义代码实例解析
Jul 10 #Python
Python 没有main函数的原因
Jul 10 #Python
如何教少儿学习Python编程
Jul 10 #Python
You might like
基于mysql的论坛(5)
2006/10/09 PHP
PHP4在Windows2000下的安装
2006/10/09 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
PHP链接MySQL的常用扩展函数
2014/10/23 PHP
ThinkPHP控制器详解
2015/07/27 PHP
浅析php-fpm静态和动态执行方式的比较
2016/11/09 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
2006/09/22 Javascript
JS文本框追加多个下拉框的值的简单实例
2013/07/12 Javascript
jQuery窗口、文档、网页各种高度的精确理解
2014/07/02 Javascript
Jquery 实现table样式的设定
2015/01/28 Javascript
AngularJS的表单使用详解
2015/06/17 Javascript
jQuery判断多个input file 都不能为空的例子
2015/06/23 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
webpack4.x CommonJS模块化浅析
2018/11/09 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
Python 自动刷博客浏览量实例代码
2017/06/14 Python
对json字符串与python字符串的不同之处详解
2018/12/19 Python
使用GitHub和Python实现持续部署的方法
2019/05/09 Python
简单了解Django应用app及分布式路由
2019/07/24 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
2019/08/02 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
解决echarts中饼图标签重叠的问题
2020/05/16 Python
python中pivot()函数基础知识点
2021/01/03 Python
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
Sofft鞋官网:世界知名鞋类品牌
2017/03/28 全球购物
美国床垫和床上用品公司:Nest Bedding
2017/06/12 全球购物
高级3D打印市场:Gambody
2019/12/26 全球购物
zooplus德国:便宜地订购动物用品、动物饲料、动物食品
2020/05/06 全球购物
三关爱志愿服务活动方案
2014/08/17 职场文书
2015年汽车销售经理工作总结
2015/04/27 职场文书
反邪教警示教育活动总结
2015/05/09 职场文书
mysql字符串截取函数小结
2021/04/05 MySQL
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL
Java 异步任务计算FutureTask
2022/04/28 Java/Android