使用SSL通过nginx代理websocket时出现混合内容错误

时间:2013-08-09 15:22:07

标签: node.js ssl nginx socket.io

我正在使用express来为node.js应用程序提供内容,并使用socket.io进行websocket通信。设置工作正常,但现在我也希望能够通过SSL访问websocket。我认为使用nginx(我们已经用于其他东西)作为代理是一个好主意,并配置如下:

upstream nodejs {
    server 127.0.0.1:8080;
}

server {
    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;

    server_name _;

    location / {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://nodejs;
        proxy_redirect off;
    }
}

node.js服务器设置如下:

var express = require('express'),
    app = express();
// some app configuration that I don't think matters
server = http.createServer(app).listen(8080);
var io = require('socket.io').listen(server);
io.configure(function() {
    io.set('match original protocol', true);
    io.set('log level', 0);
    io.set('store', redisStore); // creation of redisStore not shown
}

nginx和node.js都在Vagrant框内运行,该框将端口443(nginx侦听)转发到主机系统上的端口4443。

使用此设置,导航到http://localhost:4443(使用Firefox 23)可以访问Express提供的文件,但是当socket.io尝试连接到套接字时,会抛出以下错误:

Blocked loading mixed active content "http://localhost:4443/socket.io/1/?t=1376058430540"

这个结果很明显,因为它试图通过HTTP从HTTPS页面加载JS文件,Firefox不允许这样做。问题是为什么它首先这样做。

Socket.io尝试确定用于访问网页的协议,并在构造上述URL时使用相同的协议。在这种情况下,它认为它是通过HTTP访问的,这可能是代理的结果。但是,据我所知,在socket.io配置中将match original protocol设置为true应该可以在这种情况下提供帮助,但在我的情况下却不行。

我在这里找到了很多关于websocket代理的问题和答案,但没有一个能解决这个问题。所以我很快就会结束,并且真的很感激一些建议。

1 个答案:

答案 0 :(得分:0)

match original protocol更改为match origin protocol

io.configure(function() {
    //io.set('match original protocol', true);
    io.set('match origin protocol', true);
    ...
}