2017-05-29 10 views
0

私はエクスプレスアプリからいくつかのデータを取得するためにsocket.ioを使用しています。 localhost:8080ではすべてうまく動作しますが、サーバーにコードをデプロイすると、クライアント側のsocket.ioはエクスプレスサーバー経由でバックエンドのsocket.ioと通信できません。私はlocalhost:8080にdomain.com/socket.io/?transform=pollingを含むすべてを転送するサーバー上のApacheを持っています...そしてそれはエクスプレスサーバーへの要求を拡張しますが、Expressは404を返します(それは明示、apacheからではない)。私はアイデアがありません、何が問題なのでしょうか?ここに私のコードは次のとおりです。socket.ioは、エクスプレスでバックエンドと通信できません

express = require "express" 
jade = require "jade" 
fs = require "fs" 

class Bootstrap 
_self = undefined 
routes: 
    DEFAULT_PATH: "/" 
    TEMPLATE_PATH: "/load/:view" 
    DIRECTIVE_PATH: "/directive/:template" 
options: 
    templatePath: "#{__dirname}/../src/templates" 
    isDev: "#{__dirname}/../dev" 
contentPath: "#{__dirname}/../frontend" 
libraryPath: "#{__dirname}/../bower_components" 
port: 8080 
status: 
    notFound: 404 
isDev: undefined 

constructor: -> 
    _self = @ 
    @isDev = fs.existsSync @options.isDev 
    @app = express() 

    @app.use "/frontend", express.static(@options.contentPath) 
    @app.use "/bower_components", express.static(@options.libraryPath) 
    @app.set "views", @options.templatePath 
    @app.set "view engine", "jade" 
    @app.engine "jade", jade.__express 

    @app.get @routes.DEFAULT_PATH, (request, response)-> 
    appData = 
     data: 
     isDev: _self.isDev 
    response.render "index", appData 
    @app.get @routes.TEMPLATE_PATH, (request, response)-> 
    view = request.param "view" 
    response.render view 
    @app.get @routes.DIRECTIVE_PATH, (request, response)-> 
    template = request.param("template").replace ".html", "" 
    response.render "directives/"+template 
    @app.use (request, response, next)-> 
    _self.logger.warning "404 Not Found!: " + request.originalUrl 
    response.status(_self.options.status.notFound) 
     appData = 
     data: 
      isDev : _self.isDev 
      request: request 
     response.render "404", appData 

    @server = @app.listen @options.port 
    @io = require("socket.io").listen @server 

    @logger = require("./logger.js") 
    @logger.init @isDev 

    @socketConnector = require("./live.js") 
    @socketConnector.init @io 

    @ 

new Bootstrap() 

あなたがここに全体のコードを見つけることができます:https://github.com/eyurdakul/ejder.be

+0

Apacheの書き換えルールとログを提供できますか?また、そのサーバーからの着信要求をログに記録できますか?それは問題のデバッグに役立ちます。 – TheGiantBeast

答えて

1

あなたは具体的にはローカルで動作すると言い、あなたのコードには何も特別なものは見当たらないので、私は本当にあなたのApache設定に問題があると思います。

mod_proxy_wstunnelと呼ばれるモジュールがあります.WebSocketトラフィックを動作させ、高速アプリケーションに正しくプロキシするには、有効にして有効にする必要があります。 Apache 2.4をお持ちの場合はthis patchthis blogpostに追加してもう一度コンパイルする必要があります。また、別のblogが、Ubuntuで何をすべきかを段階的に詳述しています。

あなたはモジュールとそのロードさを持っているを確認した後、あなたはまた、書き換え条件を使用しようとする場合がありますProxyPassディレクティブ

ProxyRequests Off 
ProxyPass  "/socket-io/" "ws://localhost:8080/socket.io/" 
ProxyPassReverse "/socket-io/" "ws://localhost:8080/socket.io/" 

を使用して、いくつかのWebSocketプロキシを追加するために、あなたの設定を微調整する必要がありますWebSocketをして送信されUpgradeヘッダに:

RewriteEngine On 
RewriteCond %{HTTP:Connection} Upgrade [NC] 
RewriteRule /(.*) ws://localhost:8000/$1 [P,L] 
ProxyPass/http://localhost:8000/ 

this commentまたはあなたが試すことができますいくつかの他の可能な解決策を公開し、一般的に、この特定のスレッドで見ています。

+0

mod_proxy_wstunnelが解決策でした。 – eyurdakul

-1

はさえ、私は同じ問題がありました。サーバーがリッスンしているポートはサーバー上で開いています。ローカルではすべてのポートが開かれていますが、サーバー上ではそうではありません。

+0

まあ、彼らは私がソケットのための専用のポートを使用しなかったので、すべて8080ポートを使用すると思います。明らかに、これはsocket.ioがexpressで動作する方法です。 – eyurdakul

0

モーッククライアントをエクスプレスアプリケーションで実行し、localhostを使用してサーバーポートに接続しようとするか、ループバックIPアドレスが何であるかを確認する必要があります。言い換えれば(単に一時的なテストツールとして)、socket.io NodeクライアントをExpressアプリケーションに配置してインスタンス化し、直ちにエクスプレスアプリにもあるSocket.ioサーバーに接続しようとします。これはうまくいくはずです。

動作しても、エクスプレスサーバは問題ではないことがわかりました。エクスプレスアプリケーションに追加したクライアントで、接続アドレスをローカルIPからサーバーの実際のIPアドレスに変更する必要があります。

問題が解決しない場合は、おそらくサーバー側の問題です。

私の推測では、あなたのapacheサーバーがポーリングリクエストを適切に転送していると思いますが、Socket.ioがWebソケットへのハンドオフを試みると、ApacheはWSリクエストを拒否しています。なぜ404は急行から来ているようだ。

関連する問題