第一篇竟然是node.js在阿里云ECS上的部署遇到的小问题记录.

很多时候我们排除故障都会掉进小坑,但别小看是小坑,有时候挺烦人挺难缠的,主要还是基础知识匮乏导致思路混乱造成的,在这里记录下,给自己提个醒,也为网友指条明路,别像我一样乱折腾了。

环境描述:

1.阿里云ECS 单核、1G内存、1M带宽,基本就是最低配置了

2.阿里云提供的CentOS 6.5安全加固版

3.node.js 0.10.30

一,安装过程(尽量精简了,教程太多,不多说)

#yum install gcc-c++ openssl-devel (根据你的需要安装或者更新)
#wget http://nodejs.org/dist/node-v0.10.30.tar.gz (nodejs下载地址,现在应该到0.10.32了,实际我没执行成功,我是本地下载后,sftp上传到服务器的,没有深究失败原因)
#tar –xvf node-v0.10.30.tar.gz
#cd node-v0.10.30
#./configure
#make && make install

以上安装过程如果你搞不定,那多半是linux基础太太太太差,补习下吧。

二,测试过程

1.执行node -v,和npm -v 正确显示了版本号,没有问题。执行node后,执行console.log('hello');也没问题。
2.vi 编辑了一个app.js,测试下http是否正常,内容如下:
var http = require('http');

http.createServer(function(req,res){
    res.writeHead(200,{'Content-Type':'text/plain'});
    res.end('Hello Aliyun Node.js\n');
}).listen(80,"127.0.0.1");

console.log('NodeJS Server running at http://127.0.0.1:80');

  执行node app.js,即可运行服务器,控制台显示:

  NodeJS Server running at http://127.0.0.1:80
  用本地浏览器访问阿里云的地址:
  http://你的IP
  你期待的是:浏览器里显示Hello Aliyun Node.js
  但抱歉,肯定访问不了。

  以前在本地,不管是Windows环境还是linux环境,这都是最常规的,最多去注意下80端口是否被占用,防火墙是否开放即可。

  

三,排错过程

  既然是linux,不得不手动开启80端口的访问授权。
  查看CentOS防火墙信息:/etc/init.d/iptables status  

  添加对80端口的开放:

  /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT

  然后保存规则并重启防火墙:

  /etc/rc.d/init.d/iptables save

  /etc/init.d/iptables restart

  (注:因为主要是想测试基于node.js的微信公众平台,而微信公众平台只接受后端服务器访问80端口的应用)

  网上百度出来的结果,大部分就到这里了,有一些把对80端口的访问转移到其他端口的,我也没尝试。
   
  到这里,按常规你是不是觉得应该外网可以访问服务器了?

  呵呵,也只能呵呵了,我也是这么认为的,结果肯定是无法访问,脑袋一热,百度了一个多小时,没有一个靠谱的说法,也有人说阿里云ECS屏蔽了80端口的,也有人说权限不够的(我用root账户测试的),调来调去脑袋大了。
  为了确信node.js的http服务是正确运行的,我又用putty开启了一个控制台连到ECS,在node.js的http服务开启的状态下,执行:curl http://localhost,控制台返回了“Hello Aliyun Node.js”信息,同时,我更改了app.js的代码,在res.end语句后面紧跟着加入了一行:console.log(req.url);,这样,运行node app.js的控制台下显示了一个/和/favicon.ico,足够证明node.js服务器运行正常了。
  最后怎么解决的?呵呵,说是灵光一现也好,说是死马当活马医也好,我突然想到了hosts文件,路由出问题了?
  为了保险我查了一下:cat /etc/hosts,只显示了本地localhost、127.0.0.1和阿里云内网IP的绑定,没有外网地址的配置。
  为了不干扰其它端口上运行的程序,我没有修改hosts文件,而是更改了app.js代码:
  createServer(...).listen(80,"阿里云ECS外网IP");
  或者直接不指定监听的IP地址也可。

  评论里@木鱼朋友提示可以listen 0.0.0.0,但我觉得应该有更好的处理方式,期待下次修正吧。


  ok,一切正常了,当然,隐藏的事情还有很多,是配置hosts文件好?还是在代码里配置好?有什么利弊?暂且不深究,今天就记录到这里了。
 


posted on 2014-09-22 14:51  小小的激动  阅读(7555)  评论(3编辑  收藏  举报