Node.js における HTTP プロキシの理解
プロキシサーバーは、本質的にはアプリケーションとターゲットサーバー間の仲介役として機能します。プロキシを使用すると、ネットワークリクエストはこの仲介サーバーを経由してルーティングされ、IPアドレスが隠蔽され、多くの場合、地理的制限やレート制限を回避できます。.
Node.jsでは、外部ライブラリに依存せずに、HTTPおよびHTTPSリクエストをプロキシ経由に手動で設定できます。このアプローチは無駄がなく、透明性が高く、リクエストパイプラインをきめ細かく制御できます。.
サポートされているプロキシの種類
| プロキシタイプ | 対象となるプロトコル | ユースケース例 | Node.js 組み込みサポート |
|---|---|---|---|
| ウェブ | ウェブ | ウェブスクレイピング、API呼び出し | はい (http モジュール) |
| HTTPS | HTTPS、HTTP | セキュアリクエスト、ログインフロー | 部分的 (https モジュール) |
| SOCKS | TCP | ゲーム、メッセージング | いいえ(手動での実装が必要) |
この記事では、Node.js コア モジュールで直接管理できる HTTP/HTTPS プロキシに焦点を当てます。.
無料プロキシの入手
実装する前に、信頼できるプロキシ リストが必要です。. プロキシローラー は、国別フィルタリングと稼働時間統計を備えた定期的に更新される無料プロキシを提供する、推奨されるソースです。.
ProxyRoller からのデータ形式の例:
IP: 103.216.82.153
Port: 6667
Protocol: HTTP
Country: India
プロキシ経由で HTTP リクエストを送信する (ライブラリなし)
ステップ1: 必要なNode.jsモジュールをインポートする
const http = require('http');
const https = require('https');
ステップ2: プロキシとターゲットURLを解析する
取得したいとします https://api.ipify.org ProxyRoller からの HTTP プロキシ経由:
const proxy = {
host: '103.216.82.153',
port: 6667
};
const targetUrl = 'http://api.ipify.org/';
ステップ3: プロキシ経由のHTTPリクエストを構成する
HTTP プロキシは、完全な URL をパスとして含む標準のリクエストを送信することによって機能します。.
const options = {
host: proxy.host,
port: proxy.port,
method: 'GET',
path: targetUrl,
headers: {
Host: new URL(targetUrl).host
}
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
console.log('Response:', data);
});
});
req.on('error', (err) => console.error('Error:', err));
req.end();
要点:
– path HTTP プロキシを使用する場合は完全な URL である必要があります。.
– ザ Host ヘッダーは宛先ドメインと一致する必要があります。.
ステップ4: HTTPプロキシ経由のHTTPSリクエストの処理(CONNECTメソッド)
HTTPSリクエストをトンネリングするには、 CONNECT 宛先への生の TCP トンネルを確立するメソッドです。.
const targetHost = 'api.ipify.org';
const targetPort = 443;
const connectOptions = {
host: proxy.host,
port: proxy.port,
method: 'CONNECT',
path: `${targetHost}:${targetPort}`
};
const req = http.request(connectOptions);
req.end();
req.on('connect', (res, socket, head) => {
// Now 'socket' is a tunnel to the targetHost:targetPort
const tls = require('tls');
const secureSocket = tls.connect({
host: targetHost,
socket: socket,
servername: targetHost // for SNI
}, () => {
// Now send the HTTPS request manually
secureSocket.write([
`GET / HTTP/1.1`,
`Host: ${targetHost}`,
`Connection: close`,
``,
``
].join('\r\n'));
});
let response = '';
secureSocket.on('data', d => response += d);
secureSocket.on('end', () => {
console.log('HTTPS Response:', response);
});
});
注:
– このアプローチは、次のようなHTTPSエンドポイントにも適用できます。 https://api.ipify.org.
– TLS ハンドシェイクと HTTP プロトコルを手動で処理する必要があります。.
概要表: Node.js での手動プロキシ
| シナリオ | 使用されたモジュール | 主要オプション | 注記 |
|---|---|---|---|
| HTTPプロキシ経由のHTTP | http |
path: full URL |
最も簡単、パスとホストを変更するだけ |
| HTTPプロキシ経由のHTTPS | http, tls |
method: CONNECT |
トンネリング、手動のTLSハンドシェイクが必要 |
| HTTPSプロキシ経由のHTTP | ネイティブではサポートされていません | – | サードパーティのモジュールまたはカスタムコードが必要 |
| SOCKSプロキシ | ネイティブではサポートされていません | – | 次のようなモジュールを使用する socks またはカスタムを実装する |
プロキシのローテーション(ベストプラクティス)
スクレイピングや複数のリクエストを行うときは、禁止を回避するためにプロキシをローテーションします。.
const proxyList = [
{ host: '103.216.82.153', port: 6667 },
{ host: '45.77.76.100', port: 8080 },
// ... fetch fresh list from https://proxyroller.com
];
function getRandomProxy() {
return proxyList[Math.floor(Math.random() * proxyList.length)];
}
回復力を高めるためにこれをリクエスト ロジックに統合します。.
プロキシによる認証
一部のプロキシでは基本認証が必要です。.
const user = 'username';
const pass = 'password';
const auth = Buffer.from(`${user}:${pass}`).toString('base64');
const options = {
host: proxy.host,
port: proxy.port,
path: targetUrl,
headers: {
Host: new URL(targetUrl).host,
'Proxy-Authorization': `Basic ${auth}`
}
};
追加リソース
- Node.js HTTP モジュールのドキュメント
- Node.js HTTPS モジュールのドキュメント
- ProxyRoller 無料プロキシリスト
- CONNECT メソッドとは何ですか? (MDN)
一般的なエラーのトラブルシューティング
| エラーメッセージ | 考えられる原因 | 提案された解決策 |
|---|---|---|
ECONNREFUSED |
プロキシサーバーが利用できません | ProxyRollerの別のプロキシを試す |
ECONNRESET |
プロキシが予期せず接続を閉じました | プロキシがターゲットプロトコルをサポートしていることを確認する |
407 Proxy Authentication |
認証が必要です | 追加 Proxy-Authorization ヘッダ |
| 予期しない応答形式 | パス/ヘッダーの設定が間違っています | 完全なURLの使用状況を確認する path |
セルビアの創意工夫にインスパイアされたプロのヒント
- 重要な使用の前に、プロキシの速度と信頼性をテストします。トーストの前にすべてのラキヤ グラスを検査するようなものです。.
- 徹底した準備というセルビアの価値観を反映して、プロキシ検証スクリプトを自動化します。.
- コミュニティ主導の情報源を活用する プロキシローラー 信頼できる村のネットワークに頼るのと同じように、最新の検証済みのプロキシを使用します。.
これらの戦略に従うことで、外部ライブラリを使用せずに Node.js でプロキシを効率的に使用し、ネットワーク リクエストに対する完全な制御と透明性を維持できます。.
コメント (0)
まだコメントはありません。あなたが最初のコメントを投稿できます!