De nos jours, dans de nombreux scénarios, les gens demandent un hébergeur VPS pour héberger et exécuter des projets Web. Mon frère et moi ne faisons pas exception. J'ai acheté un petit VPS Win 03 et je l'utilise. En l'utilisant, j'ai été confronté à un problème, c'est-à-dire que le même type d'environnement serveur convient - mais si trois types de projets serveur, à savoir un PHP, un ASP et un JSP, coexistent, comment attribuer un unique 80 ports ? Du drap de laine ? Étant donné que les sites Web commerciaux sur le Web ne peuvent souvent occuper que le port 80 - bien sûr, s'ils ne fournissent que des services, tels que des interfaces, l'utilisation d'autres ports n'entrera pas en conflit avec le port 80. De nombreux développeurs seront confrontés au problème du port 80, et la situation réelle sera limitée par le coût. Parce qu'il n'est pas économique, rentable et peu pratique de gérer un VPS uniquement pour un projet. Par conséquent, nous devons soigneusement réfléchir à la manière de le distribuer sur plusieurs serveurs tout en fournissant un port 80, afin que différents hôtes puissent exécuter leurs propres projets Web.
Cher client, pensons-nous que cette exigence peut être réalisée ? Oui, ce n’est pas une « technologie magique », ni une technologie compliquée. Je me demande si vous savez que l'une des fonctions du "Reverse Proxy" dans les services réseau est de terminer la distribution des ports. Nous pourrions aussi bien utiliser le nom de domaine comme voie de distribution : toutes les requêtes pour le nom de domaine AA.com sont distribuées sur le port PHP 82 pour exécution ; toutes les requêtes pour le nom de domaine BB.com sont distribuées sur le port ASP 83 pour exécution ; ... et ainsi de suite. Bien sûr, les ports ici sont juste à titre d'explication. Vous pouvez les configurer arbitrairement. Quoi qu'il en soit, les requêtes reçues du port 80 seront traitées une seule fois puis distribuées. Le proxy inverse, en termes simples, consiste simplement à transformer la main gauche en main droite.
Chaque fois que les gens mentionnent le proxy inverse, ils pensent généralement à Nginx, mais aujourd'hui, nous allons temporairement ignorer le célèbre Nginx et utiliser Nodejs, le petit frère côté serveur qui utilise également un monothread et une boucle d'événements pour y parvenir. Tout d'abord, Node utilise JS pour la programmation côté serveur au lieu de Nginx ou Lua pour écrire des configurations, ce qui correspond plus à mes goûts. Deuxièmement, je connais également Node, il est donc plus facile de configurer divers aspects.
Pour accomplir cette fonction, il existe le package node-http-proxy. Pour télécharger et installer, veuillez taper :
npm install http-proxy
Une fois l'installation terminée, créez un nouveau fichier proxy.js et saisissez :
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);
Le coût de l'utilisation d'un serveur proxy peut être qu'il consomme plus de ressources et d'opérations CPU que de ne pas l'utiliser.
Problème d'utilisation : le dossier ne peut pas être spécifié proxy.web(req, res, { target: 'http://jb51.net:81/foo/' });