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

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

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

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

nginx

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

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

0回答

3204閲覧

Nginx(リバースプロキシ)×node.js(Express)で下層パスごとのアプリでsocket.ioを使用したい

tomato513

総合スコア12

Node.js

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

nginx

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

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2018/08/28 03:32

####実現したい事
https://sample-web.com/->3000ポート
https://sample-web.com/write->4000ポート
https://sample-web.com/read->5000ポート
上記のように1つのドメインで3つのアプリを下層パス毎に起動させています。
Node.jsの性質上の負荷分散のため、このような形でNginxでリバースプロキシを張り、運用したいと考えています。
実現したい事は、各ポートで起動しているapp.js内のsocket.io処理をそれぞれ別々に記述させたいと考えています。

####現状どうなっているのか

Nginx

1server { 2 listen 443 ssl; 3 ssl_certificate /etc/nginx/ssl/ssl.crt; 4 ssl_certificate_key /etc/pki/tls/certs/server.key; 5 server_name sample-web.com; 6 ssl_session_cache shared:SSL:1m; 7 ssl_session_timeout 5m; 8 ssl_ciphers HIGH:!aNULL:!MD5; 9 ssl_prefer_server_ciphers on; 10 ssl_protocols TLSv1.1 TLSv1.2; 11 ssl_stapling on; 12 resolver 000.000.000.000 valid=300s; 13 14 location /write { 15 proxy_pass http://sample-web.com:4000/; 16 proxy_set_header Upgrade $http_upgrade; 17 proxy_set_header Connection "upgrade"; 18 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 19 proxy_set_header Host $host; 20 proxy_http_version 1.1; 21 } 22 23 location /socket.io/ { 24 proxy_pass http://sample-web.com:4000; 25 proxy_set_header Upgrade $http_upgrade; 26 proxy_set_header Connection "upgrade"; 27 } 28 29 30 location / { 31 proxy_pass http://sample-web.com:3000/; 32 } 33}

javascript

1const express = require('express'); 2const app = express(); 3const http = require('http').Server(app); 4const io = require('socket.io')(http); 5 6//中略 7 8io.on('connection',(socket)=>{ 9 console.log('connect /write app socket.io connected'); 10}); 11 12http.listen(4000, function(){ 13 console.log('listening on *:4000'); 14}); 15 16

HTML

1<!--中略--> 2<script src="/socket.io/socket.io.js"></script> 3<script type="text/javascript"> 4var socket = io(); 5</script>

Nginxの/socket.io/要求がくれば、4000ポートのアプリに返しているため、
4000ポートで起動しているapp.js内であれば上記のconsole.logが出力されます。
しかし、3000ポート、5000ポートで起動しているapp.js内にもio処理を記述したのですが、
4000ポートのapp.jsでしかsocketの受付が行われません。
それぞれのポートで、io処理を行う+記述もそのポートで起動させているapp.js内に行う事は可能でしょうか?
何かヒントでもいいのでお知恵をお貸しいただければ幸いです。

####試した事
http://m-shige1979.hatenablog.com/entry/2017/07/31/080000
こちらのブログの記事を参考に、それぞれ記述を修正しました。

javascript

1//記事を参考に修正してみたapp.js(各ポート) 2const express = require('express'); 3const app = express(); 4const http = require('http').Server(app); 5const io = require('socket.io')(http); 6 7//中略 8io.of("/write(or read)").on("connect",function(){ 9 console.log('connect /各ポート app socket.io connected'); 10}); 11 12http.listen(各ポート(3000,4000,5000), function(){ 13 console.log('listening on *:各ポート(3000,4000,5000)'); 14});

html

1<!--中略--> 2<script src="/write(or read)/socket.io/socket.io.js"></script> 3<script type="text/javascript"> 4var socket = io.connect("https://resource-japan.com:4000/write(or read)"); 5</script>

結果は下記エラーで接続できませんでした。

GET https://sample-web.com/write/socket.io/socket.io.js 404 (Not Found) Refused to execute script from 'https://sample-web.com/write/socket.io/socket.io.js' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled.

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問