このLaravelプロキシ統合ガイドが終わる頃には、あなたは理解しているでしょう:
- プロキシとは何か、Laravelでどのように機能するか
- いつ、そしてなぜ必要なのか
- Laravelプロジェクトでプロキシを設定する方法
- Laravelでプロキシ認証、SSL証明書の問題、IPローテーションを処理する方法
- symfony の
HttpClient
コンポーネントにプロキシを統合する方法
さあ、飛び込もう!
Laravelプロキシとは?
Laravelプロキシは、Laravelバックエンドと外部サーバー間の仲介役として機能します。IPアドレスを隠すために、プロキシサーバーを介してサーバーのトラフィックをプログラムでルーティングすることができます。
以下は、Laravelにおけるプロキシの仕組みです:
- Laravelは、プロキシが設定されたHTTPクライアント・ライブラリを使用してHTTPリクエストを送信します。
- リクエストはプロキシサーバーを経由する。
- プロキシはそれを宛先サーバーに転送する。
- デスティネーションサーバーはプロキシに応答する。
- そして、プロキシはレスポンスをLaravelに返します。
その結果、宛先サーバーは、あなたのLaravelサーバーではなく、プロキシのIPから来たリクエストを見ることになります。この仕組みは、地域制限の回避、匿名性の向上、レート制限の管理に役立ちます。
Laravelにおけるプロキシの使用例
Laravelのプロキシは多くのシナリオで役に立ちますが、この3つが最も一般的です:
- ウェブスクレイピングウェブスクレイピングAPIを構築する際、IPバン、レート制限、その他のブロックを回避するためにプロキシを使用します。詳しくは、Laravelを使ったウェブスクレイピングのチュートリアルをお読みください。
- サードパーティAPIのレート制限を回避:プロキシIPをローテーションさせ、API使用クォータ内にとどまり、スロットリングを回避する。
- 地域制限のあるコンテンツへのアクセス特定の国でしか利用できないサービスにアクセスするために、特定の地域のプロキシサーバーを選択します。
より多くの例については、ウェブデータとプロキシの使用例に関するガイドを参照してください。
Laravelでプロキシを使う:ステップバイステップガイド
このセクションでは、デフォルトのHTTPクライアントを使用してLaravelにプロキシを統合する方法を示します。symfonyHttpClientの
ユーザーであれば、記事の後半でそのライブラリを使ったプロキシの統合をカバーするので心配しないでください。
注:LaravelのHTTPクライアントはGuzzleの上に構築されているので、Guzzleプロキシ統合ガイドを確認するとよいでしょう。
統合を実証するために、GET
/api/v1/get-ip
エンドポイントを作成する:
- 設定されたプロキシを使って
https://httpbin.io/ip
にGET
リクエストを送る。 - 応答から終了 IP アドレスを取得します。
- Laravelエンドポイントを呼び出したクライアントにそのIPを返します。
すべてが正しく設定されていれば、そのAPIが返すIPはプロキシのIPと一致する。
始めよう!
ステップ1:プロジェクトのセットアップ
すでにLaravelアプリケーションをセットアップしている場合は、このステップを飛ばしてステップ#2に進んでください。
そうでない場合は、以下の手順に従って新しいLaravelプロジェクトを作成してください。ターミナルを開き、以下のComposercreate-command
コマンドを実行して、新しいLaravelプロジェクトを初期化します:
composer create-project laravel/laravel laravel-proxies-application
このコマンドは、laravel-proxy-applicationという
フォルダに新しいLaravelプロジェクトを生成します。このフォルダをお好みのPHP IDEで開いてください。
この時点で、上記のフォルダにはデフォルトのLaravelファイル構造が含まれているはずです:
素晴らしい!これでLaravelプロジェクトが完成しました。
ステップ2: テストAPIエンドポイントの定義
プロジェクトディレクトリで、以下のArtisanコマンドを実行し、新しいコントローラを生成します:
php artisan make:controller IPController
これで、/app/Http/Controllers
ディレクトリにIPController.php
という名前のファイルが作成され、このデフォルトの内容になります:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class IPController extends Controller
{
//
}
次に、以下のgetIP()
メソッドをIPController.php
に追加します:
public function getIP(): JsonResponse
{
// make a GET request to the "/ip" endpoint to get the IP of the server
$response = Http::get('https://httpbin.io/ip');
// retrieve the response data
$responseData = $response->json();
// return the response data
return response()->json($responseData);
}
このメソッドは、LaravelのHttp
クライアントを使用して、https://httpbin.io/ip
からIPアドレスを取得し、JSONとして返します。
この2つのインポートをお忘れなく:
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Http;
LaravelアプリケーションにステートレスAPIを提供したいので、install:api
Artisanコマンドを使用してAPIルーティングを有効にします:
php artisan install:api
APIエンドポイントを介してこのメソッドを公開するには、routes/api.php
ファイルに以下のルートを追加します:
use App\Http\Controllers\IPController;
Route::get('/v1/get-ip', [IPController::class, 'getIP']);
新しいAPIエンドポイントにアクセスできるようになります:
/api/v1/get-ip
注意:Laravelの各APIは、デフォルトでは/api
パスで利用可能であることに留意してください。
api/v1/get-ip
エンドポイントをテストする時間だ!
Laravel開発サーバーを起動します:
php artisan serve
これでサーバーはポート8000を
ローカルでリッスンしているはずだ。
cURLを使用して/api/v1/get-ip
エンドポイントにGET
リクエストを行う:
curl -X GET 'http://localhost:8000/api/v1/get-ip'
注:Windowsでは、curlを
curl.exeに置き換えて
ください。詳しくは、cURLでGETリクエストを送信する方法をご覧ください。
というような返事が返ってくるはずだ:
{
"origin": "45.89.222.18"
}
上記のレスポンスは、HttpBinの/ip
エンドポイントによって生成されたものと全く同じで、Laravel APIが完全に動作していることが確認できます。特に、表示されているIPアドレスは、あなたのマシンのパブリックIPです。次は、そのIPをマスクするためにプロキシを統合してみましょう!
ステップ3:プロキシの取得
Laravelアプリケーションでプロキシを使用するには、まず動作するプロキシサーバーにアクセスする必要があります。
多くのウェブサイトが無料のプロキシURLを提供しているが、慎重になることが重要である-プロキシのインフラを維持するにはコストがかかる。プロキシを無料で提供しているサービスがあれば、その資金をどのように調達しているのか自問してみよう。多くの場合、その答えにはデータハーベスティングやトラフィックの迂回といったいかがわしい行為が含まれています。
注意:フリーのプロキシは、テストや教育目的にのみ使用し、本番環境では使用しないでください。
信頼できるプロキシが必要な場合は、無料トライアルまたは限定無料プランを提供している評判の良いプロバイダーをご利用ください。例えば、当社の無料プロキシをお試しいただけます。
さて、典型的なプロキシのURLは次のようになる:
<protocol>://<host>:<port>
どこでだ:
protocolは
、プロキシサーバーへの接続に必要なプロトコル(http
、https
、socks5など
)。hostは
プロキシサーバーのIPアドレスまたはドメインです。portは
トラフィックのルーティングに使用されるポート
この例では、プロキシのURLを次のように仮定する:
http://66.29.154.103:3128
それをgetIP()
メソッド内の変数に格納する:
$proxyUrl = 'http://66.29.154.103:3128';
LaravelのHttpで
プロキシを使用する方法を見てみましょう!
ステップ4:Httpに
プロキシを組み込む
Http
クライアントを使用してLaravelにプロキシを統合するには、わずかな追加設定が必要なだけです:
$proxyUrl = 'http://66.29.154.103:3128';
$response = Http::withOptions([
'proxy' => $proxyUrl
])->get('https://httpbin.io/ip');
$responseData = $response->json();
ご覧の通り、withOptions()
メソッドを使ってプロキシURLをオプションとして渡すだけです。これにより、LaravelのHTTPクライアントは、Guzzleのプロキシオプションを
使用して、指定されたプロキシサーバーを経由してリクエストをルーティングするようになります。
驚いた!Laravelプロキシ統合完了。
ステップ5:すべてをまとめる
プロキシを統合した最終的なLaravel APIロジックは次のようになります:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Http;
class IPController extends Controller
{
public function getIP(): JsonResponse
{
// the URL of the proxy server
$proxyUrl = 'http://66.29.154.103:3128'; // replace with your proxy URL
// make a GET request to /ip endpoint through the proxy server
$response = Http::withOptions([
'proxy' => $proxyUrl
])->get('https://httpbin.io/ip');
// retrieve the response data
$responseData = $response->json();
// return the response data
return response()->json($responseData);
}
}
ローカルでLaravelを実行してテストしてください:
php artisan serve
そして再び/api/v1/get-ip
エンドポイントに接続する:
curl -X GET 'http://localhost:8000/api/v1/get-ip'
今回は、次のような出力になるはずだ:
{
"origin": "66.29.154.103"
}
origin "
フィールドにはプロキシサーバーのIPアドレスが表示され、あなたの実際のIPがプロキシの後ろに隠されていることが確認できる。
警告フリーのプロキシサーバーはしばしば不安定であったり、短命であったりします。これを試す頃には、例のプロキシはもう動かないかもしれません。必要であれば、テストする前に$proxyUrl
を現在有効なものに置き換えてください。
注:リクエスト中にSSLエラーが発生した場合は、以下の高度な使用例セクションに記載されているトラブルシューティングのヒントを参照してください。
アドヴァンス ユースケース
Laravelでのプロキシ統合の基本を学びましたが、他にも考慮すべき高度なシナリオがあります。
プロキシ認証
プレミアムプロキシは、認証されたユーザーだけがアクセスできるように、認証を必要とすることがよくあります。その場合、正しい認証情報を指定しないと、このエラーが表示されます:
cURL error 56: CONNECT tunnel failed, response 407
認証されたプロキシのURLは、通常このような形式をとる:
<protocol>://<username>:<password>@<host>:<port>
ユーザー名と
パスワードは
認証情報です。
LaravelのHttp
クラス(これはGuzzleベースです)は認証されたプロキシを完全にサポートしています。ですから、あまり変更する必要はありません。プロキシURLに認証情報を直接含めるだけです:
$proxyUrl = '<protocol>://<username>:<password>@<host>:<port>';
例えば、こうだ:
// authenticated proxy with username and password
$proxyUrl = 'http://<username>:<password>@<host>:<port>';
$response = Http::withOptions([
'proxy' => $proxyUrl
])->get('https://httpbin.io/ip');
proxyUrlの
値を有効な認証済みプロキシURLで置き換える。
Httpは
設定された認証プロキシサーバーにトラフィックをルーティングする!
SSL証明書の問題を避ける
LaravelのHttp
クライアントを使用してプロキシを設定すると、SSL証明書の検証エラーのためにリクエストが失敗することがあります:
cURL error 60: SSL certificate problem: self-signed certificate in certificate chain
これは通常、プロキシサーバーが自己署名SSL証明書を使用している場合に発生する。
プロキシサーバーを信頼し、ローカルまたは安全な環境でのみテストする場合は、このようにSSL検証を無効にすることができます:
$response = Http::withOptions([
'proxy' => $proxyUrl,
'verify' => false, // disable SSL certificate verification
])->get('https://httpbin.io/ip');
警告SSL検証を無効にすると、中間者攻撃にさらされます。したがって、このオプションは信頼できる環境でのみ使用してください。
そうでない場合は、プロキシサーバーの証明書ファイル(例:proxy-ca.crt
)があれば、以下のようにSSL検証に使うことができる:
$response = Http::withOptions([
'proxy' => $proxyUrl,
'verify' => storage_path('certs/proxy-ca.crt'), // Path to the CA bundle
])->get('https://httpbin.io/ip');
proxy-ca.crt
ファイルが安全でアクセス可能なディレクトリ(例:storage/certs/)に
保存され、Laravelに読み取り権限があることを確認してください。
どちらの方法でも、プロキシによるSSL検証エラーは解消されるはずだ。
代理ローテーション
同じプロキシサーバーを繰り返し使い続けていると、ターゲットとなるウェブサイトは最終的にそのプロキシのIPアドレスを検知し、ブロックしてしまう可能性が高い。それを避けるには、プロキシサーバーをローテーションさせ、リクエストごとに異なるプロキシサーバーを使用すればよい。
以上がLaravelでプロキシをローテーションする手順です:
- 複数のプロキシURLを含む配列を作成する
- 各リクエストの前にランダムに1つを選択する
- HTTPクライアント・コンフィギュレーションで選択したプロキシを設定する
このコードでそれを実装する:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Http;
function getRandomProxyUrl(): string
{
// a list of valid proxy URLs (replace with your proxy URLs)
$proxies = [
'<protocol_1>://<proxy_host_1>:<port_1>',
// ...
'<protocol_n>://<proxy_host_n>:<port_n>',
];
// return a proxy URL randomly picked from the list
return $proxies[array_rand($proxies)];
}
class IPController extends Controller
{
public function getIP(): JsonResponse
{
// the URL of the proxy server
$proxyUrl = getRandomProxyUrl();
// make a GET request to /ip endpoint through the proxy server
$response = Http::withOptions([
'proxy' => $proxyUrl
])->get('https://httpbin.io/ip');
// retrieve the response data
$responseData = $response->json();
// return the response data
return response()->json($responseData);
}
}
上記のスニペットは、プロキシのローテーションをシミュレートするために、リストからランダムにプロキシを選択する方法を示しています。この方法は動作しますが、いくつかの欠点があります:
- 信頼できるプロキシサーバーのプールを維持しなければならないが、それにはコストがかかることが多い。
- 効果的なローテーションのためには、プロキシプールは十分な大きさが必要である。大きなプールがないと、同じプロキシが繰り返し使われることになり、 検出されたりブロックされたりする可能性がある。
これらの制限を回避するには、Bright Dataのローテーションプロキシネットワークをご利用ください。このインフラストラクチャは、お客様に代わって自動的にIPアドレスをローテーションし、お客様に以下のアクセスを提供します:
- 195カ国に1500M以上のIP
- 家庭用、データセンター用、ISP用、モバイル用プロキシ
- 高い稼働率と99.9%の成功率
次のセクションでは、Bright Dataの回転プロキシをLaravelで使用する方法を紹介します。
LaravelでBright Data Proxyを使用する
Bright Dataは、世界最大級のプロキシネットワークを運営し、フォーチュン500社と20,000社以上の顧客をサポートしています。同社のプロキシネットワークには以下が含まれます:
- データセンター・プロキシ– 770,000以上のデータセンターIP。
- 住宅用プロキシ– 195カ国以上、150,000,000以上の住宅用IP。
- ISPプロキシ– 70万以上のISP IP。
- モバイルプロキシ– 7,000,000以上のモバイルIP。
Bright Dataの住宅用プロキシをLaravelで使用するには、以下の手順に従ってください。
まだアカウントをお持ちでない方は、Bright Dataにサインアップしてください。すでにアカウントをお持ちの方は、ログインしてユーザーダッシュボードにアクセスしてください:
ログイン後、「プロキシ製品を取得する」ボタンをクリックして次に進みます:
プロキシとスクレイピング・インフラストラクチャ」ページにリダイレクトされます:
表で「住宅」の行を見つけ、クリックする:
居住者代理人のページが表示されます:
初めてご利用になる場合は、ウィザードに従ってニーズに合わせてプロキシサービスを設定してください。さらに詳しいサポートが必要な場合は、24時間年中無休のサポートまでお気軽にお問い合わせください。
Overview “タブで、プロキシのホスト、ポート、ユーザー名、パスワードを確認する:
プロキシURLを作成するには、これらの詳細を使用します:
$proxyUrl = 'http://<brightdata_proxy_username>:<brightdata_proxy_password>@<brightdata_proxy_host>:<brightdata_proxy_port>';
プレースホルダ (,
,
,
) を実際のプロキシ認証情報に置き換えてください。
プロキシ製品を有効にするために「Off」設定に切り替えていることを確認し、残りの指示に従ってセットアップを完了する:
プロキシURLを設定したら、Http
クライアントを使用してLaravelに統合します。ここでは、Laravelで回転するBright Data residentialプロキシ経由でリクエストを送信するロジックを説明します:
public function getIp()
{
// TODO: replace the placeholders with your Bright Data's proxy info
$proxyUrl = 'http://<brightdata_proxy_username>:<brightdata_proxy_password>@<brightdata_proxy_host>:<brightdata_proxy_port>';
// make a GET request to "/ip" through the proxy
$response = Http::withOptions([
'proxy' => $proxyUrl,
])->get('https://httpbin.org/ip');
// get the response data
$responseData = $response->json();
return response()->json($responseData);
}
上記のスクリプトを実行するたびに、異なる終了IPが表示されます。
Bright Dataの自動回転プロキシにより、Laravelのプロキシローテーションはかつてないほど簡単になりました!
[番外編] symfonyのHttpClient
プロキシの統合
LaravelのデフォルトのHTTPクライアントHttp
.Symfonyよりも、SymfonyのHttpClient
コンポーネントを好むとします。
以下の手順に従って、LaravelでHttpClientの
プロキシ統合を実装してください。
最初に、Composer経由でsymfony HTTPクライアントパッケージをインストールする必要があります:
composer require symfony/http-client
次に、次のように symfony のHttpClient
をプロキシと一緒に使うことができます:
<?php
namespace App\Http\Controllers;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use Illuminate\Http\JsonResponse;
class IpController extends Controller
{
// where to store the HttpClient instance
private $client;
public function __construct(HttpClientInterface $client)
{
// initialize the HttpClient private instance
$this->client = $client;
}
public function getIp(): JsonResponse
{
// your proxy URL
$proxyUrl = 'http://66.29.154.103:3128'; // replace with your proxy URL
// make a GET request to the "/ip" endpoint through the proxy
$response = $this->client->request('GET', 'https://httpbin.io/ip', [
'proxy' => $proxyUrl,
]);
// parse the response JSON and return it
$responseData = $response->toArray();
return response()->json($responseData);
}
}
このセットアップによって symfony のHttpClient を使って
プロキシを通してリクエストを送信できます。
結論
このプロキシ統合チュートリアルでは、なぜプロキシが重要なのか、そしてLaravelでプロキシを使用する方法を学びました。LaravelのデフォルトのHTTPクライアントとSymfonyのHttpClientの
両方を使って、Laravelでプロキシを簡単に設定する方法をカバーしました。
無料のプロキシサービスが信頼性に欠け、危険でさえある理由もお分かりいただけただろう。安定したパフォーマンス、セキュリティ、スケーラビリティのためには、信頼できるプロキシプロバイダを選択する必要があります。時間と労力を節約し、市場で最高のプロキシプロバイダーであるBright Dataに直行しましょう。
アカウントを作成し、今すぐ当社のプロキシを無料でお試しください!
クレジットカードは必要ありません