发表主题 回复主题
  • 1074阅读
  • 1回复

利用免费资源快速搭建分布式扫描架构

抛砖引玉一下。。。



公司内网搭建了分布式扫描器,但是却耗费了好多服务器资源,那么如何在外网无VPS和服务器的情况下,快速搭建一套分布式扫描器呢?


首先,先鄙视一下我这种羊毛党。


然后引入正文daocloud.io,这个平台可以免费运行3台docker容器。


一台作为celery的broker(这里我使用的是redis)


一台作为数据接收db(这里我使用的是mongodb。注:从dockerhub的镜像部署,daocloud自身的mongodb镜像不让用)


另外一台作为woker




先看一下woker这台容器的镜像是如何构建的 https://raw.githubusercontent.com/yuxiaokui/celery-app/master/Dockerfile

  1. FROM fedora:latest
  2. MAINTAINER xi4okv
  3. RUN dnf -y install python
  4. RUN pip install celery redis IPy pymongo requests
  5. ENV THREAD 10
  6. ENTRYPOINT  cd /app && celery -A tasks worker  --loglevel=info -c $THREAD

OK。。。。  
就是这么简单。
然后看一下部署效果。




然后tasks.py的内容是
  1. from celery import Celery
  2. BROKER_URL = 'redis://redis.t2.daoapp.io:61xx4/0'
  3. BACKEND_URL = 'redis://redis.t2.daoapp.io:61xx4/1'
  4. celery = Celery('tasks',
  5.     broker=BROKER_URL,
  6.     backend=BACKEND_URL)
  7.     
  8. import socket
  9. import sys, os, time
  10. import requests
  11. import pymongo
  12. client = pymongo.MongoClient('mongodb://mongodb.t2.daoapp.io:61xx7/')
  13. db = client['sites']
  14. posts = db['sites']
  15. @celery.task
  16. def scan(url):
  17.     headers = requests.head(url, timeout=3).headers
  18.     headers["url"] = url
  19.     posts.insert_one(headers)
  20.     return headers

也是很简单的一次headers收集。


下面开始分发任务。
  1. from tasks import scan
  2. for url in open("urls.txt"):
  3.     scan.delay("http://" + url.strip())
  4.     print url




