我正在使用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
答案 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)
即使我有同样的问题。服务器正在侦听的端口是在服务器上打开的端口。在本地,所有端口都是打开的,但在服务器上,情况并非如此。