ほとんどのポートでリッスンするときのNode.js EACCESエラー


250

アプリをテストしています(うまくいけば、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エラーが発生していることがわかりました。これがなぜ起こるかはわかりませんが、sudoを使用すると修正されます。しかし、これはHerokuでそれを修正する方法を説明していません。Herokuでrootとして実行する方法はないので、ポート80でリッスンするにはどうすればよいですか?


23
1024未満のポートには、従来より高い権限が必要です。Herokuでは、ポート80をリッスンせず、環境変数を介して指示するポートをリッスンし、ルーティングレイヤーにエッジでのポート80バインディングを処理させます。
マット・フリーマン

アップデート1が役に立ちました。'sudo node myporgram.js'を実行しました。
Sabre

回答:


352

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

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

より高いポートを試すか、を介して昇格された特権で実行してくださいsudoprocess.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, () => console.log(`Listening on ${port}`));

3
これは、Herokuが提供するポートを使用する必要があることを意味しますか?それから、それらは舞台裏でポート80に転送する魔法をかけますか?ポート80以外で何かを実行したい場合はどうなりますか?
jwegner

12
はい。$ PORTで通知するポートのみをリッスンできます。ポートへのルーティング80または443を処理します。実際のポートは、dynoを移動するたびに常に変化します。この時点で私たちは、公に80および443からのルーティングをサポート
ウィル

@その制限が解除される可能性はありますか?具体的には、80または443以外のポートでリッスンできますか?これはかなり制限されたセットであり、すべてを考慮に入れています。
ghayes 2012

2
アプリをhttpやhttpsとは異なるポートで実行するのはなぜですか?
ウィル

1
@Herokuでシンプルなゲームサーバーをホストしたいと思います。Unityはcrossdomain.xml843ポート経由で転送する必要があります。
polkovnikov.ph 2014

178

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


5
賛成-これは良い一般的なルールですが、Linuxの「機能」など、例外もあります。
mikemaccana

3
デバッグの時間を節約できました。私はそれについて知りませんでした。
Malharhak、2013年

6
私はこれは好きではありませんが、sudonodeを使用して高速サーバーを実行しているときに(実際にgulpが必要です)必要はありません。意味が
わから

この知恵の断片
モーリス

4
@blamb次に、MeetMehtaのソリューションを使用してください ; ^)
ruffin

107

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

安全なユーザーにポート80を使用する許可を与える

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

残念ながら、rootとしてサインオンしない限り、通常http://ip:port、ポート番号> 1024のようなURLを使用する必要があります。

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

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

これで、ノードアプリケーションにポート80で実行するように指示しても、文句は表示されません。


5
これは間違いなく最良の解決策です。
Mark Lagendijk

1
@MarkLagendijk:Markに感謝します。私は同じ質問を誤って尋ね、ここに詳細な回答を投稿しましたstackoverflow.com/questions/23281895/…。自由に編集してください。
2015

6
なぜこれが答えではないのですか
👍– KhaledMohamedP

@KhaledMohamedP:それが役に立ててうれしい:)
Mehtaを

これはまだpm2モジュールでは動作しないと誰が言っています。を使用pm2 killしてpm2を強制終了し、再作成します。
プラサントジャヤ2018

10

別のアプローチは、ポートをリダイレクトすることです:

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)ポートでも同じことができます。


1
ありがとうありがとう!これにより、セーフポートのデバッグに1時間、SSLリダイレクトにさらに1時間節約でき、AWS Lightstail上の開発サーバーの表示を制限することもできました(IPアドレスによるリクエストの微調整はできません)。
ミゲルモリン

3

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


3

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

私は> = 3000のポート番号を使用しており、管理者アクセスで試しました。何もうまくいきませんでした。その後、さらに見直して、問題に気づきました。に変更し...listen(port, ip)、すべてが正常に動作し始めました!!

他の誰かに役立つ場合に備えて、これを呼び出すだけです...


ありがとうございました!私も同じ問題を抱えていました。ホスト名、ポートを使用する他のすべてのAPIに慣れています。
デビッド

Wekan docker imageを実行しようとしたときにこの問題が発生しました。このヒントを使用して解決しました。ありがとうございました。
アンジェロPolotto

@ dilip-muthukurussimana ....listen(ip, port)(4で.)回答に含めるつもりでしたか?あなたがそのために議論の順序について話していることに気づくのに1分かかりました。
bschlueter

はい、私は引数の順序だけを意味しました。Plsは....そこに(4つのドット)を配置しません。
Dilip Muthukurussimana

2

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

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


2

Macでもこのエラーが発生しました。私npm run devはWindowsでNodejsアプリを実行するために使用していますが、正常に動作します。しかし、Macでこのエラーが発生しました- error given was: Error: bind EACCES null:80

これを解決する1つの方法は、rootアクセスで実行することです。使用することができsudo npm run dev、パスワードを入力する必要があります。

ルート権限なしで機能する3000などの非特権ポートでアプリケーションを提供することが一般的に望ましいです。

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


2

同様の問題が、ポート8080での実行を拒否しているだけでなくそれ以外の問題もありました。

判明したのは、env.local読み取ったファイルに次のような変数名の後にコメントが含まれていたためです。

PORT=8080 # The port the server runs at

そして、それはそのように解釈し、8080 # The port the server runs at明らかに無効なポート(-1)であるポート " " を使用しようとしました。コメントを削除すると完全に解決しました。

ちなみにWindows 10とGit Bashを使っています。


私はそれがないと知っている正確な問題は、ここで説明したが、それはそこに誰かを助けるかもしれません。私は私の質問の答えを見つけるために問題を見つけました。


うん、私はこれを経験しました。.envファイルの値の後のコメントがこれを引き起こす可能性があります。
ダノズ

1

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

sudo su
export NODE_ENV=production
export PORT=80
docpad run


1

authbindを試してください:

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

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

chmodを使用して500権限を付与し、プログラムの実行に使用するユーザーの所有権を変更します。

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


1

server.jsのポート番号を変更するだけでエラーが解決しました

const port = process.env.PORT || 8085;

ポート番号を8080から8085に変更しました。

それが役に立てば幸い。


0

さまざまな方法を試した後、WindowsにIISを再インストールすると問題が解決しました。


0

エラーは(Windowsの場合)を使用して解決されます

app.set('PORT', 4000 || process.env.PORT);

app.listen(app.get('PORT'), <IP4 address> , () => {
    console.log("Server is running at " + app.get('PORT'));
});

NodeJSアプリがWindowsファイアウォールのネットワークにアクセスできるようにします。


0

再起動では不十分でした!この問題を解決する唯一の方法は、次のとおりです。

そのポートで実行されているサービスを強制終了する必要があります。

コマンドで、管理者として実行し、次のように入力します。netstat-aon | / i "listening"を見つける

次に、アクティブなサービスのリストを取得し、4200で実行されているポートを検索し、最後の列であるプロセスIDを使用してそれを強制終了します

:taskkill / F / PID 2652

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.