Node.jsをポート80で実行する際のベストプラクティス(Ubuntu / Linode)[終了]


260

上に最初のNode.jsサーバーをセットアップしていますが、cloud Linux nodeの詳細はかなり新しいですLinux admin。(ところで、Apacheを同時に使用するつもりはありません。)

すべてが正しくインストールされていますがroot login、を使用しない限りport 80、ノードでリッスンできないことがわかりました。ただし、セキュリティ上の理由から、ルートとしては実行しないでください。

次のことを行うためのベストプラクティスは何ですか。

  1. 安全/サンドボックス化されるように、ノードに適切な権限/ユーザーを設定しますか?
  2. これらの制約内でポート80を使用できるようにします。
  3. ノードを起動して自動的に実行します。
  4. コンソールに送信されるログ情報を処理します。
  5. その他の一般的なメンテナンスとセキュリティの問題。

ポート80のトラフィックを別のリスニングポートに転送する必要がありますか?

ありがとう

回答:


532

ポート80

私のクラウドインスタンスでは、次のコマンドでポート80をポート3000にリダイレクトしています。

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

次に、Node.jsをポート3000で起動します。ポート80へのリクエストは、ポート3000にマッピングされます。

また、/etc/rc.localファイルを編集して、その行からsudo。これにより、マシンの起動時にリダイレクトが追加されます。あなたが必要としないsudo/etc/rc.local、コマンドは次のようにそこで実行されるため、rootシステムのブート時。

ログ

永久モジュールを使用してNode.jsを起動します。クラッシュした場合は再起動し、コンソールログをファイルにリダイレクトします。

起動時に起動

Node.js起動スクリプトを、ポートリダイレクト用に編集したファイルに追加します/etc/rc.local。これにより、システムの起動時にNode.js起動スクリプトが実行されます。

デジタルオーシャンとその他のVPS

これはLinodeだけでなく、Digital Ocean、AWS EC2、その他のVPSプロバイダーにも当てはまります。ただし、RedHatベースのシステムで/etc/rc.local/ect/rc.d/localです。


3
その答えをありがとう、素敵で要領を得ています。
Robotbugs 2013年

21
ところで、Ubuntuでは、
etc / rc.local

12
多くの場合、「-i eth0」フラグは仮想プライベートサーバーの問題になります。必要に応じてeth0を置き換えます。
JHAWN、2014

7
Node.js起動スクリプトをに追加すると、システムブート時と/etc/rc.local同じように実行されませんrootか?これは、ポート80リダイレクトの目的を無効にします。
jamix 2014年

4
ポートリダイレクトを機能させるには、宛先ポートもファイアウォールで設定する必要があることに注意してください。ブート時にノードインスタンスを開始するWRTでは、ユーザーを指定できるディストリビューションのinitスクリプト/ systemdファイルを使用します。
bk138 14

116

安全なユーザーにポート80を使用する許可を与える

アプリケーションをrootユーザーとして実行することは望ましくありませんが、問題があります。安全なユーザーには、デフォルトのHTTPポート(80)を使用する権限がありません。あなたの目標は、次のような使いやすいURLに移動することで、訪問者が使用できるWebサイトを公開できるようにすることです。http://ip:port/

残念ながら、rootとしてサインオンしない限り、通常http://ip:port、ポート番号> 1024のようなURLを使用する必要があります。

多くの人がここで行き詰まっていますが、解決策は簡単です。いくつかのオプションがありますが、これは私が好きなものです。次のコマンドを入力します。

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

これで、ノードアプリケーションにポート80で実行するように指示しても、文句は表示されません。

この参照リンクを確認してください


9
これはより良い、より簡単な答えです。
Kyle Chadha

2
また、ここに追加詳細な回答はstackoverflow.com/questions/23281895/...
ミートメータ

1
NGINXのようなWebサーバーはどのようにポート80で実行されますか?同様のことをしますか?
エリックアンドリュールイス

1
@EricAndrewLewis:場合によります。このエラーは、サーバーを非ルートモードで実行しているときに表示されます。Nginxサーバーをrootユーザーとして実行している場合はどうなりますか?また、通常のユーザーとして実行していてエラーが発生した場合。上記のコマンドを実行して、ポートにアクセスするための安全なアクセス許可を付与します。また、stackoverflow.com / questions / 31369480
Mehtaを

16

ポート80(または443)にバインドした後、ルート権限を削除します。

これにより、ポート80/443を保護したまま、ルートとしてリクエストを処理することができなくなります。

function drop_root() {
    process.setgid('nobody');
    process.setuid('nobody');
}

上記の関数を使用した完全に機能する例:

var process = require('process');
var http = require('http');
var server = http.createServer(function(req, res) {
    res.write("Success!");
    res.end();
});

server.listen(80, null, null, function() {
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
    drop_root();
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
});

詳細については、この完全なリファレンスをご覧ください。


9

ポート80(元の質問でした)については、ダニエルはまさに正しいです。私は最近SSL証明書を管理する軽量のnginxプロキシに移動しhttps、切り替えなければなりませんiptablesでした。私は重宝な答えを一緒に要旨によるgabrielhpuglieseそれを処理する方法について。基本的に私は

うまくいけば、誰か他の人の頭痛を救うことができます。これを行うには純粋なノードの方法があると確信していますが、nginxは高速で機能しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.