web-dev-qa-db-ja.com

80番ポート(Ubuntu / Linode)でNode.jsを実行するときのベストプラクティス

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

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

ベストプラクティスは次のとおりです。

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

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

ありがとう

244
Robotbugs

ポート80

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

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

その後、ポート3000でNode.jsを起動します。ポート80への要求はポート3000にマッピングされます。

/etc/rc.localファイルも編集して、その行からSudoを引いたものを追加する必要があります。マシンが起動したときにリダイレクトが追加されます。 /etc/rc.localSudoは必要ありません。システムの起動時に、そこにあるコマンドがrootとして実行されるからです。

ログ

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

起動時に起動

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

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

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

503
Daniel

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

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

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

多くの人がここで立ち往生しますが、解決策は簡単です。いくつかの選択肢がありますが、これは私が好きなものです。次のコマンドを入力してください。

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

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

これをチェックしてください 参照リンク

107
Meet Mehta

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

これにより、ポート80/443を保護したままにしながら、rootとして要求を処理できないようにすることができます。

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());
});

詳細はこちら のフルリファレンス をご覧ください。

13
slund

ポート80(これは最初の質問でした)に関しては、ダニエルはまさに正しいです。私は最近httpsに移行し、iptablesからSSL証明書を管理する軽量のnginxプロキシに切り替える必要がありました。 answergabrielhpugliese による Gist とそれをどのように処理するかについて私は見つけました。基本的に私は

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

7
Nick Benes

Linodeはあなたがマシンのためにポートを開かなければならないところにある「前壁」あるいはファイアウォールを提供しますか?たぶんそれはすべてのマシン上でルーティングするよりも良い解決策を見つけるための良い場所でしょうか? Azureにサーバーを展開するときは、いわゆるエンドポイントを定義する必要があります。エンドポイントには、パブリックポート、プライベートポート(マシン上)、およびプロトコル(TCP/UDP)が含まれています。あなたがサーバーのポート3000でアプリを実行しているのであれば、それはポート80で到達可能であり、ルーティングはマシンではなくプラットフォームによって行われます。エンドポイントにACLを設定することもできます。