2

我有一个在 Forge 服务器上运行的 Laravel PHP 应用程序。服务器上有多个 Nginx 站点。我正在尝试建立一个 Socket.io 连接。我之前使用 HTTP 运行过这个,但是使用 SSL 是中断的。

首先,我在 forge ( 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 设置是否应该有一些特定的东西?

非常感谢,这个问题已经很久了......

4

2 回答 2

0

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

首先,我将我的节点服务器放在伪造服务器上(这很好 b/c 所有代码都在同一个存储库中)

其次,我做了一个代理通行证,所以https://example.com/sockets会去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命名空间。所以我的节点服务器脚本看起来像这样:

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')
})
于 2016-04-11T04:41:36.303 回答
0

改变这个

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

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

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

于 2016-03-07T13:35:25.993 回答