Haproxy: ротация socks-прокси

Привет, дорогой читатель! Сегодня будет полезный пост.
На днях купил подписку на прокси для парсинга. Все круто, все работает, но пробема в том, что парсить мне нужно минимум с двух серверов, а в идеале еще и зенкой. А работают эти прокси только с одним IP. Косяк. И прикручивать ротатор на PHP к существующему скрипту ой как лениво. Так что будем обходить это ограничение максимально просто и эффективно.
Итак, допустим мы уже имеем впс с установленным пакетом. Если нет, то гуглим инструкцию для своей ОС и ставим. Я все буду рассматривать на примере Centos 7 x64.

Сохраняем болванку конфига в /etc/src.cfg

global
 chroot /var/lib/haproxy
 pidfile /var/run/haproxy.pid
 maxconn 400000
 user haproxy
 group haproxy
 daemon

stats socket /var/lib/haproxy/stats

defaults
 timeout connect 5000
 timeout client 50000
 timeout server 50000

listen stats ВНЕШНИЙ_ИП_СЕРВЕРА:ПОРТ_СТАТИСТИКИ
 mode http
 log global
 maxconn 10
 stats enable
 stats hide-version
 stats refresh 30s
 stats show-node
 stats auth ЛОГИН_АДМИНА:ПАРОЛЬ_АДМИНА
 stats uri /haproxy

frontend rotatingproxies
 mode tcp
 #bind 127.0.0.1:4000
 bind ВНЕШНИЙ_ИП_СЕРВЕРА:ПОРТ_ПОДКЛЮЧЕНИЯ
 maxconn 2000000
 default_backend proxys

backend proxys
 #пример строки без проверки состояния
 #server ПРОКСИ_ИП:ПОРТ ПРОКСИ_ИП:ПОРТ
 #пример строки с проверкой состояния
 #server ПРОКСИ_ИП:ПОРТ ПРОКСИ_ИП:ПОРТ check
 balance leastconn

Немного пояснений.
listen stats ВНЕШНИЙ_ИП_СЕРВЕРА:ПОРТ_СТАТИСТИКИ
Статистика. Пользы особо нет, но посмотреть приятно. Имеет смысл только если мы проверяем прокси, иначе увидим только объем трафа.

bind ВНЕШНИЙ_ИП_СЕРВЕРА:ПОРТ_ПОДКЛЮЧЕНИЯ
IP, который будет принимать подключения. Не забываем, кстати открывать порты!

backend proxys
Это и есть секция прокси. Тут указываем список проксей в указанном формате, примеры есть. Ротироваться они будут по количеству подключений (balance leastconn — ну вот нравится мне так, можете менять на свое усмотрение)

Дальше разберемся с обновлением списка проксей. Берем прямую ссылку на список, и вставляем ее в bash-скрипт /root/getproxy.sh

с проверкой «живости» прокси

#!/bin/bash
 curl -o /root/tmp.txt 'вставляем_ссылку_сюда'
 if [ -e "/root/tmp.txt" ]; then
 cp -f /etc/haproxy/src.cfg /etc/haproxy/haproxy.cfg
 sed -i 's/\r$//' /root/tmp.txt
 FILE=/root/tmp.txt
 while read line; do
 echo 'server '$line $line ' check'>> /etc/haproxy/haproxy.cfg
 done < $FILE
 /sbin/service haproxy restart
 fi
 rm -f /root/tmp.txt

без проверки «живости» прокси (предпочитаемый)

#!/bin/bash
 curl -o /root/tmp.txt 'вставляем_ссылку_сюда'
 if [ -e "/root/tmp.txt" ]; then
 cp -f /etc/haproxy/src.cfg /etc/haproxy/haproxy.cfg
 sed -i 's/\r$//' /root/tmp.txt
 FILE=/root/tmp.txt
 while read line; do
 echo 'server '$line $line>> /etc/haproxy/haproxy.cfg
 done < $FILE
 /sbin/service haproxy restart
 fi
 rm -f /root/tmp.txt

Неплохо бы еще проверить есть ли курл на сервере и как он выкачивает список

curl -o /root/tmp.txt 'вставляем_ссылку_сюда' && cat /root/tmp.txt

Если все ок, то сохраняем и даем права на выполнение

Чтобы все это выполнялось регулярно, делаем задание в кроне

*/10 * * * * root /root/getproxy.sh

Да, у меня все файлы лежат в корневой директории рута. Не секурно, но мне пох, проблем еще ни разу не было и не откуда им тут взяться.

Ну и запускаем наш скрипт

./getproxy.sh

проверяем, запустился ли haproxy

systemctl status haproxy

Если active (alive) и зеленая точка — то все ок.

Проверяем коннект и ротацию (НЕ ЗАБЫВАЕМ ПОРТЫ ОТКРЫТЬ!!!!)

curl --socks5 ВНЕШНИЙ_ИП_СЕРВЕРА:ПОРТ_ПОДКЛЮЧЕНИЯ -o /dev/null ifconfig.co

в консоли должен отобразиться IP, через который ушел запрос

И о подводных камнях.

Когда я попытался завести такой сервис на OVH, мне моментально заблокировали сервер за огромное количество подключений (чуть больше 1000), но конфиг у меня был с проверкой состояния. Сейчас впс с ротатором у другого хостера, и ему пофиг: что есть проверка, что ее нет. Но все же рекомендую при большом количестве прокси использовать конфиг без проверки состояния.
И по максимальному количеству прокси. Я проверял на пакетах в 1000 ип: все было ок, больше мне не требовалось, но думаю работать должно.
Эта схема больше под парсинг, потому как работать сможет не весь софт.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *