Прокси-сервер PHP: как настроить прокси-серверы в PHP

Узнайте, как настроить прокси-сервер PHP для улучшенного веб-парсинга, обеспечения безопасности и обхода геоблокировок.
1 min read
PHP Proxy Server How to Set Up Proxies in PHP

При подключении к сети IP-адрес служит уникальным идентификатором, облегчающим связь и идентификацию в этой сети и по всему Интернету. Прокси-сервер выступает в роли посредника между устройством пользователя и Интернетом, повышая безопасность, конфиденциальность и производительность, управляя запросами и скрывая IP-адрес пользователя.

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

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

Использование прокси-сервера в PHP

Если вы хотите настроить прокси-сервер, есть разные способы сделать это. В качестве прямых прокси-серверов можно использовать серверные приложения, такие как Apache или Nginx , или выбрать специальные прокси-инструменты, такие как Squid. В этом руководстве вы будете использовать Apache в качестве прокси-сервера.

Чтобы настроить прокси-сервер для веб-парсинга в PHP, вам необходимо убедиться, что в вашей системе установлен PHP. Если вы еще не установили его, следуйте инструкциям по установке в официальной документации. В этой статье в качестве операционной системы используется Ubuntu .

Настройка прокси-сервера с Apache

Модули mod_proxymod_proxy_httpи mod_proxy_connect в Apache можно использовать для придания Apache функции прокси-сервера.

Чтобы настроить прокси-сервер, необходимо сначала включить модули:

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_connect

Затем нужно создать новый файл VirtualHost , в котором вы определите прокси-сервер:

cd /etc/apache2/sites-available/
sudo cp 000-default.conf proxy.conf

Вставьте следующий код в файл proxy.conf:

<VirtualHost *:80>
    ServerName localhost
    ServerAdmin admin@localhost
    <IfModule mod_ssl.c>
            SSLEngine off
    </IfModule>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    ProxyRequests On
    ProxyVia On
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
</VirtualHost>

В этом коде функция ProxyRequests On позволяет Apache быть прямым прокси-сервером. ProxyVia On добавляет заголовок Via , который помогает проверить путь запроса в цепочке прокси-серверов. Кроме того, блок управления <Proxy> определяет, у кого есть доступ к прокси-серверу. Доступ к прокси-серверу разрешен любому хосту.

Для получения более подробной информации ознакомьтесь с официальной документацией.

Чтобы завершить настройку прокси-сервера, включите VirtualHost:

sudo a2ensite proxy.conf
service apache2 reload

Использование прокси-сервера

Из следующего раздела вы узнаете, как использовать прокси-сервер в PHP-коде. Как правило, любой веб-запрос или платформа автоматизации предоставляют механизм настройки прокси-серверов. Из этой статьи вы узнаете о трех методах: curl, file_get_contents и Symfony BrowserKit.

Настройка прокси-серверов в curl

Первый изучаемый метод позволит вам интегрировать прокси в PHP-скрипт с помощью библиотеки cURL , мощного инструмента для выполнения HTTP-запросов.

Создайте файл с именем curl.php со следующим кодом:

<?php

$proxyUrl = 'http://localhost:80';
$targetUrl = 'https://httpbin.org/get';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $targetUrl);
curl_setopt($ch, CURLOPT_PROXY, $proxyUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo 'cURL Error: ' . curl_error($ch);
} else {
    echo $response;
}

curl_close($ch);

Этот скрипт инициирует сеанс curl, задает целевой URL-адрес и URL-адрес прокси-сервера с помощью curl_setopt и выполняет сеанс для получения ответа. Опция CURLOPT_PROXY задает прокси-сервер. Для URL-адреса прокси-сервера установлено значение localhost:80, что позволяет использовать прокси-сервер, созданный на предыдущем этапе.

Для простоты скрипт также включает опции отключения проверки SSL. Однако в производственной среде соблюдайте осторожность. Любые ошибки curl, обнаруженные во время выполнения, отображаются в целях отладки.

Запустите скрипт командой php curl.php.

После выполнения сценария вы можете проверить файл журнала доступа Apache, чтобы отследить запрос, отправленный на прокси-сервер. Файл журнала доступа обычно находится по адресу /var/log/httpd/access.log.

В этом файле вы найдете запись с протоколом CONNECT, соответствующую выполненному сценарию и показывающую, что запрос был успешно обработан с кодом состояния HTTP 200:

