7

Node.js を使用して Web サーバーを作成しました。サーバー用に書いたテスターでサーバーをテストしようとすると、サーバーに使用しているポートが 80 でない場合にのみ成功します。netstat で確認しましたが、ポート 80 を使用しているアプリケーションは他にありません。コンソールに表示されるエラーは次のとおりです。

Error: connect ECONNREFUSED
  at errnoException (net.js:640:11)
  at Object.afterConnect [as oncomplete] (net.js:631:18)

この場合、何ができるでしょうか?

4

5 に答える 5

18

特権ユーザーとしてノードを実行する習慣をつけないでください。6つの異なるマシンで使用している方法は次のとおりです。

iptables次のように、ポート 80 の着信トラフィックを 8080 に転送するために使用します。

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

その後、必ず保存してください

sudo iptables-save

また、それを rc.local に追加して、再起動またはインスタンスの起動時に設定されるようにすることもできます (EC2 または他のクラウドの場合)。

その後、任意のユーザーとして 8080 でリッスンするノードを安全に開始できます。

于 2012-02-09T19:11:48.673 に答える
10

これは基本的にmaericsからの回答への追加ですが、コード例を追加したいので、セキュリティの問題を防ぐ方法を追加情報とともに別の回答を書きます。

通常、Web サーバーは 1024 未満のポートにバインドする必要があるため、root として開始されますが、実行するユーザーを特権のないユーザーに変更します。

を使用して node.js でこれを行うことができますprocess.setuid("username")

次の例では、サーバーを起動し、root として起動したときにポート 80 にバインドした後、ユーザー「www-data」に root 権限をドロップします。

function StartServer() {
  console.log("Starting server...");
  // Initalizations such as reading the config file, etc.
  server = http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
  });
  try {
    server.listen(80, "0.0.0.0", function(){
      process.setuid("www-data");
    });
  }
  catch(err) {
    console.error("Error: [%s] Call: [%s]", err.message, err.syscall);
    process.exit(1);
  }
}
于 2012-01-11T14:28:51.227 に答える
3

1024 未満のポート (80 を含む) を通常のユーザー (root 以外のユーザーなど) にバインドする権限がない場合は、より大きな番号のポート (1024 を超える、8080 など) を試してください。

[編集]

ターゲット システムに応じて、あなたがその管理者であると仮定すると、おそらく次のように問題を回避できます。

  1. 次のように、「 sudo」を使用してプログラムを実行しますsudo node ./myprogram.js

  2. または、システムに「root」ユーザーとしてログインし、通常どおりプログラムを実行します。

ただし、これらのいずれかを定期的に行う習慣を身につけないでください (理由がわかるまで)。悪意のある動機のある個人によって悪用される可能性のあるセキュリティ ホールが発生する可能性があります。

于 2012-01-09T17:57:16.437 に答える
0

Node.js (任意のポート > 1024) の前に Nginx サーバー (ポート 80) を使用します。それはうまくいきます。

于 2014-07-25T08:35:24.657 に答える
0

上記のリストにない代替オプションは、ノード実行可能ファイルで次のコマンドを実行して、プロセスが特権ポート (<1024) にバインドできるようにすることです。(パスを適応させる)

setcap 'cap_net_bind_service=+ep' /opt/meteor/.meteor/tools/latest/bin/node

厄介なのは、ノードの実行可能ファイルを更新または変更するたびに、このコマンドを再発行する必要があることです。

よろしく、

于 2014-05-05T12:03:26.323 に答える