简述:开启 3001-http,3002-https,2 个端口的服务,创建 3000-net 服务将传过来的 tcp/ip ,服务分发给 http/https,分发判断逻辑是传过来的是什么协议就分发给那个协议的服务上
-
获取.key.pem nginx 证书(略阿里云上申请/下载)
-
将证书放在项目中并引入
var https = require("https"); var fs = require("fs"); // *同步读取密钥和签名证书 var options = { key: fs.readFileSync(__dirname + "/key.key"), cert: fs.readFileSync(__dirname + "/pem.pem"), }; -
创建 https 服务
var httpsServer = https.createServer(options, app); httpsServer.listen(3002); -
开启 net 服务
// 2、创建服务器进行代理 net .createServer(function (socket) { socket.once("data", function (buf) { // console.log(buf[0]); // https 数据流的第一位是十六进制“16”,转换成十进制就是 22 var address = buf[0] === 22 ? httpsPort : httpPort; //创建一个指向 https 或 http 服务器的链接 var proxy = net.createConnection(address, function () { proxy.write(buf); //反向代理的过程,tcp 接受的数据交给代理链接,代理链接服务器端返回数据交由 socket 返回给客户端 socket.pipe(proxy).pipe(socket); }); proxy.on("error", function (err) { console.log(err); }); }); socket.on("error", function (err) { console.log(err); }); }, app) .listen(3003); // 执行函数 此处是真正能够访问的端口,网站默认是 80 端口。
完整的www代码
#!/usr/bin/env node
/**
* Module dependencies.
*/
var app = require("../app");
var debug = require("debug")("banyan-express:server");
var http = require("http");
var https = require("https");
var fs = require("fs");
var net = require("net"); // 使用代理
// *同步读取密钥和签名证书
var options = {
key: fs.readFileSync(__dirname + "/key.key"),
cert: fs.readFileSync(__dirname + "/pem.pem"),
};
/**
* Get port from environment and store in Express.
*/
var httpPort = normalizePort(process.env.PORT || "3001");
var httpsPort = normalizePort(process.env.PORT || "3002");
// app.set("port", httpPort);
/**
* Create HTTP server.
*/
var server = http.createServer(app);
var httpsServer = https.createServer(options, app);
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(httpPort);
server.on("error", onError);
server.on("listening", onListening);
httpsServer.listen(httpsPort);
httpsServer.on("error", onError);
httpsServer.on("listening", onListening);
// 2、创建服务器进行代理
net
.createServer(function (socket) {
socket.once("data", function (buf) {
// console.log(buf[0]);
// https数据流的第一位是十六进制“16”,转换成十进制就是22
var address = buf[0] === 22 ? httpsPort : httpPort;
//创建一个指向https或http服务器的链接
var proxy = net.createConnection(address, function () {
proxy.write(buf);
//反向代理的过程,tcp接受的数据交给代理链接,代理链接服务器端返回数据交由socket返回给客户端
socket.pipe(proxy).pipe(socket);
});
proxy.on("error", function (err) {
console.log(err);
});
});
socket.on("error", function (err) {
console.log(err);
});
}, app)
.listen(3000); // 此处是真正能够访问的端口,网站默认是80端口。
/**
* Normalize a port into a number, string, or false.
*/
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
* Event listener for HTTP server "error" event.
*/
function onError(error) {
if (error.syscall !== "listen") {
throw error;
}
var bind = typeof port === "string" ? "Pipe " + port : "Port " + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case "EACCES":
console.error(bind + " requires elevated privileges");
process.exit(1);
break;
case "EADDRINUSE":
console.error(bind + " is already in use");
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
var addr = server.address();
var bind = typeof addr === "string" ? "pipe " + addr : "port " + addr.port;
debug("Listening on " + bind);
}