127.0.0.1 - - [21/Dec/2023:12:34:56 +0530] "CONNECT httpbin.org:443 HTTP/1.1" 200 -

Задайте прокси-серверы в file_get_contents

Вы также можете использовать file_get_contents для настройки прокси-серверов в PHP, а затем воспользоваться прокси-сервером Apache для получения контента.

Для этого создайте файл file_get_contents.php и добавьте следующий код:

<?php

$options = [
    'http' => [
        'proxy' => 'tcp://127.0.0.1:80',
        'request_fulluri' => true,
    ],
];
$context = stream_context_create($options);

$response = file_get_contents('https://httpbin.org/get', false, $context);

if ($response === false) {
    echo "Failed to retrieve data from $url";
} else {
    echo $response;
}

Этот PHP-код инициирует HTTP-запрос для получения данных с адреса http://wikipedia.org с использованием указанного прокси-сервера. Сведения о прокси-сервере настраиваются в массиве $options , где ключ proxy определяет адрес сервера (tcp: //127.0.0.1:80), а request_fulluri имеет значение true, рассматривая URI запроса как полный URI.

Контекст потока, добавляющий эти опции, создается с помощью stream_context_create. Фактический HTTP-запрос выполняется с помощью file_get_contents, добавляя созданный контекст и извлекая контент из HttpBin.

Настройка прокси-серверов в Symfony BrowserKit

Если вы являетесь пользователем Symfony , вы можете очень просто интегрировать прокси-серверы с помощью BrowserKit.

Если вы хотите продолжить работу, но у вас еще не установлено Symfony, установите его сейчас.

После настройки Symfony вы можете легко использовать прокси-серверы в своем PHP-коде:

<?php

require './vendor/autoload.php';

use Symfony\Component\BrowserKit\HttpBrowser;
use Symfony\Component\HttpClient\HttpClient;

$proxyServer = 'http://127.0.0.1';
$proxyPort = '80';

$client = new HttpBrowser(HttpClient::create(['proxy' => sprintf('%s:%s', $proxyServer, $proxyPort)]));

$client->request('GET', 'https://httpbin.org/get');

$content = $client->getResponse()->getContent();

echo $content;

Этот блок кода использует Symfony BrowserKit и HttpClient для отправки запроса GET на адрес HttpBin через прокси-сервер Apache, настроенный по адресу $proxyUrl. Затем содержимое ответа извлекается и отображается. Экземпляр HttpBrowser задан с указанными настройками прокси-сервера, что упрощает интеграцию прокси-серверов в приложения Symfony.

Ограничения традиционных методов интеграции прокси-сервера

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

Кроме того, если прокси-сервер становится недоступен, IP-адрес получает бан или возникают проблемы, эти методы по своей сути не обеспечивают механизма автоматического переключения на альтернативный прокси-сервер. Это приводит к перебоям в обслуживании или сбоям при извлечении данных, требующим ручного вмешательства. Хотя вы можете написать код для автоматического переключения прокси-серверов, это сложный процесс, и для обеспечения максимальной безопасности вам придется настроить или арендовать несколько прокси-серверов в разных географических регионах.

Хорошая новость: вам может помочь Bright Data.

Прокси-сервер Bright Data

Bright Data — это платформа для извлечения веб-данных, которая предлагает инструменты для веб-парсинга и масштабного сбора данных. Например, обширная коллекция прокси-серверов Bright Data по всему миру предоставляет вам доступ к различным IP-адресам, которые помогут вам обойти геоблокировку и баны IP-адресов.

Кроме того, прокси-серверы по запросу от Bright Data помогут вам динамически получать необходимые ресурсы в нужное время. Это полезно в сценариях веб-парсинга, где ваши требования меняются, и обеспечивает оптимальную производительность и скорость реагирования. Bright Data предлагает различные типы прокси-серверов (а именно резидентные прокси-серверы, прокси-серверы центров обработки данных, прокси-серверы интернет-провайдеров и мобильные прокси-серверы). Это гарантирует, что вы найдете прокси-сервер, наиболее подходящий для вашей ситуации.

Одним из основных преимуществ решения Bright Data является автоматическая ротация прокси-серверов, которая способствует повышению анонимности и снижает риски обнаружения при веб-парсинге. Эта функция в сочетании с доступом к передовой прокси-сети центров обработки данных, насчитывающей более 770 000 IP-адресов по всему миру, делает Bright Data превосходным выбором для веб-парсинга.

Использование прокси-сервера Bright Data с PHP

