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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

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

nginx

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

JavaScript

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

Q&A

解決済

1回答

2609閲覧

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

kt_shindo

総合スコア13

Node.js

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

nginx

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

JavaScript

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

0グッド

0クリップ

投稿2018/05/09 23:40

さくら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の設定をいじった方が良いの
でしょうか?

詳しい方いましたらよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

問題切り分けのために以下手順お願いします

起動するかどうかチェック

  • 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/09 23:46

編集2018/05/10 14:36
set0gut1

総合スコア2413

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kt_shindo

2018/05/10 13: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 以上になります。 かえって分かりにくくなってたらごめんなさい。
kt_shindo

2018/05/11 03: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を指定しろということなのでしょうか。。。 一応参考までに。
mtdsnsk

2018/05/10 13:48

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

2018/05/10 14:36

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

2018/05/10 23: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って何なんですか?(設定例をググるとよく出てきます)
set0gut1

2018/05/10 23: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/ でアクセスできるっていうのが想定した挙動です。 アクセスできないんですね。。なんでですかね、困りましたね。
kt_shindo

2018/05/11 07:48

set0gut1さん、重ねて詳しい解説ありがとうございます! <なんで1337を使う設定例が多いのかは分かりません ポートが1337の理由は確かに調べてもすぐ出てこないですね。 <http://<global ip addres>:8080/または ssh してhttp://localhost:8080/でアクセスできるっていうのが想定した挙動です。 そうですね、おっしゃる通りの想定通りに行かないのがしんどいところです。。。 今のところ総当たり的に色んなこと試してるんですが全部空振りなので、もうちょい情報仕入れてみますね。ローカル環境の方はApache入れてて普通にアクセスできたのを考えるとやっぱりnginx自体の設定の問題かな?って気もしますし。 もうちょっと探ってみます、解決したらまたコメントさせて頂きますね。 非常に参考になる回答を頂き助かりました!
kt_shindo

2018/05/11 07:50

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

2018/05/11 07:50

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

2018/05/13 13: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通らないのは気持ち悪いので改めて調査してみます。(別トピック立てるかもしれません) 以上、現状報告でした。 もうちょいほじくってみます。
set0gut1

2018/05/13 14: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です。
kt_shindo

2018/05/14 01:29

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

2018/05/14 01:30

承知しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問