1

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 プロキシに関する多数の質問と回答を見つけましたが、この特定の問題を扱っているものはありません。ですから、私はほとんど機知に富んでおり、アドバイスをいただければ幸いです。

4

1 に答える 1

0

match original protocolに変更match origin protocol:

io.configure(function() {
    //io.set('match original protocol', true);
    io.set('match origin protocol', true);
    ...
}
于 2013-08-12T14:07:58.777 に答える