Servidor proxy en PHP: cómo configurar proxies en PHP

Aprende a configurar un servidor proxy en PHP para mejorar el raspado web, garantizar la seguridad y evitar los bloqueos geográficos.
3 min read
PHP Proxy Server How to Set Up Proxies in PHP

Al conectarse a una red, una dirección IP actúa como un identificador único y esto facilita la comunicación y la identificación dentro de esa red y a través de internet. Un servidor proxy actúa como intermediario entre el dispositivo de un usuario e internet, lo que hace que mejore la seguridad, la privacidad y el rendimiento porque gestiona las solicitudes y oculta la dirección IP del usuario.

Los servidores proxy garantizan el anonimato y ayudan a filtrar las amenazas al enmascarar tu IP y al controlar el acceso al sitio web. En lo que respecta al raspado web, los servidores proxy tienen un papel fundamental porque ayudan a que los usuarios eludan las prohibiciones de IP y a evitar las medidas de bloqueo geográfico.  

En este tutorial, aprenderás más sobre los proxies y sobre cómo configurar un servidor proxy para el raspado web en PHP.

Usar un servidor proxy en PHP

Si quieres configurar un servidor proxy, puedes hacerlo de varias maneras. Puedes utilizar aplicaciones de servidor como Apache o Nginx como servidores proxy de reenvío, o puedes optar por herramientas de proxy especializadas como Squid. En este tutorial, vas a utilizar Apache como servidor proxy.

Para configurar un servidor proxy para el raspado web en PHP, tienes que asegurarte de que tienes instalado PHP en tu equipo. Si todavía no lo has instalado, sigue la guía oficial para hacerlo. En este artículo, el sistema operativo que se utiliza es Ubuntu. 

Configurar un servidor proxy con Apache

En Apache, los módulos mod_proxymod_proxy_httpmod_proxy_connect se pueden usar para hacer que Apache funcione como un servidor proxy.

Para configurar el servidor proxy, primero tienes que habilitar los módulos:

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_connect

Después, tienes que crear un archivo nuevo VirtualHost para definir el servidor proxy:

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

En el archivo proxy.conf, pega el siguiente código:

<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>

En este código, ProxyRequests On permite que Apache funcione como un servidor proxy de reenvío. ProxyVia On añade un encabezado Via que ayuda a inspeccionar la ruta de la solicitud en una cadena de proxies. Además, el  bloque de control indica quién puede acceder al proxy. Cualquier sistema central puede acceder al servidor proxy.

Para obtener más información, consulta la guía oficial.

Para terminar de configurar el servidor proxy, habilita VirtualHost:

sudo a2ensite proxy.conf
service apache2 reload

Usar el servidor proxy

En la siguiente sección, vas a aprender a usar el servidor proxy en código PHP. Por lo general, cualquier solicitud web o marco de automatización ofrece un mecanismo para configurar proxies. En este artículo, vas a conocer tres métodos: curl, file_get_contents y BrowserKit de Symfony.

Configurar proxies en curl

El primer método que vas a conocer te enseña a integrar proxies en tu secuencia de comandos PHP haciendo uso de la biblioteca cURLuna potente herramienta para realizar solicitudes HTTP.

Crea un archivo que se llame curl.php con el siguiente código:

<?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);

Esta secuencia de comandos inicia una sesión de curl, establece la URL del destino y la URL del proxy con curl_setopt y ejecuta la sesión para recuperar la respuesta. La opción CURLOPT_PROXY configura el proxy. La URL del proxy se establece en localhost:80 y aprovecha el proxy que creaste en el paso anterior.

Para hacerlo más simple, la secuencia de comandos también incluye opciones para deshabilitar la verificación SSL. No obstante, asegúrate de aplicas esto con cuidado cuando estés en un entorno de producción. Los errores de curl que se encuentran durante la ejecución se muestran para que puedas eliminarlos.

Ejecuta la secuencia de comandos con el comando php curl.php.

Después de ejecutar la secuencia de comandos, puedes inspeccionar el archivo de registro de acceso de Apache para rastrear la solicitud que se le ha hecho al proxy. Por lo general, el archivo de registro de acceso se encuentra en /var/log/httpd/access.log.

En este archivo de registro, vas a encontrar una entrada que utiliza el protocolo CONNECT, que se corresponde con la secuencia de comandos que has ejecutado y que indica que la solicitud se ha procesado correctamente con un código de estado HTTP de 200:

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

Configurar proxies en file_get_contents

También puedes usar file_get_contents para configurar proxies en PHP y, después, aprovechar el proxy de Apache para obtener el contenido.

Para ello, crea un archivo file_get_contents.php y añade el siguiente código:

<?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;
}

Este código PHP inicia una solicitud HTTP para recuperar los datos de http://wikipedia.org por medio un servidor proxy específico. La información del servidor proxy se configura en la matriz $options donde la clave «proxy» define la dirección del servidor (‘tcp://127.0.0.1:80’) y request_fulluri se establece en «true» y trata el URI de la solicitud como un URI completo.

Un contexto de flujo que añade estas opciones se crea al utilizar stream_context_create. La solicitud HTTP real se lleva a cabo con file_get_contents, que añade el contexto creado y recupera el contenido de HttpBin.

Configurar proxies en BrowserKit de Symfony

Si eres usuario de Symfony, puedes integrar proxies de forma fácil con BrowserKit.

Si quieres seguir el siguiente ejemplo y todavía no tienes instalado Symfony, asegúrate de instalarlo ahora.

