亚洲综合极品香蕉久久网,久久夜精品综合缴情五月 ,亚洲动漫成人一区二区,国产在线不卡视频,国产丝袜精品不卡,亚洲乱码日产精品bd,久久久久久国产精品免费网站,亚洲综合av一区二区三区
×
新網 > 建站推廣 > 正文

如何編網站的HTTP 反向代理服務器

  • 作者:新網
  • 來源:新網
  • 瀏覽:100
  • 2018-02-24 17:46:34

為了簡化從 Readable Stream 監聽 data 事件來獲取數據并使用 Writable Stream 的 write() 方法來輸出,可以使用 Readable Stream 的 pipe() 方法。那么如何編寫 HTTP 反向代理服務器?

 為了簡化從 Readable Stream 監聽 data 事件來獲取數據并使用 Writable Stream 的 write() 方法來輸出,可以使用 Readable Stream 的 pipe() 方法。那么如何編寫 HTTP 反向代理服務器?

U2550P2DT20130426183639.jpg
簡單版本
 
以下是實現一個簡單 HTTP 反向代理服務器的各個文件和代碼(沒有任何第三方庫依賴), 為了使代碼更簡潔,使用了一些最新的 ES 語法特性,需要使用 Node v8.x 最新版本來運行 :
 
文件 proxy.js :
 
const http = require("http");
 
const assert = require("assert");
 
const log = require("./log");
 
/** 反向代理中間件 */
 
module.exports = function reverseProxy(options) {
 
assert(Array.isArray(options.servers), "options.servers 必須是數組");
 
assert(options.servers.length > 0, "options.servers 的長度必須大于 0");
 
// 解析服務器地址,生成 hostname 和 port
 
const servers = options.servers.map(str => {
 
const s = str.split(":");
 
return { hostname: s[0], port: s[1] || "80" };
 
});
 
// 獲取一個后端服務器,順序循環
 
let ti = 0;
 
function getTarget() {
 
const t = servers[ti];
 
ti++;
 
if (ti >= servers.length) {
 
ti = 0;
 
}
 
return t;
 
}
 
// 生成監聽 error 事件函數,出錯時響應 500
 
function bindError(req, res, id) {
 
return function(err) {
 
const msg = String(err.stack || err);
 
log("[%s] 發生錯誤: %s", id, msg);
 
if (!res.headersSent) {
 
res.writeHead(500, { "content-type": "text/plain" });
 
}
 
res.end(msg);
 
};
 
}
 
return function proxy(req, res) {
 
// 生成代理請求信息
 
const target = getTarget();
 
const info = {
 
...target,
 
method: req.method,
 
path: req.url,
 
headers: req.headers
 
};
 
const id = `${req.method} ${req.url} => ${target.hostname}:${target.port}`;
 
log("[%s] 代理請求", id);
 
// 發送代理請求
 
const req2 = http.request(info, res2 => {
 
res2.on("error", bindError(req, res, id));
 
log("[%s] 響應: %s", id, res2.statusCode);
 
res.writeHead(res2.statusCode, res2.headers);
 
res2.pipe(res);
 
});
 
req.pipe(req2);
 
req2.on("error", bindError(req, res, id));
 
};
 
};
 
文件 log.js :
 
const util = require("util");
 
/** 打印日志 */
 
module.exports = function log(...args) {
 
const time = new Date().toLocaleString();
 
console.log(time, util.format(...args));
 
};
 
說明:
 
log.js 文件實現了一個用于打印日志的函數 log() ,它可以支持 console.log() 一樣的用法,并且自動在輸出前面加上當前的日期和時間,方便我們瀏覽日志
 
reverseProxy() 函數入口使用 assert 模塊來進行基本的參數檢查,如果參數格式不符合要求即拋出異常,保證可以第一時間讓開發者知道,而不是在運行期間發生各種不可預測的錯誤。
 
getTarget() 函數用于循環返回一個目標服務器地址
 
bindError() 函數用于監聽 error 事件,避免整個程序因為沒有捕捉網絡異常而崩潰,同時可以統一返回出錯信息給客戶端。
 
以上就是小編對于編寫 HTTP 反向代理服務器的建議。
 

免責聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,也不承認相關法律責任。如果您發現本社區中有涉嫌抄襲的內容,請發送郵件至:operations@xinnet.com進行舉報,并提供相關證據,一經查實,本站將立刻刪除涉嫌侵權內容。

免費咨詢獲取折扣

Loading
主站蜘蛛池模板: 天天躁日日躁狠狠久久| 无码一卡二卡三卡四卡| 国产aⅴ激情无码久久男男剧| 亚洲精品久久久无码大桥未久| 97人人超碰国产精品最新o| 一区二区三区国产精品保安| 综合伊人久久在| 精品乱码一区二区三四五区| 国产日产欧产精品精乱子| 亚洲一区二区三区高清av| 成年无码a√片在线观看| 国语对白刺激在线视频国产网红| 国产裸体xxxx视频在线播放| 精品午夜福利无人区乱码一区| 亚洲欧美日韩精品永久| 特殊重囗味sm在线观看无码| 久久久久高潮综合影院| 亚洲国产成人精品无码区在线网站| 国产精品亚洲专区无码电影| 日韩精品无码一区二区三区视频| 免费无码午夜福利片| 老少交欧美另类| 亚洲综合色噜噜狠狠网站超清| 亚洲欧美精品综合在线观看| 精品国产一区二区av麻豆不卡 | 狠狠做久久深爱婷婷| 亚洲精品第一国产综合精品 | 亚洲中文字幕a∨在线 | 精品亚洲国产成人蜜臀优播av| 国产精品美女久久久久久麻豆| 国语少妇高潮对白在线| 免费无遮挡在线观看网站| 久久精品亚洲成在人线av麻豆| 国产99视频精品专区| 亚洲精品久久av无码麻| 国产萌白酱喷水视频在线播放| 国产成人亚洲精品青草| 97热久久免费频精品99| 久久东京伊人一本到鬼色| 伊人久久大香线蕉综合中文字幕| 狠狠色综合久久丁香婷婷|