Я работаю над приложением 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, но никто не имеет отношения к этой конкретной проблеме. Так что я в значительной степени нахожусь в конце, и мне очень понравился бы совет.
ли возможность пропустить прокси и установить как HTTPS и HTTP слушателей в экспресс, как я описал в [этот ответ] (http://stackoverflow.com/ а/17709985/1380669)? – Plato
Я попытался сделать это неудачно один раз сегодня, но я посмотрю ваш ответ и повторю попытку после выходных. –
Обратите внимание, что вам нужно будет создать аргумент 'options' с вашими учетными данными SSL для перехода к слушателю HTTPS. [Пример здесь] (http://stackoverflow.com/questions/18129819/https-url-with-port-number-not-working-on-ios/18130058#18130058) – Plato