OK,执行完毕,看下数据处理效果。

  1. import  pymongo
  2. client = pymongo.MongoClient('mongodb://mongodb.t2.daoapp.io:61xx7/')
  3. db = client['sites']
  4. posts = db['sites']
  5. servers = posts.aggregate([{"$group" : {"_id" : "$X-Powered-By", "num_tutorial" : {"$sum":1 }}}])
  6. for server in servers:
  7.     print server
  1. ============== RESTART: C:\Users\xi4okv\Desktop\task\getData.py ==============
  2. {u'num_tutorial': 1, u'_id': u'ARR/3.0, ASP.NET'}
  3. {u'num_tutorial': 1, u'_id': u'ASP.NET, UrlRewriter.NET 2.0.0'}
  4. {u'num_tutorial': 1, u'_id': u'PHP/5.5.18'}
  5. {u'num_tutorial': 1, u'_id': u'PHP/5.5.10'}
  6. {u'num_tutorial': 1, u'_id': u'KCDNS'}
  7. {u'num_tutorial': 1, u'_id': u'PHP/5.2.8'}
  8. {u'num_tutorial': 1, u'_id': u'ThinkPHP2.1'}
  9. {u'num_tutorial': 1, u'_id': u'WWW_80'}
  10. {u'num_tutorial': 1, u'_id': u'PHP/5.4.13'}
  11. {u'num_tutorial': 2, u'_id': u'PHP/5.5.38'}
  12. {u'num_tutorial': 1, u'_id': u'PHP/5.3.10-1ubuntu3.18'}
  13. {u'num_tutorial': 2, u'_id': u'PHP/5.6.21'}
  14. {u'num_tutorial': 1, u'_id': u'PHP/5.3.10-1ubuntu3.26'}
  15. {u'num_tutorial': 1, u'_id': u'PHP/5.5.12'}
  16. {u'num_tutorial': 1, u'_id': u'PHP/5.6.26'}
  17. {u'num_tutorial': 1, u'_id': u'PHP/5.5.4'}
  18. {u'num_tutorial': 1, u'_id': u'jb51.net'}
  19. {u'num_tutorial': 1, u'_id': u'PHP/5.4.9-4ubuntu2.4'}
  20. {u'num_tutorial': 1, u'_id': u'PHP/5.5.9-1ubuntu4.5'}
  21. {u'num_tutorial': 2, u'_id': u'PHP/5.2.17'}
  22. {u'num_tutorial': 1, u'_id': u'ASP.NET, ARR/2.5'}
  23. {u'num_tutorial': 1, u'_id': u'PHP/5.3.17'}
  24. {u'num_tutorial': 1, u'_id': u'PHP/5.3.19'}
  25. {u'num_tutorial': 6, u'_id': u'PHP/5.3.3'}
  26. {u'num_tutorial': 6, u'_id': u'PHP/5.4.45'}
  27. {u'num_tutorial': 1, u'_id': u'PHP/7.0.13'}
  28. {u'num_tutorial': 1, u'_id': u'PHP/5.4.41'}
  29. {u'num_tutorial': 3, u'_id': u'PHP/5.4.16'}
  30. {u'num_tutorial': 11, u'_id': u'ThinkPHP'}
  31. {u'num_tutorial': 6, u'_id': u'WAF/2.0'}
  32. {u'num_tutorial': 1, u'_id': u'PHP/7.0.10'}
  33. {u'num_tutorial': 2, u'_id': u'PHP/5.6.30'}
  34. {u'num_tutorial': 91, u'_id': u'ASP.NET'}
  35. {u'num_tutorial': 1, u'_id': u'PHP/5.4.23'}
  36. {u'num_tutorial': 1, u'_id': u'PHP/5.3.14'}
  37. {u'num_tutorial': 1, u'_id': u'PHP/5.2.14'}
  38. {u'num_tutorial': 1, u'_id': u'PHP/5.6.7'}
  39. {u'num_tutorial': 1, u'_id': u'PHP/5.2.17, ASP.NET'}
  40. {u'num_tutorial': 2, u'_id': u'PHP/5.6.17'}
  41. {u'num_tutorial': 1, u'_id': u'PHP/5.4.4'}
  42. {u'num_tutorial': 1, u'_id': u'shci_v1.03'}
  43. {u'num_tutorial': 9, u'_id': u'Servlet/2.5 JSP/2.1'}
  44. {u'num_tutorial': 1, u'_id': u'HC'}
  45. {u'num_tutorial': 1, u'_id': u'PHP/7.1.6'}
  46. {u'num_tutorial': 1, u'_id': u'YZCMS'}
  47. {u'num_tutorial': 6, u'_id': u'PHP/5.3.29'}
  48. {u'num_tutorial': 2, u'_id': u'QQ342556105'}
  49. {u'num_tutorial': 8, u'_id': u'Express'}
  50. {u'num_tutorial': 3, u'_id': u'ThinkCMF'}
  51. {u'num_tutorial': 4, u'_id': u'PHP/5.5.30'}
  52. {u'num_tutorial': 715, u'_id': None}
  53. {u'num_tutorial': 1, u'_id': u'PHP/5.6.9'}
  54. {u'num_tutorial': 1, u'_id': u'PHP/5.3.15'}
  55. {u'num_tutorial': 2, u'_id': u'Servlet 2.5; JBoss-5.0/JBossWeb-2.1'}
  56. {u'num_tutorial': 2, u'_id': u'UrlRewriter.NET 2.0.0, ASP.NET'}
  57. {u'num_tutorial': 1, u'_id': u'PHP/5.5.23'}
  58. {u'num_tutorial': 1, u'_id': u'PHP/5.6.24'}
  59. {u'num_tutorial': 1, u'_id': u'PHP/5.2.17p1'}
  60. {u'num_tutorial': 1, u'_id': u'PHP/5.3.29, ASP.NET'}
  61. {u'num_tutorial': 2, u'_id': u'PHP/7.0.14'}
  62. {u'num_tutorial': 1, u'_id': u'PHP/5.6.16'}
  63. {u'num_tutorial': 1, u'_id': u'PHP/5.5.25'}
  64. {u'num_tutorial': 1, u'_id': u'PHP/5.4.42'}
  65. {u'num_tutorial': 1, u'_id': u'PHP/5.5.9-1ubuntu4.11'}
  66. {u'num_tutorial': 1, u'_id': u'PHP/5.6.20'}
  67. {u'num_tutorial': 2, u'_id': u'Leichi_IT_01'}
  68. {u'num_tutorial': 1, u'_id': u'PHP/7.0.15'}
  69. {u'num_tutorial': 1, u'_id': u'PHP/5.5.9-1ubuntu4.19'}
  70. {u'num_tutorial': 2, u'_id': u'PHP/5.3.28'}
  71. {u'num_tutorial': 1, u'_id': u'ASP.NET,HiSheng'}
  72. {u'num_tutorial': 1, u'_id': u'PHP/5.6.13'}

嗯,那么分布式在哪里?  这就很简单了吧。


再注册一个daocloud账号,就有3台woker了。 使用docker部署很方便,分分钟搞定。


最后还是建议大家自己买VPS这么玩。


总薅羊毛容易被封号。


本文就是简单介绍一下分布式框架的入门。


如果真想用起来,还是建议使用猪猪侠的 thorns_project




只看该作者 沙发  发表于: 07-20
学习了
发表主题 回复主题
« 返回列表上一主题下一主题

限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个