[1202]docker搭建隧道代理池

1. 什么是隧道代理池?

隧道代理是基于高性能主机构建的动态IP代理服务器;

以设置固定代理,每次请求自动更换到不同IP (这里规则可以自己定);

线路以高匿名、高便捷、多并发的优势,适用于个人/企业对代理稳定性和品质要求高的客户(主要看你代理池中的 IP 稳不稳定)。

image.png

2. 环境准备

  1. 服务器一台(最好是公网)
  2. docker & docker-compose
  3. 以及几个别人弄好的项目代码

3. 开始搭建

1. 搭建 redis

  • 在服务器某个角落创建一个文件夹叫 docker-redis(自己看着取名) 在到文件夹下创建一个文件叫做 docker-compose.yml

  • 内容如下:

version: '2'
services:
  redis:
    container_name: redis
    image: docker.io/bitnami/redis:6.2
    environment:
      - REDIS_PASSWORD=xxxx(自己设置密码)
      - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL
    ports:
      - '6379(端口自己也可以改改):6379'
    volumes:
      - './data:/bitnami/redis/data'
    command: /opt/bitnami/scripts/redis/run.sh --appendonly yes</pre>
  • 创建完了直接 docker-compose up -d 一步启动~

  • 查看有没有报错可以 docker-compose logs -f

  • 对就是这么简单, 对了,还有记一下你服务器的 IP 和 端口 以及自己设置的 密码

2. 搭建代理池

  • 还是一样在服务器某个角落创建一个文件文件夹叫 docker-pool

  • 然后把这个项目 👉👉👉 proxy_pool 弄进去

  • 我们一般用 git clone https://github.com/jhao104/proxy_pool.git

  • 改动几个文件

  1. setting.py

    • DB_CONN 改成自己的redis
    • TABLE_NAME 改成 proxy:pool 后面有用到
    • 文件差不多就是这样了
# -*- coding: utf-8 -*-
VERSION = "2.4.0"
BANNER = r"""
****************************************************************
*** ______  ********************* ______ *********** _  ********
*** | ___ \_ ******************** | ___ \ ********* | | ********
*** | |_/ / \__ __   __  _ __   _ | |_/ /___ * ___  | | ********
*** |  __/|  _// _ \ \ \/ /| | | ||  __// _ \ / _ \ | | ********
*** | |   | | | (_) | >  < \ |_| || |  | (_) | (_) || |___  ****
*** \_|   |_|  \___/ /_/\_\ \__  |\_|   \___/ \___/ \_____/ ****
****                       __ / /                          *****
************************* /___ / *******************************
*************************       ********************************
****************************************************************
"""
HOST = "0.0.0.0"
PORT = 5010
# db connection uri
# example:
#      Redis: redis://:password@ip:port/db
#      Ssdb:  ssdb://:password@ip:port
DB_CONN = 'redis://:xxx(密码)@111.111.222.222(IP):6379(端口)/0'  # 👈👈👈
# proxy table name
TABLE_NAME = 'proxy:pool' # 👈👈👈
# ###### config the proxy fetch function ######
PROXY_FETCHER = [
    "freeProxy01",
    "freeProxy02",
    "freeProxy03",
    "freeProxy04",
    "freeProxy05",
    "freeProxy06",
    "freeProxy07",
    "freeProxy08",
    "freeProxy09",
    "freeProxy10"
]
# 代理验证目标网站
HTTP_URL = "http://demo.spiderpy.cn"
HTTPS_URL = "https://www.qq.com"
# 代理验证时超时时间
VERIFY_TIMEOUT = 10
# 近PROXY_CHECK_COUNT次校验中允许的最大失败次数,超过则剔除代理
MAX_FAIL_COUNT = 0
# proxyCheck时代理数量少于POOL_SIZE_MIN触发抓取
POOL_SIZE_MIN = 20
TIMEZONE = "Asia/Shanghai"
  1. Dockerfile
FROM python:3.6-alpine
MAINTAINER jhao104 <j_hao104@163.com>
WORKDIR /app
COPY ./requirements.txt .
# apk repository
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
# timezone
RUN apk add -U tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && apk del tzdata
# runtime environment
RUN apk add musl-dev gcc libxml2-dev libxslt-dev && \
    pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ && \
    apk del gcc musl-dev
COPY . .
EXPOSE 5010 # 👈👈👈 其实这行可以去掉, 他是对外提供管理代理池的,我们做成隧道代理用处不是很大
ENTRYPOINT [ "sh", "start.sh" ]
  1. start.sh
#!/usr/bin/env bash
#之前是启动了两个服务现在我们只要调度器启动就可以了
#python proxyPool.py server & python proxyPool.py schedule
python proxyPool.py schedule
  1. 同目录下自己创建一个 docker-compose.yml
