2014-09-25 6 views
0

Так я использую автономного версии Socket.io (сервер) -> я не объявить любой «HTTP сервера» Это выглядит очень похоже на это:Socket.IO, путь SSL, Nginx, каталог

var io = require('socket.io')(); 
io.on('connection', function(socket){}); 
io.listen(3001); 

Проблема: мой сайт в производственной среде полностью HTTPS. Когда я попытался подключиться к нему (io.connect("https://www.mysite.com:3001")) У меня был ERR_SSL_PROTOCOL_ERROR (протестирован в браузере Chrome).

Когда я выключил сервер, я получил ERR_CONNECTION_REFUSED. Итак, я пришел к выводу, что Node.JS не может обрабатывать соединение HTTPS/SSL.

Моя среда разработки основана на HTTP, поэтому у меня нет проблем - она ​​работает как шарм.

Итак, я решил попробовать прокси-передачу HTTPS на HTTP-соединение, используя nginx.

AFAIK, здесь у меня есть только несколько вариантов для того, чтобы различать связи Node.js и основное подключение приложения:

а) субдомена (~ node.mysite.com)

б) Справочник (~ mysite.com/node)

Я выбрал последний вариант, потому что это было намного проще реализовать.

Поэтому я добавил следующее внутри главного «сервера» конфигурации (перед основным приложением):

location /node { 
    proxy_pass http://127.0.0.1:3001; 
    proxy_redirect off; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Forwarded-Proto $scheme; 
} 

А потом я попытался подключения: io.connect("https://www.mysite.com/node"), но независимо от того, что я получаю 404 (Не найдено). Я даже пробовал: io.connect("https://www.mysite.com", {path : /node/}) (w и без косых черт) и попробовал переименование путь до ресурс и многие другие.

Но безрезультатно.

Когда я посещаю эту страницу в браузере (и когда сервер запущен и работает), я вижу белую страницу.

Я делаю что-то ужасно неправильно? Можно ли это исправить? Спасибо всем заранее

ответ

0

Решено пойти с субдоменом. Потому что я хотел делегировать обработку соединения Nginx вместо того, чтобы делать это с самим Node.JS. :)

1

Я также использовал соединение Socket.io на SSL, как это .. он работает хорошо для меня ... Я использую скорых Engine

var options = { 
    key: fs.readFileSync('./key.pem', 'utf8'), 
    cert: fs.readFileSync('./server.crt', 'utf8') 
}; 

var app = require('./app'); 
var server = require('https').createServer(options, app), 
io = require('socket.io').listen(server); 
server.listen(port); 
io.sockets.on('connection', function (socket) { 
}); 

и на стороне клиента

<script src="/socket.io/socket.io.js"></script> 
<script> 
var socket = io.connect('https://localhost:2406'); 
// on connection to server, ask for user's name with an anonymous callback 
socket.on('connect', function(){}); 
</script> 
+0

Благодарим за ответ! Можно ли как-то избежать «создания http-сервера»? – Dmitri

+0

Даже если вы явно не создаете HTTP-сервер, сокет io-сервер будет создавать один под капотом.Однако я считаю, что вы можете передать переменную options здесь (с ключом и цепочкой сертификатов) в качестве второго аргумента в io.listen(). Стоит знать, что socket.io по-прежнему будет создавать HTTP-сервер за кулисами, чтобы вы могли заявить об этом сами, как показано здесь и в файлах socket.io. – aembke

+0

@aembke Ah. Имеет смысл! Я попробую! :) Спасибо – Dmitri