2016-05-23 13 views
12

socket.ioを使用して最初のnode.jsアプリケーションを作成しました。具体的には、socket.ioによって公開されたchat exampleを実装しました。それは、ローカルで完璧に動作します。そして、私はそれをGoogle App Engineにデプロイしようとしました(ノードを動作させるためのいくつかのコード調整を行いました)。socket.ioをGoogle App Engineにデプロイするにはどうすればよいですか?

ノード部分が正常に動作していることを示すすべてが表示されます。しかし、チャットは動作しませんsocket.ioの部分が動作していないことを示す。デプロイされたアプリ(およびページソース)hereが表示されます。

私は何か追加を行う必要がありますか? yamlやjsonファイルに何か?

YAML内容:

runtime: nodejs 
vm: true 

skip_files: 
    - ^(.*/)?.*/node_modules/.*$ 

JSONコンテンツ:

{ 
    "name": "Chaty", 
    "description": "chatrooms app", 
    "version": "0.0.1", 
    "private": true, 
    "license": "Apache Version 2.0", 
    "author": "McChatface", 
    "engines": { 
    "node": "~4.2" 
    }, 
    "scripts": { 
    "start": "node app.js", 
    "monitor": "nodemon app.js", 
    "deploy": "gcloud preview app deploy" 
    }, 
    "dependencies": { 
    "express": "^4.13.4", 
    "socket.io": "^1.4.6" 
    } 
} 

答えて

4

GoogleはWebSocketをhereを使用した例のアプリを持っている、あなたはそれが正常に動作し得るには、以下の操作を行う必要があります。

  • クライアントがサーバーにアクセスできるようにサーバーのファイアウォールポートを開きます
  • Google App Engineで内部IPを取得すると、クライアントは接続するIPを知るようになります
  • あなたのIPをサーバーAPIまたはそれでなければなりませんHTMLページ

(ただし、それは私の言葉を取ることはありません、これは私は、ドキュメント上のいくつかの研究を行った後見つけることができましたものです)、それが役に立てば幸い!要するに

Google App Engineの中から、あなたの外部IPをフェッチ

var METADATA_NETWORK_INTERFACE_URL = 'http://metadata/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip'; 

function getExternalIp (cb) { 
    var options = { 
     url: METADATA_NETWORK_INTERFACE_URL, 
     headers: { 
      'Metadata-Flavor': 'Google' 
     } 
    }; 

    request(options, function (err, resp, body) { 
     if (err || resp.statusCode !== 200) { 
      console.log('Error while talking to metadata server, assuming localhost'); 
      return cb('localhost'); 
     } 

     return cb(body); 
    }); 
} 

ファイアウォールポートを開く

gcloud compute firewall-rules create default-allow-websockets \ 
    --allow tcp:65080 \ 
    --target-tags websocket \ 
    --description "Allow websocket traffic on port 65080" 
+1

私は近くにいるように感じますが、まだ動作するようにはなっていません。私はファイアウォールポートを開いて、google websocketプロジェクトを展開しました。それはうまくいった。しかし、私はsocket.ioで動作させる方法はまだ分かりません。 socket.ioは8080でリッスンしているサーバを使用しているため、expressを使用しています。 //サーバを起動する var server = app.listen(process.env.PORT || '8080'、 '0.0.0.0'、function(){ console.log( 'Ctrl + Cキーを押すと終了します。 ); }); var io = require( 'socket.io')(サーバー); –

+0

サンプルアプリへのリンクが壊れています。これは近いと思われる:https://github.com/GoogleCloudPlatform/appengine-websocketchat-java –

6

これは、製造上で行うことができず、work in processように見えます。適切なアーキテクチャは、hereのようにgoogleコンピューティングエンジンにチャットサーバーを設置することです。

しかし、Googleのアプリケーションエンジンでsocket.ioを使用するという概念の証明は、google appengine samples for websocketsに示されているものと非常によく似ています。

socket.ioの場合、サーバー側で次の手順を実行します。下のコードスニペット。

  1. 2番目の高速ミドルウェアとサーバーを作成します。
  2. 新しいサーバーでsocket.ioを添付/使用します。
  3. ポートを聴く(65080)。
  4. google計算エンジンのファイアウォール用ポート(65080)を開きます。
  5. working repositoryへのリンク。

ソケット。コマンドによるサーバ側のIOの変更が

var app_chat = require('express')(); 
    var server1 = require('http').Server(app_chat); 
    var io = require('socket.io')(server1); 
    server1.listen(65080); 

    io.on('connection', function (socket) { 
     console.log('user connected'); 
     socket.on('chat_message', function (data) { 
     console.log('client sent:',data); 
     socket.emit('chat_message', 'Server is echoing your message: ' + data); 
     }); 
    }); 

オープンファイアウォール

gcloud compute firewall-rules create default-allow-websockets \ 
    --allow tcp:65080 \ 
    --target-tags websocket \ 
    --description "Allow websocket traffic on port 65080" 

私は、Googleはすぐに十分にこれはなるように生産準備ができて解決策を思い付く願っていますあらゆるPaaSアーセナルの鍵となる鎧。

+0

Googleのサンプルアプリケーションへのリンクが壊れている。これは近いと思われる:https://github.com/GoogleCloudPlatform/appengine-websocketchat-java –

関連する問題