Nginx + Node.js + Socket.io + SSL 可能吗?

Posted

技术标签:

【中文标题】Nginx + Node.js + Socket.io + SSL 可能吗?【英文标题】:Is Nginx + Node.js + Socket.io + SSL possible? 【发布时间】:2015-08-20 19:48:14 【问题描述】:

我正在尝试使用 nginx 作为代理运行 socket.io 聊天应用程序。当我通过 http+port 连接到服务器时它工作正常,但它不适用于 https。我看到用户连接/断开连接的事件通过,但没有发送到达客户端或服务器。

这是我的服务器 .conf (nginx/1.4.6 Ubuntu)

upstream websocket 
    server 127.0.0.1:8090;


server 
    listen 80;
    return 301 https://example.com$request_uri;


server 
    listen   443 ssl;

    ssl_certificate    /home/andrew/example.com/nginx/certs/example.com.cer;
    ssl_certificate_key    /home/andrew/example.com/nginx/certs/example.com.private.key;

    root /home/andrew/example.com/public;
    index index.html index.htm;

    server_name example.com;

    location /chat/ 
        rewrite ^/chat/?(.*)$ /$1 break;
        proxy_pass http://websocket;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
    

    location / 
        try_files $uri $uri/ =404;
    

服务器(节点 v0.12.1,Socket.io v1.3.5)

var express = require('express');
var app = express();
var server = require('http').createServer( app );
var io = require("socket.io").listen( server );

server.listen(8090);
console.log('listening on port 8090');

io.sockets.on( 'connection', function( socket )
    console.log( 'user connected' );

    var msg = "user connected!!!";
    socket.emit( 'message', msg );

    socket.on('disconnect', function()
        console.log('user disconnected');
    );

    socket.on('message', function( msg )
        socket.emit( 'message', msg );
        console.log('message: ' + msg);
    );

);

客户

<ul id="messages"></ul>
<form action="">
  <input id="m" autocomplete="off" /><button>Send</button>
</form>

<script src="https://example.com/chat/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
  var socket = io( "https://example.com/chat", path: '/chat/socket.io' );
  $('form').submit(function()
    socket.emit('message', $('#m').val());
    $('#m').val('');
    return false;
  );

  socket.emit('message', "sup");

  socket.on('message', function(msg)
    $('#messages').append($('<li>').text(msg));
  );      
</script>

【问题讨论】:

试试这个解决方案***.com/a/62187296/268598 【参考方案1】:

好的,原来是 node.js 代码中 socket.io 的命名空间存在问题。更多信息在这里:http://socket.io/docs/rooms-and-namespaces

这是一个服务器的工作示例

var app = require( 'express' )();
var http = require( 'http' ).Server( app );
var io = require( 'socket.io' )( http );
var nsp = io.of('/chat');  // this is what needs to happen


// and then we're listening to communication in the proper namespace
nsp.on( 'connection', function( socket )
    console.log( 'user connected' );

    socket.on('disconnect', function()
        console.log('user disconnected');
    );

    socket.on('message', function(msg)
        nsp.emit( 'message', msg );     // this will broadcast message to everybody connected within the same namespace
        console.log('message: ' + msg);
    );

);


http.listen( 8090, function()
    console.log( "listening on :8090" );
);

【讨论】:

你能帮我解决这个问题吗***.com/questions/45467169/… 嗨,你能帮我吗? ***.com/questions/49210006/…

以上是关于Nginx + Node.js + Socket.io + SSL 可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io 无法在 nginx + node.js + php 应用程序中连接

Socket.io无法在Node.js前面使用Nginx反向代理

从 Nginx 到 express.js 上的 socket.io 的反向代理上的“无法获取”

显示在线关注者的最佳方式是啥,node.js/socket.io 和 Redis

使用 Redis 在 PHP 和 socket.io/node.js 之间进行通信

带有 NGINX 和 http 2 的 Socket.io