@Hellek
Люблю говорить и слышать суть

Как настроить: php7-сайт с https + nginx-вебсервер + nodejs (socket.io)?

Приветствую коллеги, недавно перевел сайт на https и соединение с socket.io перестало работать: WebSocket connection to 'wss://site.ru:9999/socket.io/?EIO=3&transport=websocket' failed: Error in connection establishment: net::ERR_CONNECTION_CLOSED

Есть у кого готовый конфиг? Проблема в том, что пути к SSL сертификатам и ключам на рабочей и разработческой машине хранятся в разных местах и вручную их подключать в файле ноды не варик, к тому же раскидываться сертификатами по разным машинам и отдавать их разрабам всем тоже не правильно. В nginx ключи уже подключены и php'шка благополучно их использует, а вот что прописать в конфиге, чтобы они и для websocket применялись не ясно. Те мануалы которые я нагуглил по настройкам подходят, если у нас сайт полностью на ноде, а в нашем случае все сайты полностью на php и вебсокеты используются только чтобы иногда получать срочные оповещения от сервера.

На данный момент конфиг примерно такой:
server {
	listen 80;
	server_name is.site.ru;
	return 302 https://is.site.ru$request_uri;
}

server {
	root /var/www/folder/is;
	server_name is.site.ru;
	index index.php;

	listen 443;
	ssl on;
	ssl_certificate /etc/letsencrypt/live/site.ru/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/keys/key.pem;
	ssl_dhparam /opt/letsencrypt/dh.pem;
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
	ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:ECDH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
	ssl_prefer_server_ciphers on;
	ssl_session_cache shared:SSL:5m;
	ssl_session_timeout 10m;
	ssl_stapling on;
	resolver 8.8.8.8;
	add_header Strict-Transport-Security 'max-age=23328000';

	location / {
		try_files $uri $uri/ /index.php?q=$uri&$args;
	}

	location ~ .php$ {
		if (!-e $request_filename) { rewrite / /index.php last; }
		fastcgi_index	index.php;
		fastcgi_pass	127.0.0.1:9006;
		include			fastcgi_params;
		fastcgi_param	SCRIPT_FILENAME    $document_root$fastcgi_script_name;
		fastcgi_param	SCRIPT_NAME        $fastcgi_script_name;
		fastcgi_param  HTTPS on; # Для php-fpm
	}
}


Сокет.ио сервер:
// Подключаем либы для создания веб-сервера
var app = require('express')(),
	 http = require('http').Server(app),
	 io = require('socket.io')(http),
	 cookie = require('cookie'),
	 port = 9999,
	 fs = require('fs'),
	 path = require("path"),
	 parser = require('groan');

// Что делаем при подключении
io.on('connection', function(socket){
	// Работем с socket
});

// Слушаем запросы приходящие на порт
http.listen(port, function(){
	console.log('listening on *:' + port);
});

Сокет.ио клиент:
(function($) {
$(document).ready(function(){
	// Открываем соединение, при открытии страницы
	var socket = io.connect(
		location.origin + ':9999',
		{
			transports: ['websocket', 'flashsocket', 'xhr-polling'],
			reconnection: false
		}
	);

	// Получаем уведомление от сервера
	socket.on('server notice', function(json) {
		console.log(json);
	});
});
})(jQuery);
  • Вопрос задан
  • 800 просмотров
Решения вопроса 1
alexfilus
@alexfilus
Senior backend developer
Nodejs + Socket.io + https?
для https в ноде нужен отдельный listen.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы