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.ioProxyPass 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 💃🏻