簡體   English   中英

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

[英]Is Nginx + Node.js + Socket.io + SSL possible?

我正在嘗試使用nginx作為代理運行socket.io聊天應用程序。 當我通過http +端口連接到服務器時,它工作正常,但它不適用於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>

好吧,事實證明這是socket.io的node.js代碼中的命名空間的問題。 更多信息: 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" );
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM