nodejsでhttpサーバーにアクセスできない。
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,152
さくらvps/nginx環境下にNode.jsを導入し、手始めにhttpサーバを構築して見たのですがwebブラウザ上に表示するにはどうすれば良いのでしょうか?
ちなみにコードは以下の状況です。
var http = require('http');
var server = http.createServer();
server.on('request', function(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('hello world !!!');
res.end();
});
server.listen(port, 'ip');
console.log("server listening ...");
server.listen(port, 'ip');の部分には契約中のvpsで割り振られたipアドレスと自分で変更したport番号を入れていますが、これでwebブラウザに表示されない場合、nginxの設定をいじった方が良いの
でしょうか?
詳しい方いましたらよろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+4
問題切り分けのために以下手順お願いします
起動するかどうかチェック
- node.jsのhttpサーバを起動する
nodeプロセスに直接アクセスできるかどうかチェック
- vpsにsshした状態で
curl -i http://localhost:<port>/
する - vpsにsshした状態で
curl -i http://<global ip address>:<port>/
する - 手元から
curl -i http://<global ip address>:<port>/
する
nginx経由でアクセスできるかチェック(リバースプロキシしてるってことですよね?)
- vpsにsshした状態で
curl -i http://<global ip address>/
する - 手元から
curl -i http://<global ip address>/
する
■追記
切り分けありがとうございます!
<・node.jsのhttpサーバを起動する
まずこの時点で以下のエラーが出ます。
↓
Error: listen EADDRINUSE <ip>:<port>
ポートが使用中なのでlistenできないっていうエラーです。
<vpsにsshした状態でcurl -i http://<global ip address>:<port>/する
→「SSH-2.0-OpenSSH_7.4
Protocol mismatch.
curl: (56) Recv failure: 接続が相手からリセットされました」と出ます。
なんかsshdがレスポンス返してますね。
詳細よく分かりませんが、そのポート番号はsshdにすでに利用されているために、nodeがlistenすることができない状況のようです。
これはどうしよもないので、nodeが使うポート番号を変えるしかないです。
参考になるか分かりませんがhttpサーバ情報を以下に書き換えた場合、サーバ自体は普通に動くみたいです。
が、これは普通に「127.0.0.1:8080」でアクセスしてもページが表示されず。
他のipを指定しろということなのでしょうか。。。
この挙動が不可解ですね、、、。
念のため確認させていただきたいのですが、「VPSにsshログインした上でcurl 127.0.0.1:8080
してもアクセスできない」ということで相違ないでしょうか。
127.0.0.1は自分自身を表すIPアドレスなので、手元のPCから試みるとVPSではなく手元のPC自身にアクセスを試みます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
2018/05/10 22:23
ご指摘いただいたチェックをそれぞれトライしてみたのでご報告します。
<・node.jsのhttpサーバを起動する
まずこの時点で以下のエラーが出ます。
↓
Error: listen EADDRINUSE <ip>:<port>
at Server.setupListenHandle [as _listen2] (net.js:1330:14)
at listenInCluster (net.js:1378:12)
at doListen (net.js:1491:7)
at process._tickCallback (internal/process/next_tick.js:63:19)
at Function.Module.runMain (internal/modules/cjs/loader.js:721:11)
at startup (internal/bootstrap/node.js:228:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:576:3)
Emitted 'error' event at:
at emitErrorNT (net.js:1357:8)
at process._tickCallback (internal/process/next_tick.js:63:19)
[... lines matching original stack trace ...]
at bootstrapNodeJSCore (internal/bootstrap/node.js:576:3)
*ググったが情報がほぼ英語だったので読んでない。
<vpsにsshした状態でcurl -i http://localhost:<port>/する
→「curl: (7) Failed connect to localhost; 接続を拒否されました」と出ます。
<vpsにsshした状態でcurl -i http://<global ip address>:<port>/する
→「SSH-2.0-OpenSSH_7.4
Protocol mismatch.
curl: (56) Recv failure: 接続が相手からリセットされました」と出ます。
<手元からcurl -i http://<global ip address>:<port>/する
→しばらく待っても応答なし。
<nginx経由でアクセスできるかチェック(リバースプロキシしてるってことですよね?)
おっしゃる通りでリバースプロキシしてるのですが、現状の設定として「/etc/nginx/conf.d/virtual.conf」に以下を入れています。
↓
----------
server {
listen 80;
server_name <ドメイン>;
location / {
proxy_pass http://127.0.0.1:<ポート番号>;
}
}
----------
また、「/etc/nginx/nginx.conf」内の設定は特にいじってませんが、この辺りの設定を変えた方が良いんでしょうか?
ちなみに現状のサーバ状態はこちらの記事を参考にさせていただいて構築したので念のためリンク貼っておきます。https://qiita.com/axross/items/9160ee10a9cd9fe2bb45
以上になります。
かえって分かりにくくなってたらごめんなさい。
2018/05/10 22:34 編集
参考になるか分かりませんがhttpサーバ情報を以下に書き換えた場合、サーバ自体は普通に動くみたいです。
↓
----------
var http = require('http');
var server = http.createServer(function (req, res) {
res.writeHead(
200,
{
'Content-Type':'text/html'
}
);// END writeHead
res.end('<h1>Hello Node</h1>');
});//END createServer
server.listen(8080);
console.log('server started on 8080');
----------
が、これは普通に「127.0.0.1:8080」でアクセスしてもページが表示されず。
他のipを指定しろということなのでしょうか。。。
一応参考までに。
2018/05/10 22:48
見れなければ、そもそもnginxの設定が間違っています。
2018/05/10 23:36
2018/05/11 08:22 編集
<ポートが使用中なのでlistenできないっていうエラーです。
<なんかsshdがレスポンス返してますね。
こちらについてはポートを22から任意の番号に変更したのでそれが理由ですかね。
この場合はご指摘の通りnodeのポートを変えてみるしかなさそうですね。
※大変お手数なのですがnodeのポート変更手順を教えていただきたいです > <
<念のため確認させていただきたいのですが、「VPSにsshログインした上でcurl 127.0.0.1:8080してもアクセスできない」ということで相違ないでしょうか。
です。状況としては
・curl -i http://<global ip address>:<port>/ → 接続先がリセットされました
・curl -i http://localhost:<port>/ → 接続を拒否されました
・curl 127.0.0.1:8080 → 接続を拒否されました
と出ます。
ちなみに以下のケースはどちらも<HTTP/1.1 200 OK>は返ってきますね。(nginxのデフォルトindex.htmlが返ってくる)
↓
<vpsにsshした状態でcurl -i http://<global ip address>/する
<手元からcurl -i http://<global ip address>/する
127.0.0.1:8080の挙動不審の件は謎ですが、ひとまずnodeのポート変更を試みてみたら良いですかね〜。
※あと、ローカル環境(Vagrant/Centos6.9/Apache/2.2.15)で同じことをやった場合問題なくweb上に表示されました。その際「server.listen(1337, '127.0.0.1');」と指定したのですが1337って何なんですか?(設定例をググるとよく出てきます)
2018/05/11 08:42 編集
引数がそれぞれ「ポート番号」と「IPアドレス」です(なんで1337を使う設定例が多いのかは分かりません)。
ポート番号を変えるには第一引数を変えれば良いです。
上記の例では 127.0.0.1:1337 で待ち受け、グローバルIPアドレスではアクセスできません。
逆にグローバルIPアドレスを入れてしまうと127.0.0.1ではアクセスできなくなります。
今回はnginxからlocalhostのnodeプロセスにリバースプロキシするっていうことなので、最終的にIPアドレスとして'127.0.0.1'を指定し、グローバルIPアドレスでは直接アクセスできないようにするのが正しいです(最終的にはですが)。
ちなみにIPアドレスを省いてポート番号だけ入れると全IPアドレスでlistenするはずなので
server.listen(8080);
とした上で
http://<global ip addres>:8080/
または ssh して
http://localhost:8080/
でアクセスできるっていうのが想定した挙動です。
アクセスできないんですね。。なんでですかね、困りましたね。
2018/05/11 16:48
<なんで1337を使う設定例が多いのかは分かりません
ポートが1337の理由は確かに調べてもすぐ出てこないですね。
<http://<global ip addres>:8080/または ssh してhttp://localhost:8080/でアクセスできるっていうのが想定した挙動です。
そうですね、おっしゃる通りの想定通りに行かないのがしんどいところです。。。
今のところ総当たり的に色んなこと試してるんですが全部空振りなので、もうちょい情報仕入れてみますね。ローカル環境の方はApache入れてて普通にアクセスできたのを考えるとやっぱりnginx自体の設定の問題かな?って気もしますし。
もうちょっと探ってみます、解決したらまたコメントさせて頂きますね。
非常に参考になる回答を頂き助かりました!
2018/05/11 16:50
改めて確認してみますね、ご指摘ありがとうございます。
2018/05/11 16:50
2018/05/13 22:47
ただ相変わらず127.0.0.1はダメでMacのネットワークユーティリティでping送信するとこんなん出ます。→<1 packets transmitted, 0 packets received, 100.0% packet loss>
やっぱり127.0.0.1通らないのは気持ち悪いので改めて調査してみます。(別トピック立てるかもしれません)
以上、現状報告でした。
もうちょいほじくってみます。
2018/05/13 23:40
2018/05/14 10:29
ありがとうございます。
2018/05/14 10:30