Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 网络代理块socket.io_Node.js_Apache_Sockets_Proxy - Fatal编程技术网

Node.js 网络代理块socket.io

Node.js 网络代理块socket.io,node.js,apache,sockets,proxy,Node.js,Apache,Sockets,Proxy,我在同一台服务器上使用了nodejs、socket.io和apache。Apache将请求从端口80重定向到443,然后使用SSLProxyEngine间接重定向到端口3000上的我的SSL NodeJS服务器-工作正常 问题: 在某些区域,只允许端口80和443,不允许端口3000 当我改变时: io.connect('https://domain.com:3000', { path: '/socket.io' }); 为此: io.connect('https://domain.com',

我在同一台服务器上使用了
nodejs
socket.io
和apache。Apache将请求从端口80重定向到443,然后使用
SSLProxyEngine
间接重定向到端口3000上的我的SSL NodeJS服务器-工作正常

问题:

在某些区域,只允许端口80和443,不允许端口3000

当我改变时:

io.connect('https://domain.com:3000', { path: '/socket.io' });
为此:

io.connect('https://domain.com', { path: '/socket.io' });
io.connect('https://domain.com:443', { path: '/socket.io' });
// whatever ...
无法访问服务器(
net::ERR\u CONNECTION\u TIMED\u OUT

我试图将该端口设置为公共端口,如FTP(21),但浏览器表示不允许使用该端口

你有什么想法吗

以下是一些文件:

Apache vhost:

<VirtualHost *:443>
    ServerName domain.com

    SSLProxyEngine On
    RequestHeader set Front-End-Https "On"
    ProxyPass / https://domain.com:3000/ retry=1 acquire=3000 timeout=600 Keepalive=On
    ProxyPassReverse / https://domain.com:3000/
    // localhost not working 

    SSLEngine on
    SSLCertificateKeyFile    ...
    SSLCertificateFile       ...
    SSLCertificateChainFile  ...

</VirtualHost>

ServerName域名.com
SSLProxyEngine打开
RequestHeader将前端Https设置为“开”
ProxyPass/https://domain.com:3000/ 重试=1获取=3000超时=600保持激活=On
ProxyPassReverse/https://domain.com:3000/
//本地主机不工作
斯伦金安
SSLCertificateKeyFile。。。
SSLCertificateFile。。。
SSLCertificateChainFile。。。
(我用domain.com替换了我的域名)

解决方案 工作得很好

HTTP=>com.domain.conf

<VirtualHost *:80>
    ServerName domain.com

    RewriteEngine On
    RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
    RewriteCond %{QUERY_STRING} transport=websocket    [NC]
    RewriteRule /(.*)           ws://localhost:3000/$1 [P,L]

    <Location />
        ProxyPass http://127.0.0.1:3000/
        ProxyPassReverse http://127.0.0.1:3000/
    </Location>

</VirtualHost>
app.js

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var port = process.env.PORT || 3000;
var io = require('socket.io')(server);

server.listen(port, function(err) {
    console.log('HTTP-Server started on port ' +     port);
});

app.use(express.static(__dirname + '/public'));

io.on('connection', function(socket) {

    console.log('connection: ' + socket.id);

    socket.emit('hello', function(res) {
        console.log('Client received "hello"');
    });

    socket.on('disconnect', function(exception) {
        console.log('disconnect: ' + socket.id);
    });

});

提示:如果您尚未安装防火墙,请执行此操作并阻止端口3000(或您正在使用的端口)。

您找到解决方案了吗?
var url = window.location.href;
var domain = url.split("/")[0] + "//" + url.split("/")[2];

var socket = io.connect(domain, { path: '/socket.io' });

socket.on('hello', function(callback) {
    callback(); // confirm receiving "hello"
});
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var port = process.env.PORT || 3000;
var io = require('socket.io')(server);

server.listen(port, function(err) {
    console.log('HTTP-Server started on port ' +     port);
});

app.use(express.static(__dirname + '/public'));

io.on('connection', function(socket) {

    console.log('connection: ' + socket.id);

    socket.emit('hello', function(res) {
        console.log('Client received "hello"');
    });

    socket.on('disconnect', function(exception) {
        console.log('disconnect: ' + socket.id);
    });

});