在使用云主机部署Nodejs项目测试时, 总是在抛错.
[root@xx app]# node app-test.js
events.js:182
throw er; // Unhandled 'error' event
^
Error: listen EADDRNOTAVAIL 119.xx.xxx.102:3000
at Object.exports._errnoException (util.js:1016:11)
at exports._exceptionWithHostPort (util.js:1039:20)
at Server.setupListenHandle [as _listen2] (net.js:1290:19)
at listenInCluster (net.js:1355:12)
at doListen (net.js:1481:7)
at _combinedTickCallback (internal/process/next_tick.js:105:11)
at process._tickCallback (internal/process/next_tick.js:161:9)
at Function.Module.runMain (module.js:607:11)
at startup (bootstrap_node.js:158:16)
at bootstrap_node.js:575:3
[root@xx app]# ^C
[root@xx app]# node t.js
Server running at http://172.xx.110.1:3000/
http://172.xx.110.1:3000/
^C
119.xx.xxx.102 公网IP
172.xx.xxx.1 私网IP
经过对比, 发现是由于云主机使用了公网的IP, 于是改用了私有IP, 问题解决!
------------------------------------------
2017-06-15
CentOS7系统默认的防火墙服务并不是iptables喔。
您可以先用命令 systemctl status firewalld 来检查一下当前的防火墙状态,
如果是运行状态,您可以 systemctl stop firewalld 的命令来停止防火墙的服务,
如果确认是防火墙的问题,可以用 systemctl disable firewalld 的命令来禁止防火墙的服务。
参考:
https://bbs.aliyun.com/read/176995.html
最后怎么解决的?呵呵,说是灵光一现也好,说是死马当活马医也好,我突然想到了hosts文件,路由出问题了?
为了保险我查了一下:cat /etc/hosts,只显示了本地localhost、127.0.0.1和阿里云内网IP的绑定,没有外网地址的配置。
为了不干扰其它端口上运行的程序,我没有修改hosts文件,而是更改了app.js代码:
createServer(...).listen(80,"阿里云ECS外网IP");
输入“i”,进入编辑模式,将以下项目文件内容粘贴到文件中。使用“Esc”按钮,退出编辑模式,输入“:wq”,回车,保存文件内容并退出。
项目文件内容:
const http = require('http');
const hostname = 'ECS公网IP地址';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
注:项目文件内容中的’ECS公网IP地址’处需填写实际的ECS公网IP;项目文件内容中的3000为端口号,可以自行定义。
乐意黎原创
2017-06-15