PHP 프록시 서버: PHP에서 프록시 설정 방법

보안 강화 및 지역 차단을 극복하기 위한 향상된 웹 스크래핑을 위한 PHP 프록시 서버 설정 방법을 알아보세요.
1 분 읽기
PHP Proxy Server How to Set Up Proxies in PHP

네트워크에 연결할 때 IP 주소는 고유 식별자 역할을 하여 해당 네트워크 내부 및 인터넷 전반에서 통신과 식별을 용이하게 합니다. 프록시 서버는 사용자의 기기와 인터넷 사이의 중개자 역할을 하며, 요청을 관리하고 사용자의 IP 주소를 숨김으로써 보안, 개인 정보 보호 및 성능을 향상시킵니다.

프록시 서버는 IP를 가리고 웹사이트 접근을 제어함으로써 익명성을 보장하고 위협을 걸러내는 데 도움을 줍니다. 특히 웹 스크래핑과 관련해서는 프록시 서버가 IP 차단 우회 및 지역 제한 조치 회피에 중요한 역할을 합니다.

이 튜토리얼에서는 프록시에 대해 자세히 알아보고 PHP에서 웹 스크래핑을 위한 프록시 서버를 설정하는 방법을 배웁니다.

PHP에서 프록시 서버 사용하기

프록시 서버를 설정하려면 여러 방법이 있습니다. Apache나 Nginx 같은 서버 애플리케이션을 포워드 프록시 서버로 사용하거나 Squid 같은 전용 프록시 도구를 선택할 수 있습니다. 이 튜토리얼에서는 Apache를 프록시 서버로 사용할 것입니다.

PHP에서 웹 스크래핑을 위한 프록시 서버를 설정하려면 시스템에 PHP가 설치되어 있어야 합니다. 아직 설치하지 않았다면 공식 문서를 따라 설치하세요. 본 문서에서는 Ubuntu를 운영체제로 사용합니다.

Apache를 이용한 프록시 서버 설정

Apache에서는 mod_proxy, mod_proxy_http, mod_proxy_connect 모듈을 사용하여 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에서 프록시 설정하기

첫 번째 방법은 HTTP 요청을 생성하는 강력한 도구인 cURL 라이브러리를 사용하여 PHP 스크립트에 프록시를 통합하는 방법을 보여줍니다.

다음 코드로 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 세션을 시작하고, curl_setopt를 사용하여 대상 URL과 프록시 URL을 설정한 후, 응답을 가져오기 위해 세션을 실행합니다. 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에서 프록시 설정

PHP에서 file_get_contents를 사용하여 프록시를 설정하고 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://wikipedia.org에서 데이터를 가져오기 위한 HTTP 요청을 시작합니다. 프록시 서버 세부 정보는 $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 SymfonyComponentBrowserKitHttpBrowser;
use SymfonyComponentHttpClientHttpClient;

$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를 사용하여 $proxyUrl에 설정된 Apache 프록시를 통해 HttpBin에 GET 요청을 보냅니다. 그런 다음 응답 내용을 가져와 표시합니다. HttpBrowser 인스턴스는 지정된 프록시 설정으로 구성되어 Symfony 애플리케이션에 프록시를 쉽게 통합할 수 있습니다.

기존 프록시 통합 방식의 한계

PHP에서 프록시를 구성하는 것은 간단해 보일 수 있지만, 다양한 방법에는 특정 한계가 따릅니다. 예를 들어, 여러 프록시 간 수동 전환은 가능하지만 대량의 데이터를 스크래핑할 때는 비효율적인 접근 방식입니다.

또한 프록시 사용 불가, IP 제한 또는 문제 발생 시 자동으로 대체 프록시로 전환하는 메커니즘이 내재되어 있지 않습니다. 이로 인해 서비스 중단이나 데이터 검색 실패가 발생하며 수동 개입이 필요합니다. 자동 프록시 전환 코드를 작성할 수는 있지만 복잡한 과정이며, 최대 보안성을 위해 여러 지리적 지역에 걸쳐 다중 프록시 서버를 설정하거나 임대해야 합니다.

좋은 소식은 Bright Data가 도움을 드릴 수 있다는 점입니다.

