web-dev-qa-db-ja.com

Node.js接続はローカルホストでのみ動作します

Connectを使用して小さなnode.jsアプリを作成しました。このアプリはWebページを提供し、定期的に更新を送信します。また、ユーザーの観察結果を受け入れてディスクファイルに記録します。

Localhostにいる限り問題なく動作しますが、同じイントラネット上で他のコンピューターにアクセスさせることはできません。ポート3000を使用していますが、ポート8080または80に変更しても解決しませんでした。

接続のセットアップに使用しているコードは次のとおりです。

    
var io = require('socket.io'),
  connect = require('connect');

var app = connect().use(connect.static('public')).listen(3000);
var chat_room = io.listen(app);

上記のように、ポート番号を8080または80に変更しようとしましたが、違いは見られなかったため、ファイアウォールの問題だとは思いません(間違っている可能性があります)。 HTTPを扱った同様の質問を読んだ後、listen()に0.0.0.0を追加することも考えましたが、listen()がIPマスクパラメータを取るとは思われません。

39
schaz

ほとんどの場合、サーバーソケットは、「すべてのIPアドレス」のシンボリックIP 127.0.0.1ではなく、ループバックIPアドレス0.0.0.0にバインドされています(これはネットマスクではないことに注意してください)。これを確認するには、Sudo netstat -ntlp(Linuxの場合)またはnetstat -an -f inet -p tcp | grep LISTEN(OSX)を実行し、プロセスがバインドされているIPを確認します( ":3000"の行を探します)。 「127.0.0.1」が表示される場合、それが問題です。 listen呼び出しに「0.0.0.0」を渡すことで修正します。

var app = connect().use(connect.static('public')).listen(3000, "0.0.0.0");
91
Peter Lyons

他のユーザーがローカルマシンにアクセスするには、通常 ngrok を使用します。 Ngrokは、localhostをWebに公開し、インストールと起動が簡単なNPMラッパーを備えています。

$ npm install ngrok -g
$ ngrok http 3000

この使用例を参照してください。

enter image description here

上記の例では、ローカルで実行されている帆のインスタンス:localhost:3000は、次の場所にあるインターネットで利用可能です:http://69f8f0ee.ngrok.ioまたはhttps://69f8f0ee.ngrok.io

66
arcseldon

0.0.0.0へのバインドは、戦闘の半分です。 TCPポートをブロックするIPファイアウォール(システム環境設定のファイアウォールとは異なります。したがって、ポートをブロック解除する必要があります。

Sudo ipfw add <PORT NUMBER> allow tcp from any to any
6
Ashish Kaila

アプリで、ネットワーク内の任意のデバイスから到達可能にします

app.listen(3000, "0.0.0.0");

Azure、GCP、AWSのNodeJSの場合

リソースマネージャーにデプロイされたAzure vmの場合、仮想ネットワークセキュリティグループをチェックし、ポートまたはポート範囲を開いて到達可能にします。

GCPとAWSで同等のものを探す

5
ClusterAtlas

この問題の非常に簡単な解決策があります:process.argvは、ノードアプリに渡される引数のリストを提供します。だからあなたが実行した場合:

node server.js 0.0.0.0

あなたが取得します:

process.argv[0] //=> "node"
process.argv[1] //=> "server.js"
process.argv[2] //=> "0.0.0.0"

したがって、process.argv[2]は、リッスンするIPアドレスとして指定します。

http.listen(3000, process.argv[2]);

これで、アプリは「すべて」のIPアドレスをリッスンしています。たとえば、 http://192.168.1.4:3000/your_app です。

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

4
akelec

FedoraまたはCentos distroでselinuxとfirewalldを確認してください。私の場合、firewalldが接続を妨げました。

 Selinux:$ sestatus 
 SELinuxステータス:有効
 SELinuxfsマウント:/sys/fs/selinux
SELinuxルートディレクトリ:/etc/selinux
ロードされたポリシー名:ターゲット
現在のモード:{{checkmode}} 
設定ファイルからのモード:{{checkconfig}} 
ポリシーMLSステータス:有効
ポリシーdeny_unknownステータス:許可
最大カーネルポリシーバージョン:30 
 
 Firewalldステータス:$ systemctl status firewalld 
1
soloproper

この行で私のために働いています(単に実行時に-listenを追加してください):

node server.js -p 3000 -a : --listen 192.168.1.100

それが役に立てば幸い...

0
Meloman

この問題にかなりの時間苦労した後、ポート8080での着信接続を許可することで問題を解決できました。

.listen(8080, "0.0.0.0")ソリューションがうまくいかないと書いたので、ポート8080での接続がファイアウォールを通過できることを確認してください。

この投稿 Windowsファイアウォールの設定で新しい受信ルールを作成するのに役立ちました。

0
Bar Horing