2013-10-23 46 views
8

我已经有一个Ubuntu虚拟机在Azure上。我在Azure管理门户加入enpoint:节点哪个端口/ ip地址听天蓝色的Ubuntu vm

​​

我试着听吧:

var http = require('http'); 

var server = http.createServer(function (request, response) { 
    response.writeHead(200, {"Content-Type": "text/plain"}); 
    response.end("Hello World\n"); 
}); 

server.listen(80); 

它的工作原理,如果我ssh并卷曲它:

$ curl localhost:80 
Hello World 

但如果我尝试通过subdomain.cloudapp.net访问它,则无法返回。当通过公共IP地址访问时,它也不会返回任何内容。

我应该使用我的节点应用程序监听哪个端口和地址才能从外部访问它?

我需要另一个Azure服务才能访问VM吗?

如果它是防火墙的问题,我将如何启用公共访问?


编辑:

我检查,如果有一个防火墙,但没有:

$ sudo ufw status 
[out :: subdomain.cloudapp.net] Status: inactive 

编辑2:

供应的不同Ubuntu的虚拟机,但它仍然不起作用。尝试重新启动iptables的,但没有服务被称为:

$ sudo service iptables restart 
iptables: unrecognized service 

iptables的是:

$ sudo iptables -L 

Chain INPUT (policy ACCEPT) 
target  prot opt source    destination 

ACCEPT  udp -- anywhere    anywhere    udp dpt:bootpc 
ACCEPT  tcp -- anywhere    anywhere    state NEW tcp dpt:http 


Chain FORWARD (policy ACCEPT) 
target  prot opt source    destination 


Chain OUTPUT (policy ACCEPT) 
target  prot opt source    destination 
+0

下载二进制文件你确认端口80在虚拟机的防火墙(iptables)中是否打开? –

+0

我如何确认? (这里很新的服务器的东西) – AJcodez

+0

@DavidMakogon仍然不知道如何允许外部访问,不知道它是否应该使用ACL? – AJcodez

回答

7

不知道你的样品有什么问题。 这是我工作的步骤顺序:

  1. 在WestUS中创建'Extra Small'Ubuntu Server 13.10实例。 (新建 - >虚拟机 - >快速创建)
  2. 添加端点HTTP 80 - > 80(端点 - >添加 - >添加新的独立端点 - > HTTP,TCP,80,80)
  3. 安装nodejs(sudo apt - 请安装nodejs)。此安装版本'v0.10.15'
  4. 使用您的代码创建server.js。
  5. 启动服务器的NodeJS(须藤的NodeJS server.js)

我能够通过ndtest2.cloudapp.net名(已删除)远程连接,并得到的 “Hello World”。

编辑: 但是我无法连接到从源代码构建的版本。 但是我可以连接,如果我从http://nodejs.org

+0

啊。你使用apt-get nodejs?我做了以下内容:'add-apt-repository ppa:chris-lea/node.js'。我不应该这样做吗? – AJcodez

+0

我没有指定使用哪一个。只需在clean vm上执行“sudo apt-get install nodejs”即可。 –

+1

“添加端点HTTP 80” - Doh!非常感谢你! –

2

天青,你需要使用环境变量process.env.PORT设置端口。 如果在本地主机上要使用80,一个很好的方法来设置它在你的代码以这种方式为推荐here

server.listen(process.env.PORT || 80); 

不过,可以确定的是,如果你在Azure上运行一个虚拟机,that the windows firewall is correctly set

+0

我已经设置了端口,并且它的监听正确。问题是我无法从外部访问虚拟机。 – AJcodez

+0

你错过了回答者的观点。你需要监听你所说的特定端口(通过process.env.PORT)。你不能听你喜欢的任何端口。 –

+0

'port = process.env.PORT || 80''仍然不起作用 – AJcodez

3

您有可能在127.0.0.1或本地主机上收听。您需要在0.0.0.0听,要解决这个问题,更换

server.listen(80); 

server.listen(80, "0.0.0.0") 

只是为了澄清,0.0.0.0不是acutal地址,这意味着所有的地址,127.0.0.1和任何其他IP地址。

+0

当我尝试我得到'curl:(7)失败连接到0.0.0.0:80连接rufused' – AJcodez

+0

@AJcodez ,请参阅最新的问题。 –

+0

我试过localhost,127.0.0.1,0.0.0.0,public vm ip,private vm ip all都没有成功:( – AJcodez

1

我相信你的端口不允许在端口80上进行远程连接,因为你可以使用来自外部的SSH隧道进入Ubuntu虚拟机。尝试this answer。虽然它与Apache相关,但这两个问题看起来很相似,实际上是相同的。尝试一下。

与此同时,最好的运气。手指交叉:p