Socket.IO с HTTPS более apache присутствует? - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть доменное имя.

У меня Raspberry Pi в качестве веб-сервера.

Я отредактировал запись домена A, чтобы указать на IP моего сервера.

Через letsencrypt я получил сертификат, и теперь веб-сайт работает по протоколу https (поддерживаю http для целей отладки)

Я работаю над приложением для обмена сообщениями, которое использует socket.io, но использует apache + php для низкоуровневых вещей

Так что в основном apache слушает 80 и 443 и nodejs слушает 3000

Очевидно, что если я захожу на мой сайт через http - все работает нормально, и сервер, и клиент зарегистрируйте соединения.

Если я захожу на него через https - Chrome выдает net :: ERR_CONNECTION_CLOSED ошибка (в консоли при попытке подключения к socket.io через порт 3000. Сам сайт загружается нормально).

Клиент:

var socket = new io(window.location.host+":3000", { secure: true });

socket.on("connect", function() {
   console.log('success')
});

Сервер:

const io = require("socket.io");
const server = io.listen(3000);

console.log("Server started");

server.on("connection", function (socket) {
    console.log("+USER");
    socket.emit("hello", "Connected");
});

Я действительно не хочу использовать express или что-либо еще в этом отношении для сделайте все как можно меньше, тем более что у меня уже есть мы б-сервер работает.

Как правильно настроить его, чтобы пользователи могли подключаться к моему серверу socket.io через порт 3000 при посещении сайта по протоколу https?

Обновление : Из каких кажется, я думаю, что это проблема типа CORS. Пользователь, посещающий веб-сайт через https, пытается подключиться к незащищенному порту (в данном случае 3000), даже если это тот же домен? Я думаю, что это будет нет-нет для многих, если не для всех браузеров. На ум приходит решение просто перенести все это с apache на nodejs серверный модуль и назначить вручную порт 3000 как безопасный через модуль https, но я понятия не имею, как это сделать, и я бы действительно хочу сохранить мой apache в качестве веб-сервера, потому что, по крайней мере, я с ним знаком больше, чем что-либо еще.

1 Ответ

0 голосов
/ 10 февраля 2020

Что ж, я закончил тем, что создал отдельный https-сервер, который, как я предполагаю, socket.io слушает (?) Хорошо, у меня все еще мой apache в качестве основного сервера. Я частично ответил на мой вопрос, используя это сообщение

https://serverfault.com/questions/745248/socket-io-combined-with-apache-ssl-server

Сервер

const fs = require("fs");
const https = require("https");

var options = {
    key: fs.readFileSync('/etc/letsencrypt/live/example.com/privkey.pem'),
    cert: fs.readFileSync('/etc/letsencrypt/live/example.com/fullchain.pem')
};

var server = https.createServer(options);
server.listen(3000);

var io = require('socket.io').listen(server);

console.log("Server started");

io.on("connection", function (socket) {
    console.log("+USER");
    socket.emit("hello", "Connected");

    socket.on("disconnect", () => {
        console.log("-USER");
    })
});

Клиент

var s = new io("https://example.com:3000", { secure: true } );

Надеюсь, что это правильный способ сделать это

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