ほとんどのポートでリッスンしているときにNode.js EACCESエラーが発生する 質問する

ほとんどのポートでリッスンしているときにNode.js EACCESエラーが発生する 質問する

アプリをテストしています (Heroku で実行できればと思っていますが、ローカルでも問題が発生しています)。http.Server.listen() を実行すると EACCES エラーが発生しますが、これは一部のポートでのみ発生します。

そこで、ローカルでは以下を実行しています:

joe@joebuntu:~$ node
> var h = require('http').createServer();
> h.listen(900);
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)

ポート 900 (または私が試した他の 20 個のポート) では何も実行されていないので、これは機能するはずです。奇妙なのは、一部のポートでは機能することです。たとえば、ポート 3000 は完全に機能します。

これは何が原因で起こるのでしょうか?

アップデート1:

ローカル コンピューターで EACCES エラーが発生するのは、特定のポートにバインドするためにノードを root として実行する必要があるためだとわかりました。なぜこれが起こるのかはわかりませんが、sudo を使用すると修正されます。ただし、Heroku で修正する方法については説明されていません。Heroku で root として実行する方法はありません。ポート 80 でリッスンするにはどうすればよいでしょうか。

ベストアンサー1

ワークステーションで実行

原則として、ルート権限なしで実行されているプロセスは 1024 未満のポートにバインドできません。

したがって、より高いポートを試すか、を介して昇格された権限で実行してくださいsudo。低いポートにバインドした後、次のように権限をダウングレードできます。process.setgidそしてprocess.setuid

Herokuで実行

Heroku でアプリを実行する場合は、PORT 環境変数で指定されたポートを使用する必要があります。

見るNode.js のドキュメント

const server = require('http').createServer();
const port = process.env.PORT || 3000;

server.listen(port, () => console.log(`Listening on ${port}`));

おすすめ記事