【发布时间】:2017-06-22 12:43:19
【问题描述】:
我在我的 cakephp3 应用程序中使用 socket.io 来向连接的客户端显示他们处理的请求的状态。
套接字脚本(Server.js):
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var jsdom = require("jsdom");
const { JSDOM } = jsdom;
var dom = new JSDOM("");
var $ = require("jquery")(dom.window);
io.on('connection', function(socket){
console.log('A user connected');
socket.on('Event 1', function(data, fn){
// Data received successfully!!!
fn();
// Processing
sock.emit('Return 1', {data});
});
socket.on('disconnect', function(){
console.log('A user disconnected');
});
socket.on('Event 2', function(data){
// Processing
var uid = data['uid']; //adding same user socket
if(!sockets_uid[uid]){
sockets_uid[uid] = [];
}
sockets_uid[uid].push(socket);
$.each(sockets_uid, function(i, sock){
sock.emit('Return 2', res);
});
});
http.listen(2105, function(){
console.log('Started on 2105');
});
客户端javascript(client.js)放在default.ctp(CakePHP默认渲染布局):
var nodeToken = "<?= $this->request->session()->read('nodeToken');?>";
var socket = io('http://localhost/node', {secure: true, query: {token: nodeToken}});
socket.on('connect_error', function(){
console.log('Unable to connect);
});
当客户端通过http://localhost:2105 连接到节点服务器时,工作流按预期工作。
但是在将代码移植到生产环境时,我使用 apache(v2.4.7) 来屏蔽端口,使用 Proxy Pass 和 rewrite 将任何请求转发到 http://localhost/node。
Apache2 配置:
通过 apache 连接到节点后,初始连接已成功建立,客户端正在按预期接收来自节点服务器的响应。由于在 default.ctp 中编写了套接字客户端连接,因此与节点服务器的连接在每次页面刷新时刷新或使用相同的 default.ctp 布局重定向到任何其他视图。
我面临的问题是,一旦执行了某些操作——比如调用另一个任何视图 ctp,父客户端就无法接收节点服务器推送给客户端的任何更新。
如果不使用 apache 并且节点服务器直接与 client.js 中的端口连接,那么一切都按预期工作,所以我怀疑 apache2 proxy pass 配置中一定有问题。我已经启用了mod_proxy 和mod_ws_proxy 模块。
任何帮助将不胜感激。
【问题讨论】:
标签: node.js apache websocket socket.io cakephp-3.0