2016-03-07 28 views
1

我在Forge服务器上运行Laravel PHP应用程序。服务器上有多个Nginx站点。我试图建立一个Socket.io连接。我以前使用HTTP运行此操作,但SSL使用中断。如何使用SSL查找Node.js Socket.io连接地址?

首先,我伪造了一个新网站(socket.mydomain.com)并使用Forever来运行Node.js脚本。我知道脚本正在运行,因为它正在接收事件并将它们输出到控制台中 - 我只是无法连接到前端。

我socket.io脚本是:

var https = require('https'), 
    fs = require('fs'); 

var options = { 
    key: fs.readFileSync('/etc/nginx/ssl/socket.example.com/54082/server.key'), 
    cert: fs.readFileSync('/etc/nginx/ssl/socket.example.com/54082/server.crt') 
}; 

var app = https.createServer(options); 

var io = require('socket.io').listen(app); 

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

    console.log('connected'); 

}); 

app.listen(3000); 

我使用前端代码是:

<script type="text/javascript" src="https://socket.example.com/socket.io/socket.io.js"></script> 
<script type="text/javascript"> 

var io = io('https://socket.example.com', {secure: true}); 

.... 

有谁知道我怎样才能使与SSL这项工作?比如,地址/端口应该是什么?我如何在正确的端口上启动Forever?我的Nginx应该设置一些具体的东西吗?

很多很多的感谢,这一直是年龄的问题....

+0

任何更新?你能做到这一点吗?我有同样的问题。非常感谢! – kevnk

+1

@kevnk不幸的是没有!我最终放弃并使用[Pusher](http://pusher.com)。它每天免费发送200,000条消息,这对我来说已经足够了。花了大约10分钟设置... – samiles

回答

0

改变这种

var io = io('https://socket.example.com', {secure: true}); 

var io = io('https://socket.example.com:3000', {secure: true}); 

为您的节点的应用程序正在侦听端口3000

+0

有趣。我试过这个,但是在尝试加载大约30秒后它会超时... – samiles

0

这是最终为我工作的设置:

首先,我把我的节点服务器锻造服务器上

,我做了一个代理通过这样https://example.com/sockets会去(B/C所有的代码是在同一仓库这是好的) http://MY_PRIVATE_IP:8080

nginx的配置:

location /socket/ { 
    proxy_pass http://MY_PRIVATE_IP:8080/; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Forwarded-Proto $scheme; 
} 

第三,(该部分我无法弄清楚一天半)做代理通行证使得socket.io namespaced。所以,那么我的节点服务器的脚本是这样的:

server.js:

var http = require('http') 
var server = http.Server(); 

var io = require('socket.io')(server); 
var nsp = io.of('/socket/:8080'); 
var Redis = require('ioredis'); 
var redis = new Redis(); 

redis.subscribe('test-channel'); 

redis.on('message', function(channel, data){ 
    message = JSON.parse(data); 
    nsp.emit(channel + ':' + message.event, message.data); 
}) 

server.listen(8080, process.env.SOCKET_PRIVATE_HOST, function(){ 
    console.log('node server running') 
})