心血來潮花了9塊9(學生價)買了個阿里雲。因為后端只會一點 Node,所以上來第一件事就是按照官方教程把部署 Node 項目這個教程擼了一遍。
問題描述
官方教程代碼
const http = require('http');
const hostname = 'ECS公網IP地址'; // 這里把文字換成自己的公網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}/`);
});
一段簡單最簡單的 Node http服務器,成功運行后可以在頁面輸出 Hello World。
報錯

報錯了,因為之前寫node只需要監聽端口,沒必要把IP地址也給寫進去,所以我刪了hostname,改成下面這樣。
const http = require('http');
const hostname = 'ECS公網IP地址'; // 這里把文字換成自己的公網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, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
運行成功,但是在外網用瀏覽器輸入IP地址之后無法訪問。
問題分析
curl ip.cn
查詢當前外網IP,沒有問題,與阿里雲提供的一致。
ping www.baidu.com
服務器可以訪問外網
curl http://127.0.0.1:3000
正確輸出 "Hello World",說明代碼的編寫沒有問題。
代碼沒問題,服務器網絡沒問題,ip地址沒問題。我估計應該是防火牆把端口禁掉了。
關閉防火牆
身為小菜鳥,第一時間想到的就是把服務器的防火牆關掉。我的服務器是 CentOS7.0 ,與6.0不一樣,CentOS7.0默認使用 firewall 作為防火牆。
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止開機啟動firewall
firewall-cmd --state #查看防火牆狀態,已經處於關閉狀態
開Node服務器,瀏覽器訪問還是失敗。
好像沒招了,問小伙伴,他們說可能是沒有備案的原因。但是沒備案的小伙伴說他用得好好的,而且我就買了一個月的服務器,再等半個月備案我也不需要用了。正打算放棄問客服,小伙伴說你裝個Nginx試試,只要正確運行Nginx而且服務器沒問題直接訪問IP地址就能出現Nginx首頁了。
安裝 Nginx
CentOS有兩種方法安裝Nginx,具體的自行谷歌吧。
安裝完成,運行成功。
瀏覽器訪問公網IP,無法訪問。
從吃完中午飯13:00一直折騰到下午6:30左右,一動不動坐凳子上5個多小時了,不行了,休息吃完飯去。
解決
既然Nginx正確運行,那只剩兩個問題了,一個是沒有備案,不過這個問題的可能性很小很小。還有一點就是雖然我CentOS上把防火牆關了,但雲服務器上阿里雲應該會有一些安全措施,導致一部分端口被禁,或者壓根就沒有把端口打開。
吃完飯,散完步,我就在雲服務器控制台里一個一個的找,發現安全組里點擊配置規則后有一個安全組規則,里面通過添加安全組規則可以開放需要用到的端口。默認只打開了兩個端口。



總結
這是一個簡單的問題,不過需要一步步排除掉可能的原因。
如果身邊有個后端或者運維的小伙伴在的話,應該可以很快意識到這個問題。獨狼是走不遠的,至少是走不快的。
其實在購買時就可以選取要開放的端口,第一次嘛,沒有經驗,都是直接默認選項。怪不得小伙伴說他服務器的配置都沒有動過,應該是購買的時候就已經設置好的。
趁年輕,多踩坑。
