socket.io 无法通过快递与后端通信



我正在使用 socket.io 从快速应用程序获取一些数据。 在本地主机:8080 上一切正常,但是当我将代码部署到服务器时,客户端 socket.io 无法通过快速服务器与后端 socket.io 通信。我在服务器上有一个 apache,可以将所有内容转发到 localhost:8080,包括 domain.com/socket.io/?transform=polling...它将请求扩展到 Express 服务器,但 Express 返回 404(它来自 Express,而不是来自 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

由于您特别表示它可以在本地工作,并且我在您的代码中没有看到任何特别之处,因此我真的认为问题出在您的 Apache 配置中。

您需要拥有并启用一个名为mod_proxy_wstunnel的模块,以便使您的 WebSocket 流量正常工作并正确代理到您的快速应用程序。要么你有Apache 2.4,要么你需要应用这个补丁,在这个博客文章中找到,然后再次编译。还有另一个博客详细介绍了在 Ubuntu 下应该做什么。

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

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

您可能还希望尝试对随 WebSocket 发送的升级标头使用重写条件:

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

已经在此评论或此特定线程中看到过,它公开了您可以尝试的其他一些可能的解决方案。

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

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

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

我的猜测是你的 apache 服务器正在正确转发轮询请求,但是当 Socket.io 尝试向 websocket 进行切换时,Apache 拒绝了 WS 请求,socket.io 正在内部处理这种拒绝——这就是为什么 404 似乎来自快递。

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

最新更新