2013-10-07 60 views
1

我设置了第一个socket.io示例“使用与节点HTTP服务器”http://socket.io/#how-to-use背后的nginx反向代理。这一切都按预期工作,只要我保持http。如果我通过引入nginx重写规则将http重写为https(终止于nginx),我无法正常工作。如何获取socket.io示例使用nginx反向代理和https

客户的console.log显示我:

SecurityError: The operation is insecure.     socket.io.js (line 2371) 
this.websocket = new Socket(this.prepareUrl() + query); 

TypeError: this.websocket is undefined     socket.io.js (line 2438) 
this.websocket.close(); 

我是相当新的和的NodeJS也nginx的,所以我可以很好地做一些基本的错误,但尝试仍然使用Google我的小时后可以不能完全发挥作用。

Nginx的(V1.4.1)配置文件:

upstream dev { 
    server 127.0.0.1:8001; 
} 
server { 
    # Listen on 80 and 443 
    listen 80; 
    listen 443 ssl; 
    server_name _; 

    ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem; 
    ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key; 

    access_log /var/log/nginx/access.log; 
    error_log /var/log/nginx/error.log; 

    location /dev/ { 
      if ($ssl_protocol = "") { 
        rewrite^https://$host$request_uri? permanent; 
      } 
      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; 
      proxy_set_header Host $http_host; 
      proxy_set_header X-NginX-Proxy true; 

      proxy_pass http://dev/; 
      proxy_redirect off; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection "upgrade"; 
    } 
} 

的index.html:

<script src="./socket.io/socket.io.js"></script> 
<script> 

    var socket = io.connect('http://'+window.location.host+':8001'); 

    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 

server.js:

var app = require('http').createServer(handler) 
    , io = require('socket.io').listen(app) 
    , fs = require('fs') 

app.listen(8001); 

function handler (req, res) { 
    fs.readFile(__dirname + '/index.html', 
    function (err, data) { 
    if (err) { 
     res.writeHead(500); 
     return res.end('Error loading index.html'); 
    } 

    res.writeHead(200); 
    res.end(data); 
    }); 
} 

io.sockets.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
    console.log(data); 
    }); 
}); 

回答

1

要通过HTTPS发送不安全内容。请尝试以下:

的index.html

var socket = io.connect('https://'+window.location.host+':8001'); //added https... 

server.js:

var app = require('https').createServer(handler) 
    , io = require('socket.io').listen(app) 
    , fs = require('fs'); 

var options = { 
    key: fs.readFileSync('crts/ssl.key'), //the route to your certs. 
    cert: fs.readFileSync('crts/ssl.cert'), 
    ca: fs.readFileSync('crts/ssl.ca') 
}; 

https.createServer(options, app).listen(8001); //https server 

function handler (req, res) { 
    fs.readFile(__dirname + '/index.html', 
    function (err, data) { 
    if (err) { 
     res.writeHead(500); 
     return res.end('Error loading index.html'); 
    } 

    res.writeHead(200); 
    res.end(data); 
    }); 
} 

io.sockets.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
    console.log(data); 
    }); 
}); 
+1

感谢您的回答。但是你的代码不适合我。我得到“丢失PFX或证书+私钥”。 ssl文件在子目录中绝对可用。另外,你的答案是否意味着建议我不能在nginx上终止https并只向http转发nodejs? – FZ896

+0

@ 3boll请看看这个http://stackoverflow.com/questions/23103241/how-to-redirect-web-sockets-connection-through-nginx? –