私はアプリをテストしています(うまくいけば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は完璧に機能します。
何が原因でしょうか?
私は自分のローカルコンピュータでEACCESエラーが発生していることを理解しました。これらの特定のポートにバインドするにはrootとしてnodeを実行する必要があるからです。私はなぜこれが起こるのかわかりませんが、Sudoを使うことでそれを直します。しかし、これは私がHerokuでそれを修正する方法を説明していません。 Herokuでrootとして実行する方法はありません。そのため、どうすればポート80で待機できますか?
原則として、root権限なしで実行されているプロセスは1024未満のポートにバインドすることはできません。
もっと高いポートを試すか、Sudo
を使って高い権限で実行してください。 process.setgid
および process.setuid
を使用して低いポートにバインドした後に特権を格下げすることができます。 - ).
アプリケーションを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);
});
非特権ユーザー(root以外)は、1024未満のポートで待機中のソケットを開くことができません。
これ の参照リンク を確認してください。
ポート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で実行するように指示しても、文句は言われません。
もう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)ポートについても同じことができます。
これは、ノードが定義済みポートをlistenできないことを意味します。 1234、2000、3000などに変更してサーバーを再起動します。
ああ、神様!!私の場合、私は....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などの特権のないポートでアプリケーションを処理することをお勧めします。
Sudoを使用してポート80にバインドし、env変数PORT&NODE_ENVを使用している場合は、ユーザープロファイルではなくルートプロファイルの下にあるので、これらの変数を再エクスポートする必要があります。だから、私のMac上でこれを動作させるために私は次のようにしました:
Sudo su
export NODE_ENV=production
export PORT=80
docpad run
Authbindを試してください。
http://manpages.ubuntu.com/manpages/hardy/man1/authbind.1.html
インストール後、使用したいポート番号の名前のファイルを次のフォルダーに追加できます。/ etc/authbind/byport /
それにchmodを使用して500の許可を与え、あなたがプログラムを実行したいユーザーに所有権を変更してください。
その後、プロジェクトでそのユーザーとして "authbind node ..."を実行します。
これはあなたがローカルにホストしようとしているポートがportfowardedである場合に起こります
Macでこのエラーが発生したのは、デフォルトではノードサーバーで使用されているポートと同じポートを使用してApacheサーバーを実行していたためです(私の場合はポート80です)Sudo apachectl stop
これが誰かを助けることを願っています。