質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.81%

  • JavaScript

    14339questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Node.js

    1628questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • nginx

    747questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

nodejsでhttpサーバーにアクセスできない。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 224

kt_shindo

score 4

さくら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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

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/11 12:35 編集

    ps.
    参考になるか分かりませんが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

    公開ディレクトリにindex.htmlなどのファイルを配置して、それが見れるか確認してみてください。
    見れなければ、そもそもnginxの設定が間違っています。

    キャンセル

  • 2018/05/10 23:36

    追記しました〜ありがとうございます

    キャンセル

  • 2018/05/11 08:27 編集

    set0gut1さん追記確認いたしました、ありがとうございます。

    <ポートが使用中なので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 編集

    server.listen(1337, '127.0.0.1')
    引数がそれぞれ「ポート番号」と「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

    set0gut1さん、重ねて詳しい解説ありがとうございます!

    <なんで1337を使う設定例が多いのかは分かりません
    ポートが1337の理由は確かに調べてもすぐ出てこないですね。


    <http://<global ip addres>:8080/または ssh してhttp://localhost:8080/でアクセスできるっていうのが想定した挙動です。
    そうですね、おっしゃる通りの想定通りに行かないのがしんどいところです。。。

    今のところ総当たり的に色んなこと試してるんですが全部空振りなので、もうちょい情報仕入れてみますね。ローカル環境の方はApache入れてて普通にアクセスできたのを考えるとやっぱりnginx自体の設定の問題かな?って気もしますし。

    もうちょっと探ってみます、解決したらまたコメントさせて頂きますね。
    非常に参考になる回答を頂き助かりました!

    キャンセル

  • 2018/05/11 16:50

    mtdsnskさん
    改めて確認してみますね、ご指摘ありがとうございます。

    キャンセル

  • 2018/05/11 16:50

    あまりお力にならず残念です〜。頑張ってください。朗報お待ちしてます!

    キャンセル

  • 2018/05/13 22:47

    set0gut1さん、先日はお世話になりました。まず<global ip addres>でのアクセスは無事できました、結局firewalldにポート追加(8080と8000)したら通りました、(CeontOS7は都度ポート追加しなきゃいけないの??と新たな疑問が...)お手数おかけしました。

    ただ相変わらず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

    macから127.0.0.1のpingが返ってこないっていのは、macが自分自身にpingを送り、セキュリティ設定により応答していないっていう状況のようです。 http://yukisaibai.hatenablog.com/entry/2015/04/26/121649 / VPSにsshしてping 127.0.0.1と打つと疎通すると思うので、それでokです。

    キャンセル

  • 2018/05/14 10:29

    ping疎通してみました、127.0.0.1開けない状況は変わらずなので一旦ペンディングします。
    ありがとうございます。

    キャンセル

  • 2018/05/14 10:30

    承知しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    14339questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Node.js

    1628questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • nginx

    747questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。