Heutzutage bewerben sich die Leute in vielen Fällen um einen VPS-Host, um Webprojekte zu hosten und auszuführen. Mein Bruder und ich sind keine Ausnahme. Ich habe einen kleinen Win 03 VPS gekauft und verwende ihn. Bei der Verwendung bin ich auf ein Problem gestoßen: Die gleiche Art von Serverumgebung ist in Ordnung. Wenn jedoch drei Arten von Serverprojekten, nämlich PHP, ASP und JSP, nebeneinander existieren, stellt sich die Frage, wie man eine eindeutige Umgebung zuordnet 80 Port? Wolltuch? Da kommerzielle WWW-Websites häufig nur Port 80 belegen können, steht die Verwendung anderer Ports natürlich nicht im Konflikt mit Port 80, wenn sie nur Dienste wie Schnittstellen bereitstellen. Viele Entwickler werden mit dem Problem von Port 80 konfrontiert sein, und die tatsächliche Situation wird durch die Kosten begrenzt. Denn es ist nicht wirtschaftlich, kosteneffektiv und unpraktisch, einen VPS nur für ein Projekt zu verwalten. Daher sollten wir sorgfältig überlegen, wie wir es auf mehrere Server verteilen und gleichzeitig einen Port 80 bereitstellen, damit verschiedene Hosts ihre eigenen Webprojekte ausführen können.
Sehr geehrte Damen und Herren, glauben wir, dass diese Anforderung erfüllt werden kann? Ja, dies ist keine „magische Technologie“ und auch keine komplizierte Technologie. Ich frage mich, ob Sie wissen, dass eine der Funktionen von „Reverse Proxy“ in Netzwerkdiensten darin besteht, die Portverteilung abzuschließen. Wir könnten genauso gut den Domänennamen als Verteilungsroute verwenden: Alle Anforderungen für den Domänennamen AA.com werden zur Ausführung an PHP-Port 82 verteilt. Alle Anforderungen für den Domänennamen BB.com werden zur Ausführung an ASP-Port 83 verteilt. ... und so weiter. Die Ports dienen hier natürlich nur zur Erläuterung. Sie können sie jedoch beliebig konfigurieren, die von Port 80 empfangenen Anfragen werden jedoch einmal verarbeitet und dann verteilt. Um es für den Laien auszudrücken, bedeutet Reverse Proxy einfach, die linke Hand in die rechte Hand zu verwandeln.
Wenn Leute Reverse-Proxy erwähnen, denken sie normalerweise an Nginx, aber heute werden wir das berühmte Nginx vorübergehend ignorieren und Nodejs verwenden, den serverseitigen jüngeren Bruder, der ebenfalls einen Single-Thread und eine Ereignisschleife verwendet, um dies zu erreichen. Erstens verwendet Node JS für die serverseitige Programmierung anstelle von Nginx oder Lua, was eher meinem Geschmack entspricht. Zweitens bin ich auch mit Node vertraut, sodass es einfacher ist, verschiedene Aspekte zu konfigurieren.
Um diese Funktion zu erfüllen, ist das Paket node-http-proxy erforderlich. Zum Herunterladen und Installieren geben Sie bitte Folgendes ein:
npm install http-proxy
Nachdem die Installation abgeschlossen ist, erstellen Sie eine neue Proxy.js-Datei und geben Sie Folgendes ein:
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);
Die Kosten für die Verwendung eines Proxyservers können darin bestehen, dass dieser mehr Ressourcen und CPU-Vorgänge verbraucht, als wenn er nicht verwendet wird.
Nutzungsproblem: Der Ordner kann nicht angegeben werden. Proxy.web(req, res, { target: 'http://jb51.net:81/foo/' });