如何在 Node.js server.listen() 中使用可选的主机名参数
How to use the optional hostname parameter in Node.js server.listen()
从目前为止我在教程中读到的内容来看,server.listen(port[, hostname][, backlog][, callback])
的可选 hostname
参数一直是 127.0.0.1
(环回)、0.0.0.0
(listen on every available network interface, the default option),或服务器可用的实际 IP 地址之一。其他一切都会给出 Error: listen EADDRNOTAVAIL
。是全貌吗? (我认为主机名在技术上与 IP 不同...)
我无法从 doc...
中找到太多相关信息
因此,您需要一个可解析的 DNS 主机名才能正常工作。举个简单的例子,我编辑了 /etc/hosts
文件以包含以下条目:
...
127.0.0.1 MyTestDnsHostName.local
然后我用旧 dscacheutil -flushcache
刷新了解析器缓存,并在一个简单的 Node.js 服务器中使用了以下代码。
var http = require('http')
, PORT = 8080;
function handleRequest( request, response ){
response.end( 'It Works!' );
}
var server = http.createServer( handleRequest );
server.listen( PORT, "MyTestDnsHostName.local", 34, function(){
console.log( "Server listening on port:%s", PORT );
});
果然有效。
错误EADDRNOTAVAIL
表示可解析但不可用;现在,为了能够绑定到它,它也应该是可绑定的(可用的)。
您可以执行 lsof -i TCP
检查它的绑定位置。
但是,我不明白为什么你必须在别处绑定服务器;绑定到环回是最佳实践。
是的,所以这实际上是一个安全漏洞;如果您将它绑定到所有可用接口 0.0.0.0
,您实际上是在说 Listen to every available network interface there is
。这可能会造成安全漏洞,因为它可能会绑定到您不想要的适配器;在部署 RoR 应用程序时,我有过这方面的 first-hand 经验。
0.0.0.0/0
子网是一种非常奇特的说法:these are all the network interfaces I have on this computer
,而 127.0.0.1
始终是 local-only 接口。如果你将它绑定到这个,你就摆脱了很多安全问题。其中之一可能是 "hacker" 试图在所有接口上附加一个侦听器,如果您没有非常严格的防火墙,则可能存在泄漏。
这不是 规则 本身,而只是最佳实践。
P.S.: 该代码是我从 Modulus 的博客中摘录的片段;如果我想尝试一下,它很快。
从目前为止我在教程中读到的内容来看,server.listen(port[, hostname][, backlog][, callback])
的可选 hostname
参数一直是 127.0.0.1
(环回)、0.0.0.0
(listen on every available network interface, the default option),或服务器可用的实际 IP 地址之一。其他一切都会给出 Error: listen EADDRNOTAVAIL
。是全貌吗? (我认为主机名在技术上与 IP 不同...)
我无法从 doc...
中找到太多相关信息因此,您需要一个可解析的 DNS 主机名才能正常工作。举个简单的例子,我编辑了 /etc/hosts
文件以包含以下条目:
...
127.0.0.1 MyTestDnsHostName.local
然后我用旧 dscacheutil -flushcache
刷新了解析器缓存,并在一个简单的 Node.js 服务器中使用了以下代码。
var http = require('http')
, PORT = 8080;
function handleRequest( request, response ){
response.end( 'It Works!' );
}
var server = http.createServer( handleRequest );
server.listen( PORT, "MyTestDnsHostName.local", 34, function(){
console.log( "Server listening on port:%s", PORT );
});
果然有效。
错误EADDRNOTAVAIL
表示可解析但不可用;现在,为了能够绑定到它,它也应该是可绑定的(可用的)。
您可以执行 lsof -i TCP
检查它的绑定位置。
但是,我不明白为什么你必须在别处绑定服务器;绑定到环回是最佳实践。
是的,所以这实际上是一个安全漏洞;如果您将它绑定到所有可用接口 0.0.0.0
,您实际上是在说 Listen to every available network interface there is
。这可能会造成安全漏洞,因为它可能会绑定到您不想要的适配器;在部署 RoR 应用程序时,我有过这方面的 first-hand 经验。
0.0.0.0/0
子网是一种非常奇特的说法:these are all the network interfaces I have on this computer
,而 127.0.0.1
始终是 local-only 接口。如果你将它绑定到这个,你就摆脱了很多安全问题。其中之一可能是 "hacker" 试图在所有接口上附加一个侦听器,如果您没有非常严格的防火墙,则可能存在泄漏。
这不是 规则 本身,而只是最佳实践。
P.S.: 该代码是我从 Modulus 的博客中摘录的片段;如果我想尝试一下,它很快。