アプリをテストしています (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 環境変数で指定されたポートを使用する必要があります。
const server = require('http').createServer();
const port = process.env.PORT || 3000;
server.listen(port, () => console.log(`Listening on ${port}`));