Прокси в Ruby Faraday: настройка HTTP-клиента
Faraday — популярный HTTP-клиент в экосистеме Ruby: его используют в Rails-приложениях, гемах для API и скриптах мониторинга. Когда нужно скрыть исходный IP или распределить нагрузку между адресами, прокси подключается через опцию :proxy или кастомный middleware. Разберём рабочие конфигурации для NEONPROXY без лишней магии.
Базовая настройка HTTPS-прокси
После заказа вы получаете строку host:port:login:password. В Faraday URL прокси формируется так: http://login:password@host:port. Схема http:// в адресе прокси корректна даже для HTTPS-запросов — Faraday использует CONNECT-туннель.
Проверьте, что в ответе IP прокси, а не ваш домашний адрес. Если прокси игнорируется — убедитесь, что адаптер поддерживает proxy (Net::HTTP по умолчанию поддерживает).
SOCKS5 и выбор адаптера
Для SOCKS5 удобнее адаптер с явной поддержкой, например через gem socksify или Typhoeus. Формат URL: socks5://login:password@host:port. SOCKS5 полезен, когда приложение ходит на нестандартные порты или нужен единый туннель для нескольких протоколов. На тарифах NEONPROXY оба протокола доступны на одном адресе — выбирайте по требованиям библиотеки.
Middleware для ротации пула
При парсинге или массовых API-запросах один IP быстро упирается в rate limit. Создайте middleware, который перед каждым запросом подставляет следующий адрес из массива. Список адресов можно подгружать из API NEONPROXY при старте воркера Sidekiq или cron-задачи.
Faraday в Rails и фоновых задачах
В Rails прокси лучше хранить в credentials или ENV, а не хардкодить. Один worker process может переиспользовать Faraday::Connection — это экономит TCP-handshake. В Docker убедитесь, что контейнер резолвит host прокси и egress firewall не блокирует порт 8080 или 1080.
SSL, сертификаты и Faraday::SSLError
Не отключайте verify SSL при первой ошибке — чаще причина в неверном CA store, а не в прокси. Проверьте credentials через curl с теми же параметрами. Для Typhoeus включайте debug-логи только локально: URL с паролем в production-логах — риск утечки.
IPv4 или IPv6 под задачу
Массовый сбор JSON с публичных REST API — IPv6-пул с ротацией в middleware. OAuth-провайдер с привязкой к IP — один приватный IPv4. Sticky session на 15–30 минут полезна, если API выдаёт session cookie после первого запроса. Сравнение типов адресов — в материале IPv6 vs IPv4.
Типичные ошибки
Забытый open_timeout — скрипт «висит» на мёртвом прокси. Смешение Faraday-сессий с разными прокси в одном аккаунте соцсети — риск бана. Использование shared-канала для платёжных API. Передача реального IP в заголовках X-Forwarded-For.
Перед деплоем прогоните адреса через чекер и проверьте геолокацию через «Мой IP».
Faraday::Connection и повторные запросы
Оборачивайте нестабильные вызовы в retry с экспоненциальной паузой. При Faraday::ConnectionFailed или HTTP 429 переключайтесь на следующий прокси из пула, а не повторяйте запрос на том же IP десять раз подряд. Для production добавьте structured logging: proxy host (без пароля), status code, latency в миллисекундах, target URL path.
Gem faraday-retry удобен для idempotent GET, но для POST с side effects комбинируйте retry только при network errors, не при 4xx от origin. При парсинге маркетплейсов 403 часто означает «смените IP», а не «повторите через секунду».
Middleware для ротации: полный пример
Pool можно обновлять at runtime: при получении 407 или connection refused удаляйте адрес из массива и алертьте, если pool опустел ниже threshold. Для Sidekiq jobs передавайте connection factory, а не global singleton с одним proxy.
Тестирование и benchmark
Перед production load test прогоните 100 sequential requests через каждый proxy в pool и постройте histogram latency. Outlier с p99 > 3s исключите из rotation. Сравните throughput IPv6 vs IPv4 на вашем target domain — иногда IPv6 дешевле, но медленнее на legacy CDN. Документируйте baseline, чтобы при инциденте отличить деградацию прокси от падения target API.
Краткий чеклист
Разовые API-вызовы → один приватный IPv4, HTTPS. Массовый краулинг → IPv6 или shared с ротацией. Sidekiq + API → middleware + пул из API. Отладка → Faraday response logger только в dev.