7910


### Apache + Node.js + Socket.IO 環境による動作でSocketエラーが発生

先日からNode.jsを触りだし、チャット機能を実装したサーバを立てた所、下記事象が発生致しました。

* * *

80番ポートでApacheを起動させているローカルサーバーに下記のリバースプロキシを設定し、Node.jsサーバーへ接続しております。

**httpd.conf**

[code]

    < Location /server>
    ProxyPass http://127.0.0.1:8124
    ProxyPassReverse http://127.0.0.1:8124/
    < /Location>
    
[/code]

「(hogehoge.com[ドメイン])/server」以下にアクセスした場合、Node.jsで立てたサーバーへアクセスしております

**Node.js - app.js**

[code]

    var http     = require("http");
    var socketio = require("socket.io");
    var fs       = require("fs");
    
    var server = http.createServer(function(req, res) {
         res.writeHead(200, {"Content-Type":"text/html"});
         var output = fs.readFileSync("./index.html", "utf-8");
         res.end(output);
    }).listen(process.env.VMC_APP_PORT || 8124);
    
    var io = socketio.listen(server);
    
    io.sockets.on("connection", function (socket) {
    
      console.log("Connection");
    
      // メッセージ送信（送信者にも送られる）
      socket.on("C_to_S_message", function (data) {
        console.log("Sender Send");
        io.sockets.emit("S_to_C_message", {value:data.value});
      });
    
      // ブロードキャスト（送信者以外の全員に送信）
      socket.on("C_to_S_broadcast", function (data) {
        console.log("BloadCast Send");
        socket.broadcast.emit("S_to_C_message", {value:data.value});
      });
    
      // 切断したときに送信
      socket.on("disconnect", function () {
    //    io.sockets.emit("S_to_C_message", {value:"user disconnected"});
      });
    });
    
[/code]

**Node.js - index.html**

[code]

    <!DOCTYPE HTML>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>node.js chat</title>
      <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
      <script src="http://nodejs.lo/server/socket.io/socket.io.js"></script>
      <script type="text/javascript">
    
      var s = io.connect('http://nodejs.lo/server'); //ローカル
    
      //サーバから受け取るイベント
      s.on("connect", function () {
        console.log("Connect OK");
      });  // 接続時
      s.on("disconnect", function (client) {
        console.log("Close OK");
      });  // 切断時
      s.on("S_to_C_message", function (data) {
        addMessage(data.value);
      });
    
      //クライアントからイベント送信（イベント名は自由に設定できます）
      function sendMessage() {
        var msg = $("#message").val(); //取得
        $("#message").val(""); //空白にする
        s.emit("C_to_S_message", {value:msg}); //サーバへ送信
      }
    
      function sendBroadcast() {
        var msg = $("#message").val(); //取得
        $("#message").val(""); //空白にする
        s.emit("C_to_S_broadcast", {value:msg}); // サーバへ送信
      }
    
      //jqueryでメッセージを追加
      function addMessage (value,color,size) {
        var msg = value.replace( /[!@$%<>'"&|]/g, '' ); //タグ記号とかいくつか削除
        $("#msg_list").prepend("<div class='msg'>" + msg + "</div>");
      }
    
      </script>
      <style>
        *{
          font-size:30px;
          margin:0;
          padding:0;
        }
      </style>
    </head>
    <body>
      <div id="msg_list" style="height:300px; overflow:auto;"></div>
      <form action="" method="post" onsubmit="return false;">
        <input type="text" class="text" style="width:95%; padding:10px" id="message"/>
        <input type="submit" class="button" style="padding:10px" onclick="sendMessage();" value="みんなに送信" />
        <input type="submit" class="button" style="padding:10px" onclick="sendBroadcast();" value="自分以外に送信" />
      </form>
    </div>
    </body>
    </html>
    
[/code]

**ブラウザのコンソールに出力されているエラー**

[code]

    GET ttp://nodejs.lo/socket.io/?EIO=3&transport=polling&t=1426313600982-0 404 (Not Found)
    content.scripts.c.js:11 TableManager::findTables()
    socket.io.js:2919 GET ttp://nodejs.lo/socket.io/?EIO=3&transport=polling&t=1426313602201-1 404 (Not Found)
    socket.io.js:2919 GET ttp://nodejs.lo/socket.io/?EIO=3&transport=polling&t=1426313604016-2 404 (Not Found)
    socket.io.js:2919 GET ttp://nodejs.lo/socket.io/?EIO=3&transport=polling&t=1426313607637-3 404 (Not Found)
    socket.io.js:2919 GET ttp://nodejs.lo/socket.io/?EIO=3&transport=polling&t=1426313612676-4 404 (Not Found)
    
[/code]

socket.io.jsのリクエスト先が「/server」以下になっていない為、エラーが出力されていると考えておりますが、socket.io.jsのリクエスト先を調整できる箇所を発見できませんでした。

上記のエラーおよび設定方法に関して心当たりがある方、恐れ入りますがご教示をお願いいたします。


CC BY-SA 4.0
2015-03-14T06:31:13.103
7906
2019-09-11T08:10:07.813
2020-06-17T08:14:45.997
-1
8806
question
node.js apache websocket
Apache + Node.js + Socket.IO 環境による動作でSocketエラーが発生


英語版に同様の質問があったので転載します。  
- [How do I get socket.io running for a subdirectory - Stack Overflow](https://stackoverflow.com/questions/25896225/how-do-i-get-socket-io-running-for-a-subdirectory)

>
[code]

>     var io = require('socket.io')(httpServer, {path:
> '/mysubdir/socket.io'});
>  
[/code]

>
> のようにlistenしている場合、
[code]

>     var socket = io.connect('http://www.example.com', {path:
> "/mysubdir/socket.io"});
>  
[/code]

>
> のように指定します。

つまり、今回の場合

サーバー

[code]

    var io = require('socket.io')(Server, {path: '/server/socket.io'});
    
[/code]

クライアント

[code]

    io.connect('http://nodejs.lo',{path:'/server/socket.io'});
    
[/code]

※質問内のドメインがごちゃごちゃしているようですがコード内に利用されていたドメインに合わせました。  
ところでもちろんApache HTTPDの`proxy_wstunnel_module`はロードしてますよね？


CC BY-SA 3.0
2015-03-14T13:25:55.600
7910
2015-03-15T08:46:49.977
2017-05-23T12:38:56.083
-1
2376
7906
answer


上記の内容を参考にして調整した所、動作致しました。

[code]

    var io = require('socket.io')(httpServer, {path: '/server/socket.io'});
    
[/code]

上記のrequireを行った場合

> /hogehoge/nodejs/chat/app.js:2 > var socketio = require("socket.io")  
>  var socketio = require("socket.io")(httpServer, {path:
> '/server/socket.io'});  
>  ^  
>  ReferenceError: httpServer is not defined

上記のエラーが出力されたので原因を調査してみます。  
※ 上記requireでなくても動作は致しました。

> ところでもちろんApache HTTPDのproxy_wstunnel_moduleはロードしてますよね？

上記のモジュールをロードしておりませんでした。  
これから動作環境に取り込んでみます。


CC BY-SA 3.0
2015-03-15T03:31:32.383
7930
2015-03-15T03:31:32.383
8806
7906
answer