第一篇竟然是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文件好?還是在代碼里配置好?有什么利弊?暫且不深究,今天就記錄到這里了。