it-swarm-ja.com

異なるIPアドレスを使用するポート80上のNodeJSとApache-異なるIPのポート80を使用するように構成されている場合でも、Apacheはポート80をクリアする必要があります

127.0.0.2:80のポート80でnode.jsアプリを使用しています

server.listen(80, '127.0.0.2', function() {...

そして、another ip address、say 127.0.0.3:80のポート80でApacheを使用したいので、これを持っています私のhttpd.confで

Listen 127.0.0.3:80
ServerName 127.0.0.3:80

しかし、それは私にエラーを与えます

Apache port (80) is already used by another application!

Apacheは、それ自体がリッスンするようにプログラムされているIPのポート80に関係なく、ランダムなポート80を気にするのはなぜですか。関係する限り、127.0.0.3:80のポート80はまだ空いています。

私も先に進んで、他のIPシリーズ(192.xxx、122.xxx)でこれを試しましたが、Apacheはポート80を解放し、完全に停止することを望んでいます。

奇妙なことに、最初にApacheを起動すると、問題なく起動します。その後、上記の同じ構成でnode.jsを起動することもでき、どちらも正常に動作します。しかし、貴重なApacheは、その高さが最初に開始される前に、何らかの理由でIPアドレスのポート80をリッスンする人を嫌います。

アプリケーションが127.0.0.2:80でリッスンしている場合、そのIPのポート80のみがビジーであり、他のIPのポート80はまだ空いているはずである127.0.0.3:80と誤解していますか?それとも、誤動作しているのはApacheですか?

1
laggingreflex

この回答の最後に、提案された基本的な解決策があることに注意してください。

HTTPはデフォルトでTCPを使用し、UDPは単一のポートにバインドする複数のプログラムをサポートしますが、TCPは通常サポートしません。したがって、このインスタンスでは、ポート80は特定のIPに対して空いていないように見えます。これは、ローカルマシン上で一度にそのIPでポート80(TCP)を使用するプログラムが1つしかない可能性が高いためです。

個別のループバックIPに関しては、全体127.x.x.xネットブロックがローカルループバック用に予約されていることに注意してください。したがって、127.0.0.1127.0.0.2(または127.0.0.3または127.127.127.127など)と同じコンピューター(つまりローカルホスト)を指します。また、「実際の」IP(つまり、個別の実際のNICまたは仮想NICを識別するIP)ではなく127.x.x.xループバックアドレスを使用しているため、2番目のIPを開始すると、特定のIPを持つポート80が別のアプリケーションによってすでに使用されている可能性があります。 1。

はい、ApacheにローカルループバックIPを使用して仮想ホスティングを実行させることができます(つまり、127.0.0.1127.0.0.2は異なるページを返すことができます)が、Apacheプロセスはデフォルトでは、引き続きグローバルにポート80(TCP)に関連付けられています。

奇妙なことに、最初にApacheを起動すると、問題なく起動します。その後、上記の同じ構成でnode.jsを起動することもでき、どちらも正常に動作します。

ここで「正常に動作している」とは何を指しているのかわかりませんが、Apacheを起動した後、ポート80でNode.js http-serverを起動しようとしました( npm install http-server -g ) 、127.0.0.4などのアドレスを指定してもエラーが発生しました。

image of node.js http server failing to start

設定ファイルで、Apacheが特に127.0.0.1:80をリッスンしていて、http-serverが127.0.0.4:80をリッスンしていることを確認する必要がありました。 ApacheにListen 80があった場合、http-serverが失敗しました。 Apache自体にとっても、プロセスごとに1つのTCP IP /ポートの組み合わせのみという原則の観点からも、Apacheが起動を拒否することは完全に正常です。

ソリューション

この問題の簡単な解決策は、同じマシンで複数のNICを実行することです(それぞれに固有のIPがあります)。このようにして、各NICは独自のポート80バインディングを持つことができます(IP +ポート=完全な宛先アドレス)。もう1つの可能性は、NICの「仮想インターフェイス」を試すことです(同じNICに2つの「仮想」IPを与えることができます)。


参照

スタックオーバーフロー-2つのアプリケーションが同じポートをリッスンできますか?

3
Anaksunaman