Rumah > Artikel > hujung hadapan web > Abaikan Nginx dan gunakan nodejs sebagai pelayan proksi terbalik_node.js
Pada masa kini, dalam banyak senario, orang ramai memohon hos VPS untuk mengehoskan dan menjalankan projek web tidak terkecuali Saya dan saudara saya membeli VPS Win 03 dan menggunakannya. Dalam proses menggunakannya, saya menghadapi masalah, iaitu, jenis persekitaran pelayan yang sama adalah baik - tetapi jika tiga jenis projek pelayan, iaitu PHP, ASP dan JSP, wujud bersama, bagaimana untuk memperuntukkan yang unik 80 port? Kerana laman web komersial WWW selalunya hanya boleh menduduki port 80 - sudah tentu, jika mereka hanya menyediakan perkhidmatan, seperti antara muka, menggunakan port lain tidak akan bercanggah dengan port 80. Ramai pemaju akan menghadapi masalah port 80, dan keadaan sebenar akan dihadkan oleh kos. Kerana ia tidak menjimatkan, kos efektif, dan menyusahkan untuk menguruskan VPS hanya untuk projek. Oleh itu, kita harus mempertimbangkan dengan teliti cara mengedarkannya kepada berbilang pelayan sambil menyediakan port 80, supaya hos yang berbeza boleh melaksanakan projek Web mereka sendiri.
Sayang, adakah kami rasa keperluan ini boleh direalisasikan? Ya, ini bukan "teknologi ajaib", dan bukan juga teknologi yang rumit. Saya tertanya-tanya jika anda tahu bahawa salah satu fungsi "Reverse Proxy" dalam perkhidmatan rangkaian adalah untuk melengkapkan pengedaran port. Kami juga boleh menggunakan nama domain sebagai laluan untuk pengedaran: semua permintaan untuk nama domain AA.com diedarkan ke port PHP 82 untuk pelaksanaan; ... dan seterusnya. Sudah tentu, port di sini hanya untuk penjelasan Anda boleh mengkonfigurasinya sewenang-wenangnya, permintaan yang diterima daripada port 80 akan diproses sekali dan kemudian diedarkan. Proksi terbalik, dalam istilah orang awam, hanya menukar tangan kiri ke tangan kanan.
Setiap kali orang menyebut proksi terbalik, mereka biasanya memikirkan Nginx, tetapi hari ini kami akan mengabaikan Nginx yang terkenal buat sementara waktu dan menggunakan Nodejs, adik lelaki sebelah pelayan yang juga menggunakan satu utas dan gelung acara untuk mencapainya. Pertama sekali, Node menggunakan JS untuk pengaturcaraan sisi pelayan dan bukannya Nginx atau Lua untuk menulis konfigurasi, yang lebih sesuai dengan citarasa saya Kedua, saya juga biasa dengan Node, jadi lebih mudah untuk mengkonfigurasi pelbagai aspek.
Untuk mencapai fungsi ini ialah pakej nod-http-proxy. Untuk memuat turun dan memasang, sila taip:
npm install http-proxy
Selepas pemasangan selesai, buat fail proxy.js baharu dan masukkan:
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);
Kos menggunakan pelayan proksi mungkin kerana ia menggunakan lebih banyak sumber dan operasi CPU daripada tidak menggunakannya.
Masalah penggunaan: Folder tidak boleh ditentukan proxy.web(req, res, { target: 'http://jb51.net:81/foo/' });