2011-10-28 20 views
32

私はこのようなアプリケーションを作成して起動します:Node.js + Express:アプリケーションはポート80でリッスンを開始しません

express -s -t ejs 
npm install express 
npm install ejs 
node app.js 

それは(ポート3000で)動作します。しかし、私が行ってポートを80に変更すると、node app.jsが次のように出力されます。

node.js:198 
throw e; // process.nextTick error, or 'error' event on first tick 
     ^
TypeError: Cannot call method 'getsockname' of null 
at HTTPServer.address (net.js:746:23) 
at Object.<anonymous> (/var/www/thorous/app.js:35:67) 
at Module._compile (module.js:432:26) 
at Object..js (module.js:450:10) 
at Module.load (module.js:351:31) 
at Function._load (module.js:310:12) 
at Array.<anonymous> (module.js:470:10) 
at EventEmitter._tickCallback (node.js:190:26) 

これは私のラップトップでも動作しますが、ポート80が開いているAmazon EC2インスタンスでは動作しません。 何が間違っているか把握することができます。任意のヒント?

+0

にポート80上のトラフィックを転送することができます。 –

答えて

57

は、rootとしてあなたのアプリを起動していますか?より低いポート番号にはroot特権が必要です。 おそらく、sudoノードapp.jsが機能しますか?

しかし、root権限でポート80でnode.jsアプリケーションを実行しないでください。決して!

私の提案は、ポート上で実行されているnode.jsアプリケーションのリバースプロキシとしてnginxをフロントで実行することです。ひどいエラーメッセージで3000

+0

それはうまくいった!セキュリティのヒントありがとう。 – Vitaly

+7

node.jsアプリケーションをポート80でrootとして実行しない理由について詳しく説明できますか?イム好奇心(初心者のjs dev)。 – Christopher

+9

これはノードにのみ適用されます。サーバーソフトウェアをrootとして実行することはお勧めしません。特権ポートを使用したいので、プロセスは特権を落とし、そのポート上のすべての着信トラフィックを、それほどプロポーショナルでないユーザーで実行されている対応するプロセスに「転送」します。これは完璧なプログラムではないためです。すべてのソフトウェアにバグがあり、セキュリティ上の問題があります。攻撃者がこのようなバグを利用してコードを挿入できる場合、このプロセスを実行しているユーザーとして実行されます。したがって、プロセスがルートとして実行されている場合、攻撃者はマシン上の何かを行うことができます。 –

0

これまでにポート80で実行していたことがありますか?

おそらく、ポートスキャンを実行して、まだ使用されていないことを確認しますか?

nc -z <<your IP>> 80 

優しさ、

ダン

+0

私は何も考えることができません。これはnode.jsのコピーがインストールされ、mongodbサーバーが動作している新しいインスタンスです。 ncは何も返さなかった。 – Vitaly

66

あなたが本当にこれをしたい場合は、3000

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3000 
+0

これは素晴らしいです!私は問題を解決することができた! –

+1

nginxや他のプロキシソリューションなしで素敵できれいな答え! – hazelnut

+0

このコマンドの使用には注意してください。サーバーにrootとしてログインしている場合は、すべてのドメインのトラフィックがポート3000に転送されます。 –

関連する問題