Bright Data 프록시 서버

Bright Data는 대규모 웹 스크래핑 및 데이터 수집을 위한 도구를 제공하는 웹 데이터 추출 플랫폼입니다. 예를 들어, Bright Data의 강력한 글로벌 프록시 서버 컬렉션은 다양한 IP 주소에 대한 접근을 제공하여 지오블로킹 및 IP 차단 문제를 극복하는 데 도움을 줍니다.

또한 Bright Data의 온디맨드 프록시는 필요한 시점에 동적으로 자원을 확보할 수 있도록 지원합니다. 이는 요구 사항이 변동하는 웹 스크래핑 시나리오에서 최적의 성능과 응답성을 보장하는 데 유용합니다. Bright Data는 주거용 프록시, 데이터 센터 프록시, ISP 프록시, 모바일 프록시 다양한 유형의 프록시를 제공하여 사용 사례에 가장 적합한 프록시를 선택할 수 있도록 합니다.

Bright Data 솔루션의 주요 장점 중 하나는 자동화된 프록시 로테이션으로, 웹 스크래핑 활동 중 익명성을 강화하고 탐지 위험을 완화합니다. 전 세계 77만 개 이상의 IP를 보유한 고급 데이터 센터 프록시 네트워크 접근과 결합된 이 기능은 Bright Data를 웹 스크래핑에 탁월한 선택으로 만듭니다.

PHP에서 Bright Data 프록시 사용하기

Bright Data 사용법은 간단합니다. 무료 계정에 가입하기만 하면 됩니다.

계정 생성 후 사이드바에서 ‘프록시 및 스크래핑 인프라 ‘를 클릭하고 ‘주거용 프록시’ 아래 ‘시작하기’를 선택하세요:

Bright Data residential proxy configuration

여기서 전용 프록시와 공유 프록시 중 선택하는 등 프록시 설정을 구성할 수 있습니다:

Choosing the proxy configuration

프록시 구성을 선택한 후 ‘저장’을 클릭하여 프록시 서비스를 활성화하세요. Bright Data는 고유한 로그인 자격 증명을 제공합니다:

Bright Data login credentials

Bright Data 프록시 정보를 사용하여 위키피디아를 스크래핑할 수 있습니다. 먼저 scrape.php 파일을 생성하고 다음 코드를 추가하세요:

<?php

// BrightData 프록시 세부 정보
$proxyUrl = '접근 매개변수에서 제공된 프록시 URL';
$proxyUser = '사용자명:비밀번호';

$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 . "nn";

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

curl_close($ch);

Your-proxy-url-from-the access-paramaters, Your-username, Your-password를 반드시 본인의 실제 인증 정보로 교체하십시오.

이 코드에서는 웹 스크래핑이 Bright Data 프록시 네트워크를 통해 수행되도록 프록시 세부 정보가 curl 요청에 통합되어 있습니다.

다음으로 터미널에서 php scrape.php를 실행하세요. 스크래핑 결과는 다음과 같습니다:

Results of scraped data from Wikipedia using Bright Data

요청이 Bright Data 프록시를 통해 라우팅되는지 확인하려면 http://lumtest.com/myip.json로 GET 요청을 보내보세요. 브라우저에서 이 주소를 열면 로컬 ISP 정보가 포함된 JSON 객체가 응답됩니다.

Bright Data 프록시로 테스트하려면 다음 코드를 새 PHP 파일에 저장하고 실행하세요:

<?php

// BrightData 프록시 세부 정보
$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 오류: ' . 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 프록시 서버는 주거용, ISP, 데이터 센터모바일 프록시를 포함한 다양한 IP에 대한 액세스를 보장하는 포괄적인 글로벌 프록시 네트워크를 제공합니다. 또한 Bright Data 프록시 로테이션은 웹 스크래핑 활동 중 익명성을 강화하고 탐지 위험을 완화하는 데 기여합니다.

초보자가 간편함을 추구하든, 숙련된 개발자가 고급 기능을 필요로 하든, Bright Data 프록시 서버는 성공적이고 효율적인 웹 스크래핑 작업을 위한 견고한 기반을 제공합니다.