socket.io无法通过快递

时间:2017-05-29 18:53:36

标签: node.js express websocket socket.io coffeescript

我正在使用socket.io从express应用程序中获取一些数据。在localhost:8080上一切正常,但是当我将代码部署到服务器时,客户端socket.io无法通过快速服务器与后端socket.io进行通信。我在服务器上有一个apache,它将所有内容转发到localhost:8080,包括domain.com/socket.io/?transform=polling ...它将请求扩展到快速服务器但快递返回404(它来自表达,而不是来自apache)。我没有想法,可能是什么问题?这是我的代码:

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

3 个答案:

答案 0 :(得分:1)

由于您明确表示它在本地运行,并且我在代码中看不到任何特殊内容,因此我认为该问题存在于您的Apache配置中。

您需要拥有一个名为mod_proxy_wstunnel的模块,以便让您的WebSocket流量正常工作并正确地代理您的快速应用程序。要么你有Apache 2.4,要么你需要在this patch中应用this blogpost并再次编译。还有一个blog详细说明了你应该在Ubuntu下做什么。

在确定您已加载模块及其后,您必须调整您的配置以使用ProxyPass指令添加一些WebSocket代理

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

您可能还想尝试在使用WebSockets发送的Upgrade标头上使用重写条件:

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

已经在this comment或一般的这个特定线程中看到过,它揭示了您可以尝试的其他一些可能的解决方案。

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:-1)

即使我有同样的问题。服务器正在侦听的端口是在服务器上打开的端口。在本地,所有端口都是打开的,但在服务器上,情况并非如此。