ホームページ > 記事 > ウェブフロントエンド > Nginx を放棄し、nodejs をリバース プロキシとして使用する
現在、多くのシナリオで、Web プロジェクトをホストして実行するために VPS ホストを申請する人がいます。私と兄も例外ではなく、小さな Win 03 VPS を購入して使用しています。使っていくうちに、同じ種類のサーバー環境は良いのですが、PHP、ASP、JSPの3種類のサーバープロジェクトが混在する場合、どのように独自のサーバープロジェクトを割り当てるのかという問題に直面しました。ポート80?商用 WWW Web サイトは多くの場合、ポート 80 のみを使用できるため、インターフェイスなどのサービスのみを提供する場合は、他のポートを使用してもポート 80 と競合しません。多くの開発者はポート 80 の問題に直面するでしょうが、実際の状況はコストによって制限されます。プロジェクトのためだけに VPS を管理するのは経済的ではなく、費用対効果が低く、不便だからです。したがって、ポート 80 を提供しながら複数のサーバーに分散し、異なるホストが独自の Web プロジェクトを実行できるようにする方法を慎重に検討する必要があります。
あなた、この要件は実現できると思いますか?そう、これは「魔法の技術」でも、複雑な技術でもありません。ネットワークサービスにおける「リバースプロキシ」の機能の一つに、ポート分散を完了する機能があることをご存知でしょうか。ドメイン名を配布ルートとして使用することもできます。AA.com ドメイン名に対するすべてのリクエストは実行のために PHP ポート 82 に配布され、BB.com ドメイン名に対するすべてのリクエストは実行のために ASP ポート 83 に配布されます。 ... 等々。もちろん、ここでのポートは説明のためのものであり、任意に設定できます。ポート 80 から受信したリクエストは一度処理されてから分散されます。リバースプロキシとは、平たく言えば、左手を右手に変えることです。
リバース プロキシについて言及するとき、通常は Nginx を思い浮かべますが、今日は有名な Nginx を一時的に無視し、同じくシングル スレッドとイベント ループを使用してそれを実現するサーバー側の弟である Nodejs を使用します。まず、Node はサーバー側のプログラミングに Nginx や Lua ではなく JS を使用して構成を記述します。これは私の好みにより合っています。第 2 に、私は Node に慣れているので、さまざまな側面を構成するのが簡単です。
この機能を実現するのは、node-http-proxy パッケージです。ダウンロードしてインストールするには、次のように入力してください:
npm install http-proxy
インストールが完了したら、新しい proxy.js ファイルを作成し、次のように入力します。
var http = require('http'), httpProxy = require('http-proxy'); // 新建一个代理 Proxy Server 对象 var proxy = httpProxy.createProxyServer({}); // 捕获异常 proxy.on('error', function (err, req, res) { res.writeHead(500, { 'Content-Type': 'text/plain' }); res.end('Something went wrong. And we are reporting a custom error message.'); }); // 另外新建一个 HTTP 80 端口的服务器,也就是常规 Node 创建 HTTP 服务器的方法。 // 在每次请求中,调用 proxy.web(req, res config) 方法进行请求分发Create your custom server and just call `proxy.web()` to proxy // a web request to the target passed in the options // also you can use `proxy.ws()` to proxy a websockets request // var server = require('http').createServer(function(req, res) { // You can define here your custom logic to handle the request // and then proxy the request. var host = req.url; host = url.parse(host); host = host.host; console.log("host:" + req.headers.host); console.log("client ip:" + (req.headers['x-forwarded-for'] || req.connection.remoteAddress)); proxy.web(req, res, { target: 'http://localhost:8080' }); }); console.log("listening on port 80") server.listen(80);
プロキシ サーバーを使用すると、使用しない場合よりも多くのリソースと CPU オペレーションが消費されるため、コストがかかる場合があります。
使用上の問題: フォルダーを指定できません proxy.web(req, res, { target: 'http://jb51.net:81/foo/' });