web-dev-qa-db-ja.com

http。80ポートでリッスンしているときのNode.js EACCESエラー(許可が拒否されました)

Node.jsは、httpポート80(デフォルトポート)で実行中に次のエラーをスローします。

Error: EACCES, Permission denied
    at Server._doListen (net.js:1062:5)
    at net.js:1033:14
    at Object.lookup (dns.js:132:45)
    at Server.listen (net.js:1027:20)
    at [object Context]:1:3
    at Interface.<anonymous> (repl.js:150:22)
    at Interface.emit (events.js:42:17)
    at Interface._onLine (readline.js:132:10)
    at Interface._line (readline.js:387:8)
    at Interface._ttyWrite (readline.js:564:14)

ノードにはルートアクセスが必要であることがわかりました。

通常、通常の状況ではルートアクセスを許可しません。ポート80(またはポート<1024)で使用するためのベストプラクティスは何ですか。

この link には同じ質問がありますが、答えは1つだけです(つまり、PREROUTING)。私のソリューションは他の方法も提供しています。

PREROUTING以外のリソースを徹底的に調べなければならないので、1つの場所ですべての回答を得るためにこれを書いています。知識を共有するためにすべての回答を1か所で行うのはなぜですか

19
Meet Mehta

参考:通常のユーザー権限では、1024未満のポートでソケットを実行できません。そのためにはrootアクセスが必要です。

エラーを解決するには、合計3つの方法があります。


1. rootアクセス権を付与して実行します(通常のアクセス権です)

2.他のポートにリダイレクトする

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.localにあるSudoは必要ありません。システムのブート時にコマンドがrootとして実行されるためです。

参照 リンク

3.ソケットをルートとして使用する通常のユーザー機能を付与します

目的:-完全なルートアクセスを提供するのではなく、任意のポートでサーバーを実行するために通常のユーザーがアクセスするためのsocket_root権限のみを付与します。

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

残念ながら、ルートとしてサインオンしない限り、通常http://localhost:3000などのURLを使用する必要があります-ポート番号に注意してください。

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

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

ここで、Nodeアプリケーションにポート80で実行したいことを伝えても、文句を言わないでしょう。

参照 リンク

一般情報リファレンス link Apache

56
Meet Mehta