Cuando hayas configurado Symfony, podrás usar proxies con facilidad en tu código 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;

Este bloque de código utiliza BrowserKit de Symfony y HttpClient para hacer una solicitud GET a HttpBin a través del proxy de Apache que se ha configurado en $proxyURL. Después, se recupera y se muestra el contenido de la respuesta. La instancia HttpBrowser se establece con la configuración de proxy que se ha especificado y esto facilita la integración de los proxies en las aplicaciones de Symfony.

Limitaciones de los métodos tradicionales para integrar proxies

Aunque la configuración de proxies en PHP puede parecer sencilla, cada uno de los distintos métodos tiene sus limitaciones. Por ejemplo, aunque se puede cambiar entre distintos proxies de forma manual, este es un método poco eficaz a la hora de extraer grandes cantidades de datos.

Además, si el proxy deja de estar disponible o la IP se restringe o encuentra problemas, estos métodos no ofrecen por sí solos un mecanismo para cambiar a un proxy alternativo de manera automática. Esto hace que se produzcan interrupciones del servicio o fallos en la recuperación de datos y hacen que sea necesaria una intervención manual Aunque puedes escribir código para cambiar de proxy de forma automática, es un proceso complejo y vas a tener que configurar o alquilar varios servidores proxy en distintas regiones geográficas para poder obtener la máxima seguridad posible.

La buena noticia es que Bright Data te puede ayudar.

El servidor proxy de Bright Data

Bright Data es una plataforma de extracción de datos web que ofrece herramientas para el raspado web y para recopilar datos a gran escala. Por ejemplo, la completa colección de servidores proxy de todo el mundo de Bright Data te permite acceder a diversas direcciones IP que pueden ayudarte a evitar los bloqueos geográficos y las prohibiciones de IP.

Además, los proxies bajo demanda de Bright Data te pueden servir para adquirir de forma dinámica los recursos que necesitas y cuando los necesitas. Todo esto es muy útil en casos de raspado web en los que tus requisitos varían porque garantiza un rendimiento y una capacidad de respuesta óptimos. Bright Data ofrece diferentes tipos de proxies (proxies residenciales, proxies de centros de datos, proxies de ISP y proxies móviles) para asegurarse de que tengas el proxy que mejor se adapte a tus necesidades.

Una de las principales ventajas de los recursos de Bright Data es la rotación automática de proxy, que contribuye a mejorar el anonimato y omite los riesgos de ser detectado cuando se llevan a cabo extracciones de datos web. Esta función, además del acceso a una red proxy avanzada de centros de datos con más de 770 000 direcciones IP en todo el mundo, hacen que Bright Data sea una excelente opción para la extracción de datos web.

Usar el proxy de Bright Data con PHP

Usar Bright Data es fácil. Lo único que tienes que hacer es registrarte para hacerte una cuenta gratuita.

Después de crear una cuenta, haz clic en Infraestructura de proxies y extracción en la barra lateral y, después, pulsa Empezar en el recuadro de Proxies residenciales:

Configurar el proxy residencial de Bright Data

Aquí puedes configurar el proxy, por ejemplo, eligiendo entre proxies exclusivos y compartidos

Elegir la configuración del proxy:

Cuando hayas elegido la configuración de proxy, activa el servicio de proxy haciendo clic en Guardar. Bright Data te ofrece unas credenciales únicas para iniciar sesión:

Iniciar sesión con las credenciales de Bright Data:

Puedes usar el proxy de Bright Data para extraer datos de Wikipedia usando la información de tu proxy de Bright Data. Empieza por crear un archivo scrape.php y añade el siguiente código:

<?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);

Comprueba que has reemplazado Your-proxy-url-from-the access-paramatersYour-usernameYour-password por tus credenciales concretas.

En este código, la información del proxy se integra en la solicitud curl para garantizar que el raspado web se haga por medio de la red proxy de Bright Data.

A continuación, ejecuta php scrape.php en tu terminal. Estos son los resultados que se han extraído:

Resultados de los datos extraídos de Wikipedia utilizando Bright Data

Para comprobar que ahora tus solicitudes se envían a través del proxy de Bright Data, puedes intentar enviar una solicitud GET a http://lumtest.com/myip.json. Si lo abres en tu navegador, responderá con un objeto JSON que contiene la información de tu ISP local.

Para probarlo con un proxy de Bright Data, guarda el siguiente código en un archivo PHP nuevo y ejecútalo:

<?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);

El resultado debe mostrar la ubicación y otros datos del proxy que se están utilizando:

{"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"}}

Esto indica que la solicitud se está enviando a través de los servidores proxy de Bright Data.

Conclusión

En este tutorial, has conocido varios métodos para configurar un servidor proxy en PHP. Aunque los servidores proxy locales con Apache son una buena opción, aprovechar los servidores proxy de Bright Data añaden un nivel mayor de eficiencia y de flexibilidad.

Los servidores proxy de Bright Data te facilitan una red de proxy mundial e integral y garantiza el acceso a una amplia gama de IP, incluidos proxies residenciales, de ISP, de centros de datos y móviles. Además, la rotación automática de Bright Data contribuye a mejorar el anonimato y omite los riesgos de ser detectado cuando se llevan a cabo extracciones de datos web.

Tanto si eres un principiante que busca lo sencillo como si eres un desarrollador con experiencia que necesita funciones avanzadas, los servidores proxy de Bright Data ofrecen una base sólida para llevar a cabo proyectos de extracción web que sean eficaces y que funcionen.