2013-08-09 3 views
0

Я работаю над приложением node.js, используя экспресс для обслуживания контента и socket.io для связи через веб-связь. Настройка работает нормально, но теперь я хочу иметь доступ к websocket через SSL. Я думал, что с помощью Nginx (которую мы уже использовали для других вещей) в качестве прокси-была хорошая идея, и настроил его так:Ошибка смешанного содержимого при проксировании websocket через nginx с SSL

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) дает мне доступ к файлам, обслуживаемых экспресс, но когда socket.io пытается подключиться к сокету, он выдает следующее сообщение об ошибке:

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

Этот результат, к сожалению, очевидный, поскольку он пытается загрузить JS-файл через HTTP с HTTPS-страницы, которую Firefox не разрешает. Вопрос в том, почему он это делает в первую очередь.

Socket.io пытается определить, какой протокол используется для доступа к веб-странице, и использует тот же протокол при построении вышеуказанного URL-адреса. В этом случае он считает, что к нему обращаются через HTTP, что может быть результатом проксирования. Однако, как я понимаю, установка match original protocol на true в конфигурации socket.io должна помочь в подобных ситуациях, но это не в моем случае.

Здесь я нашел многочисленные вопросы и ответы о прокси-сервере через websocket, но никто не имеет отношения к этой конкретной проблеме. Так что я в значительной степени нахожусь в конце, и мне очень понравился бы совет.

+0

ли возможность пропустить прокси и установить как HTTPS и HTTP слушателей в экспресс, как я описал в [этот ответ] (http://stackoverflow.com/ а/17709985/1380669)? – Plato

+0

Я попытался сделать это неудачно один раз сегодня, но я посмотрю ваш ответ и повторю попытку после выходных. –

+0

Обратите внимание, что вам нужно будет создать аргумент 'options' с вашими учетными данными SSL для перехода к слушателю HTTPS. [Пример здесь] (http://stackoverflow.com/questions/18129819/https-url-with-port-number-not-working-on-ios/18130058#18130058) – Plato

ответ

0

Изменение match original protocol в match origin protocol:

io.configure(function() { 
    //io.set('match original protocol', true); 
    io.set('match origin protocol', true); 
    ... 
} 
Смежные вопросы