2017-05-29 85 views
0

我正在使用socket.io从快速应用中获取一些数据。在localhost:8080上一切正常,但是当我将代码部署到服务器时,客户端socket.io无法通过express服务器与后端socket.io进行通信。我有一个服务器上的Apache,将所有内容转发到localhost:8080,其中包括domain.com/socket.io/?transform=polling ...并将请求扩展到express服务器,但是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 blogpost中的this patch并重新编译。还有另一个blog详细说明你应该在Ubuntu下做什么。

确保您有模块及其加载后,你必须调整你的配置使用ProxyPass指令

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

您也可能想尝试使用一个重写条件添加一些的WebSocket代理对正在使用WebSockets发送的升级头:

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

你应该采取的一个调试步骤是在快速应用程序中运行模拟客户端,并尝试使用本地主机或任​​何回送IP地址连接到服务器端口。换句话说(纯粹作为一个临时测试工具),您将一个socket.io Node客户端放入您的Express应用程序中,该应用程序被实例化并立即尝试连接到Socket.io服务器(它也在快速应用程序中)。这应该工作。

如果确实有效,您已经确定您的快递服务器不是问题。然后,在刚刚添加到快速应用程序的客户端上,应该将连接地址从本地IP更改为服务器的实际IP地址。

如果它不起作用,您的问题可能是服务器端。

我的猜测是你的Apache服务器正在转发轮询请求,但是当Socket.io尝试切换到websockets时,Apache正在拒绝WS请求,而socket.io正在内部处理这种拒绝 - 这是为什么404似乎来自快递。

相关问题