В продолжение статьи про балансировку нагрузки в 3proxy, конфигурацию 3proxy можно обновлять динамически, добавляя в неё проксики и перезапуская сервис. на примере скрипт-демон, который это делает на bash из бесплатных прокси(качество этих прокси оставляет желать лучшего):
#!/bin/bash
# Функция для загрузки прокси и добавления префикса
download_proxies() {
local url=$1
local type=$2
curl -s $url | while read -r line; do
echo "$type:$line"
done
}
while true; do
# Загружаем прокси
http_proxies=($(download_proxies "https://raw.githubusercontent.com/monosans/proxy-list/main/proxies_anonymous/http.txt" "http"))
socks4_proxies=($(download_proxies "https://raw.githubusercontent.com/monosans/proxy-list/main/proxies_anonymous/socks4.txt" "socks4"))
socks5_proxies=($(download_proxies "https://raw.githubusercontent.com/monosans/proxy-list/main/proxies_anonymous/socks5.txt" "socks5"))
# Объединяем все прокси в один массив
all_proxies=("${http_proxies[@]}" "${socks4_proxies[@]}" "${socks5_proxies[@]}")
# Подсчитываем общее количество прокси
total_proxies=${#all_proxies[@]}
# Рассчитываем вес
weight=$((1000 / total_proxies))
# Перемешиваем прокси
shuffled_proxies=($(for i in "${all_proxies[@]}"; do echo $i; done | shuf))
# Создаем файл конфигурации
{
echo "nscache 65536"
echo "nserver 8.8.8.8"
echo "nserver 8.8.4.4"
echo ""
echo "log /logs/3proxy-%y%m%d.log D"
echo ""
echo "auth iponly"
echo "allow *"
for proxy in "${shuffled_proxies[@]}"; do
IFS=':' read -ra proxy_parts <<< "$proxy"
type=${proxy_parts[0]}
ip=${proxy_parts[1]}
port=${proxy_parts[2]}
echo "parent $weight $type $ip $port"
done
echo ""
echo "timeouts 10 15 30 60 180 1800 15 60"
echo "proxy -p3128 -i127.0.0.1"
} > /etc/3proxy/conf/3proxy.cfg
service 3proxy stop
sleep 5
service 3proxy start
# Выводим общее количество прокси и рассчитанный вес
# echo "Total proxies: $total_proxies"
# echo "Weight: $weight"
# echo "Configuration saved to 3proxy.cfg"
# Пауза на 30 минут
sleep 1800
done
Скрипт рассчитывает вес и распределяет их по всем прокси. В данном случае не предусмотрено, что их общее количество будет более 1000, поэтому это чревато ошибкой конфига, если источники будут другими или общее количество превысит суммарный вес в 1000.
Чтобы запустить данный демон из другого скрипта или cli, не забываем как правильно отвалиться от исполняемого потока. В данном случае так:
./proxy.sh >/dev/null 2>&1 &
на /dev/null нужно направлять не только стандартный поток вывода(0), но и поток ошибок(2).