大量IP使用一个域名加端口进行复用的方法
本文最后更新于 2024-04-25,
若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益, 请联系我 删除。
本站只有Telegram群组为唯一交流群组, 点击加入
文章内容有误?申请成为本站文章修订者或作者? 向站长提出申请
前言
业务需求:
需要大量的IP进行业务操作(例如请求、爬虫)。且IP池需要分到地级市,并且不能在相近时间内复用。(隔天可以复用)。
实现方法:
使用nginx进行反向代理+负载均衡。尽量保证高可用性。
业务逻辑:
我使用python并配合以下思路处理业务:
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进行流量转发)
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果