http-proxy を使って Node.js でプロキシサーバーを作成する
Node.js の http.Client で HTTP プロキシを使用する方法
プロキシの設定
まず、使用するプロキシサーバーのホスト名とポート番号を設定する必要があります。これは、環境変数や設定ファイルなどで指定することができます。
const proxyHost = 'proxy.example.com';
const proxyPort = 8080;
リクエストの作成
次に、http.Client
モジュールを使用して、リクエストを作成します。この際、agent
オプションに、プロキシサーバーを介して接続を行うための HTTP エージェントオブジェクトを設定する必要があります。
const http = require('http');
const agent = new http.Agent({
host: proxyHost,
port: proxyPort
});
const options = {
host: 'www.example.com',
path: '/',
agent: agent
};
const req = http.request(options, (res) => {
console.log(`Status code: ${res.statusCode}`);
res.on('data', (chunk) => {
console.log(chunk.toString());
});
res.on('end', () => {
console.log('Response ended');
});
});
req.on('error', (err) => {
console.error(err);
});
req.write('Hello from Node.js!');
req.end();
上記のように設定したリクエストオブジェクトを使用して、req.write()
メソッドでリクエストボディを送信し、req.end()
メソッドでリクエストを完了します。
レスポンスの処理
req.on('response')
イベントリスナーを使用して、レスポンスを受信します。レスポンスのステータスコード、ヘッダー、ボディにアクセスすることができます。
エラー処理
req.on('error')
イベントリスナーを使用して、リクエスト中に発生したエラーを処理します。
例
上記のコードは、proxy.example.com
ポート 8080
を介して www.example.com
に GET リクエストを送信し、レスポンスをコンソールに出力します。
補足
- 上記のコードは、非認証プロキシサーバーの場合を示しています。認証が必要なプロキシサーバーを使用する場合は、
agent
オプションにauth
プロパティを設定する必要があります。 - Node.js には、
http-proxy
やrequest
などのサードパーティ製ライブラリを使用して、HTTP プロキシ経由でリクエストを行うためのより高度な機能を提供するものもあります。
const http = require('http');
const proxyHost = 'proxy.example.com';
const proxyPort = 8080;
const agent = new http.Agent({
host: proxyHost,
port: proxyPort
});
const options = {
host: 'www.example.com',
path: '/',
agent: agent
};
const req = http.request(options, (res) => {
console.log(`Status code: ${res.statusCode}`);
res.on('data', (chunk) => {
console.log(chunk.toString());
});
res.on('end', () => {
console.log('Response ended');
});
});
req.on('error', (err) => {
console.error(err);
});
req.write('Hello from Node.js!');
req.end();
http
モジュールをインポートします。- プロキシサーバーのホスト名とポート番号を設定します。
- HTTP エージェントオブジェクトを作成します。このオブジェクトは、プロキシサーバーを介して接続を行うために使用されます。
- リクエストオプションを作成します。このオプションには、リクエスト先のホスト名、パス、および使用するエージェントが含まれます。
http.request()
メソッドを使用して、リクエストオブジェクトを作成します。req.on('response')
イベントリスナーを使用して、レスポンスを受信します。req.write()
メソッドを使用して、リクエストボディを送信します。
このコードを実行すると、以下の出力がコンソールに表示されます。
Status code: 200
Hello from Node.js!
Response ended
これは、リクエストが正常に送信され、レスポンスが受信されたことを示します。
このコードは、基本的な例です。認証が必要なプロキシサーバーを使用する場合は、agent
オプションに auth
プロパティを設定する必要があります。また、http-proxy
や request
などのサードパーティ製ライブラリを使用して、より高度な機能を利用することもできます。
Node.js で HTTP プロキシを使用するその他の方法
サードパーティ製ライブラリを使用する
http-proxy
や request
などのサードパーティ製ライブラリを使用すると、http.Client
モジュールよりも高度な機能を利用することができます。
http-proxy
は、Node.js 用のシンプルな HTTP プロキシミドルウェアです。以下の機能を提供します。
- リクエストヘッダーの書き換え
http-proxy
を使用するには、以下の手順を実行します。
http-proxy
をインストールします。
npm install http-proxy
- 以下のコードのように、
http-proxy
を使用してプロキシサーバーを作成します。
const httpProxy = require('http-proxy');
const proxy = httpProxy.createProxyServer({
target: 'www.example.com'
});
proxy.on('proxyReq', (proxyReq, req, res, options) => {
// リクエストヘッダーを書き換える
proxyReq.setHeader('X-Forwarded-For', req.socket.remoteAddress);
});
proxy.on('proxyRes', (proxyRes, res, req) => {
// レスポンスを処理する
console.log(`Status code: ${proxyRes.statusCode}`);
});
proxy.on('error', (err) => {
console.error(err);
});
proxy.listen(8080, () => {
console.log('Proxy server listening on port 8080');
});
- 以下のコードのように、
http.request()
メソッドを使用して、プロキシサーバー経由でリクエストを行います。
const http = require('http');
const options = {
host: 'localhost',
port: 8080,
path: '/'
};
const req = http.request(options, (res) => {
console.log(`Status code: ${res.statusCode}`);
res.on('data', (chunk) => {
console.log(chunk.toString());
});
res.on('end', () => {
console.log('Response ended');
});
});
req.on('error', (err) => {
console.error(err);
});
req.write('Hello from Node.js!');
req.end();
request
は、Node.js 用の HTTP クライアントライブラリです。以下の機能を提供します。
- 認証
request
をインストールします。
npm install request
const request = require('request');
const options = {
url: 'www.example.com',
proxy: 'http://proxy.example.com:8080',
auth: {
username: 'user',
password: 'password'
},
headers: {
'X-Forwarded-For': '192.168.1.100'
}
};
request(options, (err, res, body) => {
if (err) {
console.error(err);
return;
}
console.log(`Status code: ${res.statusCode}`);
console.log(body);
});
TLS/SSL プロキシを使用すると、HTTPS 接続を介してプロキシサーバーを経由してリクエストを行うことができます。
自身のプロキシサーバーを実装する
Node.js を使用して、独自の TLS/SSL プロキシサーバーを実装することができます。これは、高度な制御が必要な場合に役立ちます。
TLS/SSL プロキシをサポートするライブラリを使用する
node-tls-proxy
などの TLS/SSL プロキシをサポートするライブラリを使用することができます。
SOCKS プロキシは、TCP/IP トラフィックをプロキシサーバー経由
http proxy node.js