Express を使用してコンテンツを提供し、socket.io を websocket 通信に使用する node.js アプリケーションに取り組んでいます。セットアップは正常に機能していますが、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 はどちらも、ポート 443 (nginx がリッスンする) をホスト システムのポート 4443 に転送する Vagrant ボックス内で実行されます。
このセットアップでは、http://localhost:4443
(Firefox 23 を使用して) に移動すると、Express によって提供されるファイルにアクセスできますが、socket.io がソケットに接続しようとすると、次のエラーがスローされます。
Blocked loading mixed active content "http://localhost:4443/socket.io/1/?t=1376058430540"
Firefox では許可されていない HTTPS ページ内から HTTP 経由で JS ファイルをロードしようとするため、この結果は悲しいことに明らかです。問題は、そもそもなぜそうなるのかということです。
Socket.io は、Web ページへのアクセスに使用されるプロトコルを判別しようとし、上記の URL の構築に同じプロトコルを使用します。この場合、HTTP 経由でアクセスされていると見なされます。これは、プロキシされた結果である可能性があります。ただし、私が理解しているように、socket.io 構成でに設定match original protocol
するtrue
と、このような状況で役立つはずですが、私の場合はそうではありません。
ここで Websocket プロキシに関する多数の質問と回答を見つけましたが、この特定の問題を扱っているものはありません。ですから、私はほとんど機知に富んでおり、アドバイスをいただければ幸いです。