【问题标题】:How to find Node.js Socket.io connection address with SSL?如何使用 SSL 查找 Node.js Socket.io 连接地址?
【发布时间】:2016-06-20 23:22:07
【问题描述】:

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

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

【问题讨论】:

  • 有什么更新吗?你能让这个工作吗?我有同样的问题。非常感谢!
  • @kevnk 不幸的是,没有!我最终放弃并使用Pusher。它每天最多免费发送 200,000 条消息,这对我来说绰绰有余。设置大约需要 10 分钟...

标签: node.js laravel ssl socket.io laravel-forge


【解决方案1】:

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

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

第二,我做了一个代理传递,所以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 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')
})

【讨论】:

    【解决方案2】:

    改变这个

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

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

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

    【讨论】:

    • 有趣。我试过这个,但在尝试加载大约 30 秒后超时......
    猜你喜欢
    • 2015-04-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 2013-05-27
    • 1970-01-01
    相关资源
    最近更新 更多