本文最后更新于 2024-04-25,

若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益, 请联系我 删除。

本站只有Telegram群组为唯一交流群组, 点击加入

文章内容有误?申请成为本站文章修订者或作者? 向站长提出申请

前言

业务需求:

需要大量的IP进行业务操作(例如请求、爬虫)。且IP池需要分到地级市,并且不能在相近时间内复用。(隔天可以复用)。

实现方法:

使用nginx进行反向代理+负载均衡。尽量保证高可用性。

业务逻辑:

我使用python并配合以下思路处理业务:

1714052180785.webp

IP替换脚本

import os
import re
import random

def load_ips_from_section(filename, section):
    """ 从文件中加载指定区域的 IP 地址列表 """
    with open(filename, 'r') as file:
        content = file.readlines()
  
    capturing = False
    ips = []
    for line in content:
        line = line.strip()
        if line == section:
            capturing = True
        elif line in ['henan', 'hebei', 'beijing']:  # 列出所有可能的区域
            if capturing:
                break
            capturing = False
        elif capturing:
            ips.append(line)
    return ips

def replace_ip_in_file(file_path, new_ips):
    """ 替换文件中的 IP 地址 """
    with open(file_path, 'r') as file:
        content = file.read()

    ips_found = re.findall(r'\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b', content)
    if not ips_found:
        return  # 如果没有找到IP,则不作更改

    new_ip = random.choice(new_ips)  # 从'hebei'区域的IP中随机选择一个
    new_content = re.sub(r'\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b', new_ip, content)

    with open(file_path, 'w') as file:
        file.write(new_content)

def main():
    nginx_config_directory = '/root/proxy/config'
    ip_file = '/root/proxy/ip.txt'
  
    # 加载 'hebei' 区域的 IP 地址
    hebei_ips = load_ips_from_section(ip_file, 'hebei')

    # 搜索和替换指定端口范围内的配置文件
    port_pattern = re.compile(r'listen\s+(\d{5});')
    for filename in os.listdir(nginx_config_directory):
        file_path = os.path.join(nginx_config_directory, filename)
        with open(file_path, 'r') as file:
            contents = file.read()
            matches = port_pattern.findall(contents)
            if any(12345 <= int(port) <= 12355 for port in matches):
                replace_ip_in_file(file_path, hebei_ips)

if __name__ == "__main__":
    main()
'''脚本说明:
load_ips_from_section:这个函数负责从 ip.txt 文件中加载属于特定区域(如 'hebei')的 IP 地址。
replace_ip_in_file:这个函数将在给定的文件中查找所有 IP 地址,并将它们全部替换为从 'hebei' 区域随机选取的一个新 IP 地址。
main:这个函数首先加载所需的 IP 地址,然后遍历 Nginx 配置目录中的所有文件,查找其中的 listen 指令以确定它们是否监听在 12345 到 12355 端口范围内的某个端口。如果是,就对该文件执行 IP 替换操作。
确保在实际部署前修改 nginx_config_directory 和 ip_file 的路径以正确指向您的配置文件和 IP 列表文件。此外,如果文件较大或存在多个 listen 指令,可能需要对脚本进行适当调整以更有效地处理这些情况。
'''

在编写IP池时,需要按地级市进行区分,并且将所有的条件都写入到脚本内,例如:"guangzhou","shenzhen","dongguan".然后在他们下面带上相应的ip即可做到按地级市区分ip池替换。

nginx配置文件

server {
    listen 12345;             # Port
    server_name ggbond.com;   # Domain

    location / {
        proxy_pass http://114.114.114.114:10086;  # 代理到目标IP和端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_buffers 16 4k;
        proxy_buffer_size 2k;

        proxy_connect_timeout 10s;
        proxy_read_timeout 10s;
        proxy_send_timeout 10s;
    }
}


listen端口尤为重要,他关系到你使用ip:端口能够代理到对应的什么位置,例如我访问ggbond.com:12345,则指向到114.114.114.114:10086流量上处理业务。

负载均衡

http {
    upstream myapp {
        server A.ggbod.com;
        server B.ggbod.com;
        server C.ggbod.com;
        server D.ggbod.com;
    }

    server {
        listen 80;    # 根据需要更改监听端口
        server_name ggbod.com;  # 用你的域名替换

        location / {
            proxy_pass http://myapp;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}


使用4台相同配置的服务器进行负载均衡,你需要在dns解析中配置好相应的ip才可以使用。以保证高可用性。(可以的话使用集群进行热备。当master挂掉后可以马上切换到slaver进行流量转发)