生产环境中的最佳实践 node.js 推荐端口是什么?
What is best practice node.js recommended port in production environment?
我在 node.js 使用端口 4000 创建了一个聊天应用程序。一切正常,但是当我在生产环境中推出它时,我发现许多公司网络阻止了传出端口 4000。我考虑过使用其他更有可能在公司网络上打开的端口,但后来发现此端口列表被 chrome 浏览器阻止:
https://superuser.com/questions/188058/which-ports-are-considered-unsafe-by-chrome
使用 995 等端口会导致 chrome 错误 "ERR_UNSAFE_PORT"
那么对于 node.js 服务器来说,似乎唯一允许的端口是 80 和 443?在生产环境中为您的 node.js 应用程序选择端口的推荐最佳做法是什么?
我的网络服务器已将端口 80 和 443 用于典型的 apache 网络服务。我是否需要为 node.js 创建专用服务器?
我正在使用以下代码启动从浏览器到 node.js 服务器的连接:
var socket = io.connect('https://duplex.example.com:4000');
这是服务器端的代码:
const https = require('https');
const fs = require('fs');
var express = require('express')
, bodyParser = require('body-parser');
var socket = require('socket.io');
var adminid = '';
var clientlist = new Array();
var port = 4000;
const options = {
cert: fs.readFileSync('./fullchain.pem'),
key: fs.readFileSync('./privkey.pem')
};
var app = express();
var server = https.createServer(options, app).listen(port, function(){
console.log("Express server listening on port " + port);
});
443和80分别是https和HTTP流量的主要端口。
其他端口可用于 WebSocket,但这听起来不像您的用例。
我过去所做的是使用反向代理来区分传入的 URL,并在客户端不需要知道的情况下在我的机器内部映射端口。
如果您使用任何类型的 linux 发行版,NGINX 通常是最简单的选择。
这是一篇关于如何使用 nginx 为节点应用程序设置反向代理的博客。
http://thejonarnold.com/configure-sails-js-with-subdomains-on-ubuntu/
文章引用了 sailsjs,但没有关于该技术的特定框架。
大多数人不会将他们的 Node.js 服务器直接暴露在互联网上,而是使用 Apache 或 Nginx 作为前端代理。
让您的服务器仅绑定到 localhost
(或使用防火墙规则仅允许传入 80 和 443。
server.listen('localhost', 4000)
配置您的反向代理。我正在使用 Caddy:
example.com {
root /var/www/example.com
# et cetera
}
duplex.example.com {
proxy / localhost:4000 {
websocket
}
}
当代理websocket时,你需要确保Connection
和Upgrade
headers不丢失,我在这里用Caddy的快捷方式完成了。
您也可以使用与主站点相同的域并只代理特定路径。
让客户端 socket.io 连接到 wss://duplex.example.com
(在端口 443 上)。 (我不熟悉 socket.io 来说明为什么它使用 HTTPS URL 而不是 WSS,但我假设你有那个工作。)
我在 node.js 使用端口 4000 创建了一个聊天应用程序。一切正常,但是当我在生产环境中推出它时,我发现许多公司网络阻止了传出端口 4000。我考虑过使用其他更有可能在公司网络上打开的端口,但后来发现此端口列表被 chrome 浏览器阻止:
https://superuser.com/questions/188058/which-ports-are-considered-unsafe-by-chrome
使用 995 等端口会导致 chrome 错误 "ERR_UNSAFE_PORT"
那么对于 node.js 服务器来说,似乎唯一允许的端口是 80 和 443?在生产环境中为您的 node.js 应用程序选择端口的推荐最佳做法是什么?
我的网络服务器已将端口 80 和 443 用于典型的 apache 网络服务。我是否需要为 node.js 创建专用服务器?
我正在使用以下代码启动从浏览器到 node.js 服务器的连接:
var socket = io.connect('https://duplex.example.com:4000');
这是服务器端的代码:
const https = require('https');
const fs = require('fs');
var express = require('express')
, bodyParser = require('body-parser');
var socket = require('socket.io');
var adminid = '';
var clientlist = new Array();
var port = 4000;
const options = {
cert: fs.readFileSync('./fullchain.pem'),
key: fs.readFileSync('./privkey.pem')
};
var app = express();
var server = https.createServer(options, app).listen(port, function(){
console.log("Express server listening on port " + port);
});
443和80分别是https和HTTP流量的主要端口。
其他端口可用于 WebSocket,但这听起来不像您的用例。
我过去所做的是使用反向代理来区分传入的 URL,并在客户端不需要知道的情况下在我的机器内部映射端口。
如果您使用任何类型的 linux 发行版,NGINX 通常是最简单的选择。
这是一篇关于如何使用 nginx 为节点应用程序设置反向代理的博客。
http://thejonarnold.com/configure-sails-js-with-subdomains-on-ubuntu/
文章引用了 sailsjs,但没有关于该技术的特定框架。
大多数人不会将他们的 Node.js 服务器直接暴露在互联网上,而是使用 Apache 或 Nginx 作为前端代理。
让您的服务器仅绑定到
localhost
(或使用防火墙规则仅允许传入 80 和 443。server.listen('localhost', 4000)
配置您的反向代理。我正在使用 Caddy:
example.com { root /var/www/example.com # et cetera } duplex.example.com { proxy / localhost:4000 { websocket } }
当代理websocket时,你需要确保
Connection
和Upgrade
headers不丢失,我在这里用Caddy的快捷方式完成了。您也可以使用与主站点相同的域并只代理特定路径。
让客户端 socket.io 连接到
wss://duplex.example.com
(在端口 443 上)。 (我不熟悉 socket.io 来说明为什么它使用 HTTPS URL 而不是 WSS,但我假设你有那个工作。)