2015-09-18 48 views
1

我在同一台服务器上使用nodejs,socket.io和apache。 Apache的重定向从端口80到443,它与SSLProxyEngine一个间接重定向到3000端口我的SSL-的NodeJS服务器会后请求 - 做工精细,网络代理块socket.io

问题:

在一些地区,只有在端口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_CONNECTION_TIMED_OUT)。

我试图把端口设置为像FTP(21)这样的公共端口,但浏览器表示不允许使用此端口。

你有什么想法吗?

这里有一些文件:

Apache的虚拟主机:

<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> 

(我代替我的域名与domain.com)

+0

您是否找到了解决方法? –

回答

0

解决方案 工作得很好。

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> 

HTTPS(使用LetsEncrypt)=> com.domain勒的ssl.conf

<IfModule mod_ssl.c> 

    <VirtualHost *:443> 
     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> 

     SSLCertificateFile /etc/letsencrypt/live/domain.com/fullchain.pem 
     SSLCertificateKeyFile /etc/letsencrypt/live/domain.com/privkey.pem 
     Include /etc/letsencrypt/options-ssl-apache.conf 
    </VirtualHost> 
</IfModule> 

client.js

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" 
}); 

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(或您使用的端口)。