Sockets io con SSL, Apache, Ubuntu

Primero desplegamos nuestro servidor de Sockets.io Node con Node.

Escenario:

La app de node sale por el puerto 8101.
Partimos de que tenemos el SSL correctamente configurado con Let’s Encrypt.
PHP 5.6
Apache/2.4.29 (Ubuntu)

Lo que vamos a hacer es redirigir mediante Apache proxy el tráfico del puerto 443 (SSL) al puerto 8101 (Por donde sale nuestro server de Node).

Para ellos, desplegamos nuestra app de Node en nuestro servidor y la corremos (Enlace para correr nuestro servidor de Node en segundo plano en nuestro Linux).

Clonamos nuestra app node desde nuestro repositorio:

git clone https://ekiketa@ejemplo.org/app-sockets.git 

Nos dirigimos a nuestro directorio:

cd nombre-directorio/

Instalamos dependencias:

npm install

Arrancamos nuestra app con Forever (Tutorial en el link del párrafo anterior):

forever start app.js

Creamos el sitio en apache:

sudo nano /etc/apache2/sites-available/sockets-ssl.conf

Y escribimos en este (cambiando el puerto 8101 por el que nosotros saquemos nuestro servidor de Node/Sockets):



	ServerName sockets.ekiketa.es
	Redirect permanent / https://sockets.ekiketa.es




	ServerName sockets.ekiketa.es

	SSLEngine on
	SSLProtocol all -SSLv2
	SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM

	SSLCertificateFile	/etc/letsencrypt/live/ekiketa.es/fullchain.pem
	SSLCertificateKeyFile	/etc/letsencrypt/live/ekiketa.es/privkey.pem

        # ServerAdmin webmaster@localhost

	
		Require all granted
	

	ProxyRequests off
	ProxyVia on

	RewriteEngine On
	RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
	RewriteCond %{QUERY_STRING} transport=websocket    [NC]
	RewriteRule /(.*)           ws://localhost:8101/$1 [P,L]


	ProxyPass        /socket.io	http://localhost:8101/socket.io
	ProxyPassReverse /socket.io	http://localhost:8101/socket.io

	
		ProxyPass http://127.0.0.1:8101/
		ProxyPassReverse http://127.0.0.1:8101/
	


	ErrorLog /var/log/apache2/sockets-ssl-error.log
	CustomLog /var/log/apache2/sockets-ssl-access.log combined


Comprobamos que la sintaxis de nuestro sitio es correcta con:

apachectl configtest

Nos debería de responder: Syntax OK

Habilitamos el sitio:

sudo a2ensite sockets-ssl.conf

Nos cercionamos que tenemos los siguientes módulos de Apache habilitados:

ssl
headers
proxy
proxy_http
proxy_wstunnel

Podemos listarlos con:

ll /etc/apache2/mods-enabled/

O podemos habilitarlos:

sudo a2enmod ssl 
sudo a2enmod headers
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_wstunnel

En caso de que ya estuvieran habilitados, no pasaría nada. Apache nos avisaría que ya está «enabled» y a marchar.

Reiniciamos nuestro apache:

sudo systemctl restart apache2.service

Y a funcionar!

En caso de fallo, podemos pegarle un vistazo a Log, seguramente nos arroje algo de luz:

tail -f /var/log/apache2/sockets-ssl-error.log

NOTA:

El cliente Socket se conectaría de la siguiente manera:

let appSocket = {
    server  : {
        protocol        : 'http://',
        host            : 'sockets.cactusds.com',
        port            : 443
    }
}

const socket = io( appSocket.server.protocol + appSocket.server.host + ':' + appSocket.server.port );

No apuntaríamos al puerto por el que sale nuestra app de node (8101 en mi caso), ya que estamos redirigiendo el tráfico del 443 (ssl) al 8101 para nuestro subdominio de sockets.

También sería válido:

let appSocket = {
    server  : {
        protocol        : 'https://',
        host            : 'sockets.cactusds.com',
        port            : ''
    }
}

Saludossss 💃🏻


Tu opinión es importante para mi, ¿Te ha resultado útil este artículo?

¿Eres programador/a?

En Pulpo están buscando nuevos talentos, envíales un email a developers@pulpoapp.com.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*