1. 什么是隧道代理池?
隧道代理是基于高性能主机构建的动态IP代理服务器;
以设置固定代理,每次请求自动更换到不同IP (这里规则可以自己定);
线路以高匿名、高便捷、多并发的优势,适用于个人/企业对代理稳定性和品质要求高的客户(主要看你代理池中的 IP 稳不稳定)。
2. 环境准备
- 服务器一台(最好是公网)
- docker & docker-compose
- 以及几个别人弄好的项目代码
- redis
- openresty
- proxy_pool
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
-
改动几个文件
-
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"
- 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" ]
- start.sh
#!/usr/bin/env bash
#之前是启动了两个服务现在我们只要调度器启动就可以了
#python proxyPool.py server & python proxyPool.py schedule
python proxyPool.py schedule
- 同目录下自己创建一个 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
一步启动~ - 都启动完了可以看看成果
-
这里给个可视化免费的 redis 工具 👉👉👉 戳这里 👈👈👈
-
随时查看你的代理池里面剩余的东西
4. 参考链接
- https://github.com/qishibo/AnotherRedisDesktopManager
- https://github.com/jhao104/proxy_pool
- https://juejin.cn/post/6988289418637344782
来源:https://r3x5ur.me/docker-channel-proxy/