LINUX.ORG.RU
решено ФорумAdmin

1 сервер и много IP адресов, Python

 , ,


0

1

Всем привет!

Разрабатываю сейчас сайт, который взаимодействет с другим API.

У API есть лимит на количество запросов в минуту с одного IP адреса.

При этом буду делать запросы с разными API ключами - проблема в том, что лимит на кол-во запросов с 1 IP в минуту. Хочу это решить путём запуска различных самописных процессоров на Python на разных IP.

Процессор (программа на Python) раз в сколько-то секунд делает запрос к API и обновляет информацию в базе.

Различные процессоры буду запускать в разных докер контейнерах.

Допустим, я на свой сервер закупил дополнительные IP адреса.

Достаточно ли будет просто настроить на уровне докер контейнера что-то вроде такого?

docker run -d –name iperf_srv –network mynet –ip 10.195.10.10 astotal/iperf3 -s

Или надо будет ещё делать дополнительные настройки на стороне линукса - или даже в Python коде что-то дополнительно настраивать?

Подскажите пожалуйста, кто в курсе - какой стандартный подход к решению моей проблемы?



Последнее исправление: DigitalBerd (всего исправлений: 2)

Стандартный подход: купить у поставщика услуги больший лимит на один IP. Скорей всего это будет даже дешевле, чем пачка IPv4 – они сейчас довольно дорогие и больше 4 шт. в руки вам могут просто не отгрузить без обоснования.

BOOBLIK ★★★★
()
Ответ на: комментарий от BOOBLIK

пачка IPv4 – они сейчас довольно дорогие и больше 4 шт. в руки вам могут просто не отгрузить без обоснования.

Враньё. Главное чтоб оплата была, в сколько в руки никого не волнует. И не такие уж дорогие. По сравнению с остальными затратами на работу любого сервиса можно сказать бесплатные.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от BOOBLIK

Поставщик услуги в принципе не готов к диалогу никак - есть ограничение API и исключения не делают ни для кого… Так то мне проще было бы денег им дать умеренно - чем кучу времени тратить на это…

DigitalBerd
() автор топика
import requests


def session_for_src_addr(addr: str) -> requests.Session:
    """
    Create `Session` which will bind to the specified local address
    rather than auto-selecting it.
    """
    session = requests.Session()
    for prefix in ('http://', 'https://'):
        session.get_adapter(prefix).init_poolmanager(
            # those are default values from HTTPAdapter's constructor
            connections=requests.adapters.DEFAULT_POOLSIZE,
            maxsize=requests.adapters.DEFAULT_POOLSIZE,
            # This should be a tuple of (address, port). Port 0 means auto-selection.
            source_address=(addr, 0),
        )

    return session


# usage example:
s = session_for_src_addr('192.168.1.12')
s.get('https://httpbin.org/ip')

https://stackoverflow.com/questions/48996494/send-http-request-through-specific-network-interface

IIIypuk ★★★★
()
Последнее исправление: IIIypuk (всего исправлений: 1)

Достаточно ли будет просто настроить на уровне докер контейнера что-то вроде такого?

Всё чаще замечаю, что тривиальные задачи пытаются решать через Docker, которые можно решить парой строчек кода. У части населения уже докер головного мозга.
Скоро срать без докера не сможете

IIIypuk ★★★★
()

Скормите питону побольше проксей и усё. Не нужно эти докеры-шмокеры теребить, от них датацентры греются, что влияет на климат планеты не самым лучшим образом!

mydibyje ★★★★
()
Последнее исправление: mydibyje (всего исправлений: 1)
Ответ на: комментарий от IIIypuk

Спасибо за подсказку! Докер хотел использовать - чтобы не лазать по проекту и не исправлять везде, где к API обращаюсь… Видимо, придётся переписывать и в самом деле…

DigitalBerd
() автор топика

Подскажите пожалуйста, кто в курсе - какой стандартный подход к решению моей проблемы?

Купить proxy и не заморачиваться с покупкой айпишников у провайдера. Цену вопроса можно посмотреть, например, тут https://proxy6.net/

requests в python отлично работает с http проксями.

Norgat ★★★★★
()
20 июня 2024 г.

Потратил суммарно часов 30-40, но проблему решил.

Описанный тут код отлично работает, когда надо просто с сервера запустить. Когда пробовал с докера на сервере запустить - всё падает с ошибкой:

urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host=‘checkip.dyndns.org’, port=80): Max retries exceeded with url: / (Caused by NewConnectionError(‘<urllib3.connection.HTTPConnection object at 0x7fd80a6db390>: Failed to establish a new connection: [Errno 99] Cannot assign requested address’))

Почему это происходит - потому что у докера своя сеть. Пришлось очень много всего попробовать, пока удалось сделать, чтобы заработало.

  1. Необходимо добавить все ваши IP адреса на сервер (вот инструкция: Добавил пул ip адресов на сервер - но почему-то не работает, подскажите плиз (комментарий))

  2. Если создавать докер контейнер с указанием IP адреса - то не работает. И вообще без дополнительный настроек из дефолтного докера этот код будет падать с этой ошибкой.

  3. Создание дополнительных сетей внутри докера и коннект их к контейнеру - не помог - та же ошибка. Даже если это сеть ipvlan

  4. Если решите тоже отдельные контейнеры в докере настраивать, то обязательно смотрите это видео, для понимания, что происходит: https://www.youtube.com/watch?v=ctJnI43ermQ

  5. Как в итоге удалось этот код запускать из контейнера:

docker run –network=host –name test_container test_image

и никакие дополнительные ip при запуске контейнера не указываете - иначе тоже ошибки. В итоге если запустите контейнер из сети host - и этот адрес будет добавлен на сервер (вот инструкция: Добавил пул ip адресов на сервер - но почему-то не работает, подскажите плиз (комментарий)) - то всё будет работать как надо. Т.е. контейнер будет работать в той же сети, что и сервер - и оттуда этот код уже сможет выполниться и запустить запрос с нужного ip адреса.

DigitalBerd
() автор топика