version: '2'
services:
  proxy_pool:
    build: .
    container_name: proxy_pool
    # 👇👇👇 端口这个地方也是可要可不要的
    ports: 
      - "5010:5010"
    environment:
      #和 setting.py 里面的 DB_CONN 一样
      DB_CONN: "redis://xxx"
    # 可能你以后需要自己加代理, 可以直接改当前项目省得每次改动都重新 build 镜像
    volumes:
      - './:/app'
  • 创建完了直接 docker-compose up -d 一步启动~
  • 查看有没有报错可以 docker-compose logs -f

3. 搭建 openresty

  • 还是一样在服务器某个角落创建一个文件文件夹叫 docker-openresty(自己看着取名)
  • 创建一个 Dockerfile
FROM openresty/openresty
COPY conf/nginx.conf /usr/local/openresty/nginx/conf/nginx.conf
  • 创建一个 conf 文件夹,和 nginx.conf
worker_processes  16;        #nginx worker 数量
error_log /usr/local/openresty/nginx/logs/error.log;   #指定错误日志文件路径
events {
    worker_connections 1024;
}
stream {
    ## TCP 代理日志格式定义
    log_format tcp_proxy '$remote_addr [$time_local] '
                         '$protocol $status $bytes_sent $bytes_received '
                         '$session_time "$upstream_addr" '
                         '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
    ## TCP 代理日志配置
    access_log /usr/local/openresty/nginx/logs/access.log tcp_proxy;
    open_log_file_cache off;

    ## TCP 代理配置
    upstream backend{
        server 127.0.0.2:1101;# 爱写啥写啥  反正下面的代码也给你改了
        balancer_by_lua_block {
            -- 初始化balancer
            local balancer = require "ngx.balancer"
            local host = ""
            local port = 0
            host = ngx.ctx.proxy_host
            port = ngx.ctx.proxy_port
            -- 设置 balancer
            local ok, err = balancer.set_current_peer(host, port)
            if not ok then
                ngx.log(ngx.ERR, "failed to set the peer: ", err)
            end
        }
    }
    server {
        preread_by_lua_block{
            local redis = require("resty.redis")
            --创建实例
            local redis_instance = redis:new()
            --设置超时(毫秒)
            redis_instance:set_timeout(3000)
            --建立连接,请在这里配置Redis 的 IP 地址、端口号、密码和用到的 Key
            local rhost = "111.222.111.222" -- 👈👈👈 redis IP地址
            local rport = 6379 -- 👈👈👈 redis 端口
            local rpass = "xxxx" -- 👈👈👈 密码自己设置
            local rkey = "proxy:pool" -- 👈👈👈 跟你前面那个setting.py;里面的 TABLE_NAME 对好
            local ok, err = redis_instance:connect(rhost, rport)
            -- ngx.log(ngx.ERR, "connect redis: ", ok, " ", err)
            -- 如果没有密码,移除下面这一行
            local res, err = redis_instance:auth(rpass)
            local res, err = redis_instance:hkeys(rkey)
            if not res then
                ngx.log(ngx.ERR,"res num error : ", err)
                return redis_instance:close()
            end
            math.randomseed(tostring(ngx.now()):reverse():sub(1, 6))
            local proxy = res[math.random(#res)]
            local colon_index = string.find(proxy, ":")
            local proxy_ip = string.sub(proxy, 1, colon_index - 1)
            local proxy_port = string.sub(proxy, colon_index + 1)
            ngx.log(ngx.ERR,"redis data = ", proxy_ip, ":", proxy_port);
            ngx.ctx.proxy_host = proxy_ip
            ngx.ctx.proxy_port = proxy_port
            redis_instance:close()
        }
       # 下面是本机的端口,也就是爬虫固定写死的端口
       # 监听本机地址和端口,当使用keeplived的情况下使用keeplived VIP
       listen 0.0.0.0:6666; # 👈👈👈 这里可以不改
       proxy_connect_timeout 3s;
       proxy_timeout 10s;
       proxy_pass backend; #这里填写对端的地址
    }
}
  • 再创建一个文件叫做 docker-compose.yml
version: "3"
services:
  openresty:
    build: .
    restart: always
    container_name: openresty
    ports:
      # 端口自己配置,后面这个端口要和上面文件 listen 对应,前面的是宿主机映射的端口也就是最后我们代理地方填的端口
      - "5555:6666" # 👈👈👈 这里的 6666 可以不改, 5555 改成你想设置的
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./conf:/usr/local/openresty/nginx/conf # 方便你随时调整
      - ./logs:/usr/local/openresty/nginx/logs
  • 创建完了直接 docker-compose up -d 一步启动~
  • 都启动完了可以看看成果

image.png

  • 这里给个可视化免费的 redis 工具 👉👉👉 戳这里 👈👈👈

  • 随时查看你的代理池里面剩余的东西

image.png

4. 参考链接

来源:https://r3x5ur.me/docker-channel-proxy/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值