2016-04-24 66 views
2

我有一個在端口3000上運行的node.js應用程序。我將它部署在亞馬遜網絡服務(ec2)上,並在那裏工作。我server.js文件說:我目前在端口3000上運行我的amazon ec2實例。我想在端口80上運行它。我該怎麼做?

var port   = process.env.PORT || 3000; 
(...) 
app.listen(port); 
console.log('App listening on port ' + port); 

我在AWS設置安全組似乎有80端口也開了:

enter image description here

,所以我認爲這是不夠的,只是改變var port= 80並重新啓動服務器。但是,當我這樣做,我得到了一個錯誤:

[email protected]:~/apps/myproject/www/myproject$ sudo node server.js 
App listening on port 80 
events.js:141 
     throw er; // Unhandled 'error' event 
    ^

Error: listen EADDRINUSE :::80 
    at Object.exports._errnoException (util.js:856:11) 
    at exports._exceptionWithHostPort (util.js:879:20) 
    at Server._listen2 (net.js:1237:14) 
    at listen (net.js:1273:10) 
    at Server.listen (net.js:1369:5) 
    at Function.app.listen (/opt/bitnami/apps/myproject/www/myproject/node_modules/express/lib/application.js:542:24) 
    at Object.<anonymous> (/opt/bitnami/apps/myproject/www/myproject/server.js:43:5) 
    at Module._compile (module.js:398:26) 
    at Object.Module._extensions..js (module.js:405:10) 
    at Module.load (module.js:344:32) 
    at Function.Module._load (module.js:301:12) 
    at Function.Module.runMain (module.js:430:10) 
    at startup (node.js:141:18) 
    at node.js:1003:3 

我使用Bitnami MEAN 3.2.1-0系統上亞馬遜。

另外,爲什麼我要改變這個端口的原因是這樣的:

到目前爲止我所有的web服務端口3000進行操作。然而,我也有一個有文件夾public_htmlindex.html文件。所以當任何用戶想要顯示我的網頁時,他不僅要輸入網頁,還要輸入不方便的端口(3000)。

到目前爲止,整個應用程序停留在www.ec2-some-random-amazom-numbers.eu-west-1.compute.amazonaws.com:3000/index.html,所以我會購買一個正常的頂級域名指向它(例如something.com),但是 - 在那種情況下,我仍然需要將端口3000更改爲80?或者,將應用程序保留在80以外的端口上很常見?

如果是後者,那麼我是否可以離開這個港口,並在最後一個端口3000上指向整個長亞馬遜的頂級域名?

例如:當用戶輸入www.something.com時,它會將他重定向到 www.ec2-some-random-amazom-numbers.eu-west-1.compute.amazonaws.com:3000/index.html

回答

2

像這樣的東西應該爲你工作:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000 

你想用iptables來轉發請求,在未來的80端口到端口3000的內部。

+0

謝謝。你能否給我一個暗示,讓應用程序在'3000'端口是安全的並且可以用作生產環境?然後,我只需將我的頂級域名指向'address.com:3000/index.html',並讓所有web服務在端口'3000'上工作。 – user3766930

+0

我不認爲這會是'不安全'。我個人不喜歡用戶必須記住進入一個端口,但如果你有少量的用戶,他們/可以'受過訓練',那麼我認爲不會有問題。 –

4

根據您遇到的錯誤,(EADDRINUSE),其他一些Web服務器正在您服務器上的端口80上偵聽。如果你能阻止該服務器的運行,那麼你就可以改變你的應用在端口80上運行 執行以下操作:

  1. 弄清楚發生了什麼已經在80端口的服務器上運行。它很可能是Apache。嘗試使用netstat進行驗證。
  2. 殺死它(並防止它重新啓動)。這將取決於聽什麼。
  3. 將您的應用程序移至端口80,就像您已經嘗試過的一樣。

其他資源:

-1

我都面臨着同樣的問題。

解決的辦法是開始使用端口80NodeJsExpressJs應用程序,我的意思是 var port = 80和使用sudo node bin/www

,當應用程序在端口上運行我的問題是不能夠從互聯網上訪問應用程序啓動應用程序3000NodeJs App in AWS using port 3000 is not accessible from Internet

+1

以root身份啓動服務器不是一個好主意。 – TGrif

相關問題