我正在使用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代理的问题和答案,但没有一个能解决这个问题。所以我很快就会结束,并且真的很感激一些建议。
答案 0 :(得分:0)
将match original protocol
更改为match origin protocol
:
io.configure(function() {
//io.set('match original protocol', true);
io.set('match origin protocol', true);
...
}