Использовать Bright Data очень просто. Все, что вам нужно сделать, — это зарегистрировать бесплатный аккаунт.

После создания аккаунта нажмите на «Прокси-серверы и инфраструктура парсинга» на боковой панели, а затем выберите «начало работы» в разделе «Резидентные прокси-серверы»:

Конфигурация резидентного прокси-сервера Bright Data

Здесь вы можете настроить прокси-сервер, например, выбрать между выделенными и общими прокси-серверами :

Выбор конфигурации прокси-сервера:

Выбрав конфигурацию прокси-сервера, активируйте прокси-сервис, нажав «Сохранить». Bright Data предоставляет вам уникальные учетные данные:

Учетные данные для входа Bright Data:

Данные прокси-сервера Bright Data позволяют вам использовать его для парсинга «Википедии». Начните с создания файла scrape.php и добавьте следующий код:

<?php

// BrightData proxy details
$proxyUrl = 'Your-proxy-url-from-the access-paramaters';
$proxyUser = 'Your-username:Your-password';

$targetUrl = 'https://en.wikipedia.org/wiki/Proxy_server';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $targetUrl);
curl_setopt($ch, CURLOPT_PROXY, $proxyUrl);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyUser);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo 'cURL Error: ' . curl_error($ch);
} else {
    $dom = new DOMDocument();
    @$dom->loadHTML($response);

    $content = $dom->getElementById('mw-content-text')->textContent;

    $headings = [];
    $headingsNodeList = $dom->getElementsByTagName('h2');
    foreach ($headingsNodeList as $heading) {
        $headings[] = $heading->textContent;
    }

    $headingsNodeList = $dom->getElementsByTagName('h3');
    foreach ($headingsNodeList as $heading) {
        $headings[] = $heading->textContent;
    }

    echo "Content:\n";
    echo $content . "\n\n";

    echo "Headings:\n";
    foreach ($headings as $index => $heading) {
        echo ($index + 1) . ". $heading\n";
    }
}

curl_close($ch);

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

В этом коде данные прокси-сервера интегрированы в запрос curl, чтобы веб-парсинг выполнялся через прокси-сеть Bright Data.

Затем запустите php scrape.php в своем терминале. Вот результаты анализа парсинга:

Результаты парсинга данных из «Википедии» с использованием Bright Data

Чтобы убедиться, что теперь ваши запросы маршрутизируются через прокси-сервер Bright Data, попробуйте отправить запрос GET по адресу http://lumtest.com/myip.json. Если вы откроете его в своем браузере, в ответ появится объект JSON, содержащий сведения о вашем локальном интернет-провайдере.

Чтобы попробовать его на прокси-сервере Bright Data, сохраните следующий код в новом PHP-файле и запустите его:

<?php

// BrightData proxy details
$proxyUrl = 'brd.superproxy.io:22225';
$proxyUser = 'brd-customer-hl_0c2320f1-zone-residential_proxy1:j30hm0h2pqde';

$targetUrl = 'http://lumtest.com/myip.json';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $targetUrl);
curl_setopt($ch, CURLOPT_PROXY, $proxyUrl);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyUser);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo 'cURL Error: ' . curl_error($ch);
} else {
    echo $response;
}

curl_close($ch);

В выходных данных должно быть указано местоположение и другие сведения об используемом прокси-сервере:

{"ip":"91.66.16.153","country":"DE","asn":{"asnum":3209,"org_name":"Vodafone GmbH"},"geo":{"city":"Berlin","region":"BE","region_name":"Land Berlin","postal_code":"12205","latitude":52.428,"longitude":13.3095,"tz":"Europe/Berlin","lum_city":"berlin","lum_region":"be"}}

Это подтверждает, что запрос действительно маршрутизируется через прокси-серверы Bright Data.

Заключение

Это руководство помогло вам изучить различные методы настройки прокси-сервера в PHP. Хотя можно использовать локальные прокси-серверы с Apache, применение прокси-серверов Bright Data обеспечивает новый уровень эффективности и универсальности.

Прокси-серверы Bright Data предоставляют вам комплексную глобальную прокси-сеть, обеспечивающую доступ к разнообразным IP-адресам, включая резидентные прокси-серверы, прокси-серверы интернет-провайдеров, прокси-серверы центров обработки данных и мобильные прокси-серверы. Кроме того, ротация прокси-серверов Bright Data способствует повышению анонимности и снижению рисков обнаружения при веб-парсинге.

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