web-dev-qa-db-ja.com

ほとんどのポートで待機しているときの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としてnodeを実行する必要があるからです。私はなぜこれが起こるのかわかりませんが、Sudoを使うことでそれを直します。しかし、これは私がHerokuでそれを修正する方法を説明していません。 Herokuでrootとして実行する方法はありません。そのため、どうすればポート80で待機できますか?

214
jwegner

あなたのワークステーションで走る

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

もっと高いポートを試すか、Sudoを使って高い権限で実行してください。 process.setgid および process.setuid を使用して低いポートにバインドした後に特権を格下げすることができます。 - ).

Herokuで走る

アプリケーションをherokuで実行するときは、PORT環境変数で指定されているとおりにポートを使用する必要があります。

http://devcenter.heroku.com/articles/node-js を参照してください。

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

server.listen(port, function() {
  console.log('Listening on ' + port);
});
305
Ben Taber

非特権ユーザー(root以外)は、1024未満のポートで待機中のソケットを開くことができません。

165
user1303768

これ の参照リンク を確認してください。

ポート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で実行するように指示しても、文句は言われません。

84
Meet Mehta

もう1つの方法は、ポートのリダイレクトを行うことです。

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

そして1024以上のポートでサーバを動かしてください:

require('http').createServer().listen(3000);

ところで、https(443)ポートについても同じことができます。

8
eleven

これは、ノードが定義済みポートをlistenできないことを意味します。 1234、2000、3000などに変更してサーバーを再起動します。

3
Mark Karwowski

ああ、神様!!私の場合、私は....listen(ip, port)の代わりに...listen(port, ip)をしていました、そしてそれはエラーmsgを投げていました:Error: listen EACCES localhost

私は3000以上のポート番号を使用していて、管理者権限でも試しました。何もうまくいきませんでした。それからもっとよく見て、私はその問題に気づいた。それを...listen(port, ip)に変更しました、そして、すべてはうまく働き始めました!

それが他の誰かに役立つならば念のためこれを呼び出すだけで...

私は私のMacでもこのエラーが出ました。 WindowsでNodejsアプリケーションを実行するためにnpm run devを使用しますが、それはうまく機能します。しかし、私は自分のMacでこのエラーに遭遇しました - error given was: Error: bind EACCES null:80

これを解決する1つの方法は、rootアクセスで実行することです。あなたはSudo npm run devを使うことができ、あなたはあなたのパスワードを入れる必要があるでしょう。

一般的には、root権限がなくても動作する3000などの特権のないポートでアプリケーションを処理することをお勧めします。

参照: http 80ポートでリスンしているときのNode.js EACCESエラー(権限が拒否されました)

2
ZILONG PAN

Sudoを使用してポート80にバインドし、env変数PORT&NODE_ENVを使用している場合は、ユーザープロファイルではなくルートプロファイルの下にあるので、これらの変数を再エクスポートする必要があります。だから、私のMac上でこれを動作させるために私は次のようにしました:

Sudo su
export NODE_ENV=production
export PORT=80
docpad run
1
Sean

Authbindを試してください。

http://manpages.ubuntu.com/manpages/hardy/man1/authbind.1.html

インストール後、使用したいポート番号の名前のファイルを次のフォルダーに追加できます。/ etc/authbind/byport /

それにchmodを使用して500の許可を与え、あなたがプログラムを実行したいユーザーに所有権を変更してください。

その後、プロジェクトでそのユーザーとして "authbind node ..."を実行します。

1
DraughtGlobe

これはあなたがローカルにホストしようとしているポートがportfowardedである場合に起こります

1
Jasper Smith

Macでこのエラーが発生したのは、デフォルトではノードサーバーで使用されているポートと同じポートを使用してApacheサーバーを実行していたためです(私の場合はポート80です)Sudo apachectl stop

これが誰かを助けることを願っています。

1
mabounassif