Mosquito con WS sobre apache2
Instalar Mosquitto con Websockets
Primero debemos instalar mosquitto con compatibilidad para websockets, en esta entrada esta enfocada para Ubuntu, para puedes consultar esta entrada para opensuse.
Instalando dependencias.
$ sudo apt-get update
$ sudo apt-get install build-essential python quilt devscripts python-setuptools libssl-dev cmake libc-ares-dev uuid-dev
Instalando libwebsockets
$ wget https://github.com/warmcat/libwebsockets/archive/v1.3-chrome37-firefox30.tar.gz
$ tar zxvf v1.3-chrome37-firefox30.tar.gz
$ cd libwebsockets/
$ mkdir build
$ cd build/
$ sudo cmake .. -DOPENSSL_ROOT_DIR=/usr/bin/openssl
$ sudo make
$ sudo make install
Descarga el código de mosquitto.
$ wget http://mosquitto.org/files/source/mosquitto-1.4.2.tar.gz
$ tar zxvf mosquitto-1.4.2.tar.gz
$ cd mosquitto-1.4.2
Edita el archivo config.mk cambiando la siguiente linea:
WITH_WEBSOCKETS:=no
A
WITH_WEBSOCKETS:=yes
$ sudo make
$ sudo make install
$ sudo cp mosquitto.conf /etc/mosquitto
Configuración
Crea el siguiente archivo de configuración para mosquitto , en donde especificaremos los puertos a usar y el protocolo.
$ sudo vim /etc/mosquitto/mosquitto.conf
listener 1883 localhost
Debemos crear un usuario para mosquitto con la siguiente linea.
$ sudo useradd -r -m -d /var/lib/mosquitto -s /usr/sbin/nologin -g nogroup mosquitto
Para iniciar mosquitto usamos el siguiente comando.
$ mosquitto -c /etc/mosquitto/mosquitto.conf
En algunas ocaciones puede dar el siguiente error:
mosquitto: error while loading shared libraries: libwebsockets.so.6: cannot open shared object file: No such file or directory
Se debe que a que la instalación de libwebsockets se encuentra en /usr/local/lib y mosquitto lo busca en /usr/lib o /usr/lib64 para x64 Se soluciona creando un link simbólico
$ sudo ln -s /usr/local/lib/libwebsockets.so.6 /usr/lib64/libwebsockets.so.6
Configurando apache.
Descargamos el modulo de apache para trabajar con websockets.
$ git clone git://github.com/disconnect/apache-websocket.git
Este modulo lo he probado en CentOS Ubunutu 14.04 y OpenSuse y trabaja perfectamente, primero instalamos las dependencias para compilar el código.
$ sudo apt-get install scons apache2-dev
$ cd apache-websockets
Editamos el archivo SConstruct para que apunte a nuestras librerías de apr /usr/include/apr-1.0 este puede variar según nuestra distribución.
Construimos con:
$ scons
e instalamos con:
$ scons install
Ahora instalamos el modulo para la conexión con mosquitto, clonando el siguiente repositorio.
$ git clone https://github.com/willem4ever/mod_websocket_mosquitto.git
$ cd mod_websocket_mosquitto.
Igual editamos la referencia a las librerias en el archivo SConstruct dependiendo de nuestra distribución pueden estar en otros directorios.
Compilamos e instalamos:
$ scons
$ scons install
Creamos los archivos de configuración de apache.
$ sudo vi /etc/apache2/mods-available/websocket.load
LoadModule websocket_module /usr/lib/apache2/modules/mod_websocket.so
LoadModule websocket_draft76_module /usr/lib/apache2/modules/mod_websocket_draft76.so
$ sudo vi /etc/apache2/mods-available/websocket.conf
<IfModule mod_websocket.c>
Loadmodule mod_websocket_mosquitto /usr/lib/apache2/modules/mod_websocket_mosquitto.so
<Location /mqtt>
MosBroker localhost
MosPort 1883
SetHandler websocket-handler
WebSocketHandler /usr/lib/apache2/modules/mod_websocket_mosquitto.so mosquitto_init
</Location>
</IfModule>
En algunos casos es necesario corregir los permisos.
$ ll /usr/lib/apache2/modules
....
-rw-r--r-- 1 root root 14344 2012-02-14 20:59 mod_usertrack.so
-rw-r--r-- 1 root root 10240 2012-02-14 20:59 mod_version.so
-rw-r--r-- 1 root root 10248 2012-02-14 20:59 mod_vhost_alias.so
-rwxr-xr-x 1 root root 19109 2012-10-28 20:09 mod_websocket_draft76.so
-rwxr-xr-x 1 root root 13599 2012-10-29 16:19 mod_websocket_mosquitto.so
-rwxr-xr-x 1 root root 27675 2012-10-28 20:09 mod_websocket.so
....
$ sudo chmod 644 /usr/lib/apache2/modules/mod_websocket*
Para finalizar activamos el modulo en apache y reiniciamos el servicio
$ sudo a2enmod websocket
$ sudo /etc/init.d/apache2 restart
Si estas usando el mod_rewrite para omitir index.php sobre el directorio principal puedes usar una configuracion similar a esta para omitir el Location donde le indicamos que usara mosquitto.
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^(mqtt)($|/) - [L]
#Send request via index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>
Fuente:
cimen0etyo Jessica Herrera Here
ResponderBorrarreckmojohost