Servidor LAMP Básico
En realidad no es un servidor LAMP estrictamente hablando, ya que vamos a cambiar el Apache por uHTTPd, pero nos sirve para lo mismo.
LAMP =
Linux,
Apache,
MySQL,
PHP
LUMP =
Linux,
uHTTPd,
MySQL,
PHP
Como ejemplo, vamos a montar un servidor básico, con una aplicación de facturación WEB (Codeka).
Servidor de Facturación:
Alguien ha planteado por el foro, si un router de estas características, se puede utilizar como pequeño servidor de aplicaciones web, y entre ellas, si se puede utilizar para crear facturas/presupuestos. Esto es algo útil, por ejemplo, para acceder al servidor a través de un teléfono móvil, y crear el presupuesto, directamente delante del cliente.
Dado que al router se le pueden incorporar todos los elementos, para hacer de servidor de aplicaciones web, supuse, que podría poner de ejemplo esta configuración, en la que se usa un servidor web, con php y mysql, para hacer de guía a otras personas interesadas en los temas de aplicaciones web.
Pasos a seguir:
1.- Conseguir
extroot en el router. Los datos que necesitamos son muchos, y necesitamos espacio para instalar las aplicaciones
2.- Instalación y configuración de
PHP en el router.
3.- Instalación y configuración de
MySQL en el router.
4.- Instalación de un gestor de base de datos MySQL (
adminer), parecido a phpMyAdmin, con funcionalidad básica pero suficiente.
5.- Instalación de la aplicación de Facturación
Codeka.
Extroot:En el foro ya hay un tutorial para conseguir extroot con openwrt:
https://foro.seguridadwireless.net/openwrt/ejecutando-openwrt-desde-una-memoria-o-disco-usb-(extroot)/No obstante, repito unos pasos básicos aquí para no "marear" al lector. Si no funciona, mirar todos los pasos exhaustivos en el tutorial.
Lo primero es conseguir un pincho de memoria USB con unos cuantos GB y particionarlo.
Crearemos 3 particiones:
sda1 : 1GB (por ejemplo) en ext4 para extroot.
sda2 : resto del pincho (menos la swap) en ext4 o NTFS o lo que queramos, como almacén auxiliar.
sda3 : 256MB (por ejemplo) en swap.
Pinchamos el USB en el router y comprobamos que nos lo reconoce el sistema:
Ponemos
dmesg y miramos si las últimas líneas nos sale algo parecido a esto:
[ 1349.764000] usb 1-1.2: new high-speed USB device number 4 using ehci-platform
[ 1349.896000] usb-storage 1-1.2:1.0: USB Mass Storage device detected
[ 1349.904000] scsi1 : usb-storage 1-1.2:1.0
[ 1350.912000] scsi 1:0:0:0: Direct-Access Generic Flash Disk 8.07 PQ: 0 ANSI: 4
[ 1350.944000] sd 1:0:0:0: Attached scsi generic sg1 type 0
[ 1350.948000] sd 1:0:0:0: [sdb] 65536000 512-byte logical blocks: (33.5 GB/31.2 GiB)
[ 1350.964000] sd 1:0:0:0: [sdb] Write Protect is off
[ 1350.968000] sd 1:0:0:0: [sdb] Mode Sense: 23 00 00 00
[ 1350.972000] sd 1:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[ 1351.004000] sda: sda1 sda2 sda3
[ 1351.032000] sd 1:0:0:0: [sdb] Attached SCSI removable disk
Si es así, es que lo ha reconocido, y podemos tratar de configurar extroot.
Ahora creamos un script en
/etc/make_extroot.bat con el contenido siguiente:
umount /dev/sda1
mkdir /mnt/extroot
mount -t ext4 /dev/sda1 /mnt/extroot
mkdir /tmp/tmproot
mount --bind / /tmp/tmproot
tar -C /tmp/tmproot -cvf - . | tar -C /mnt/extroot -xvf -
sync
umount /mnt/extroot
umount /tmp/tmproot
rmdir /mnt/extroot
block detect > /etc/config/fstab
Lo hacemos ejecutable con
chmod +x /etc/make_extroot.bat
Y lo ejecutamos
/etc/make_extroot.bat
Ahora editamos
/etc/config/fstabconfig 'global'
option anon_swap '0'
option anon_mount '0'
option auto_swap '1'
option auto_mount '1'
option delay_root '5'
option check_fs '0'
config 'mount'
option target '/'
option uuid 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
option enabled '1'
En la sección de target '/', dejamos el uuid que correspondiera a sda1, y que nos habrá detectado
block detect. El resto lo borramos. Sólo nos interesa por ahora que nos monte extroot antes de proseguir con la configuración.
Ahora ponemos
reboot y esperamos a que el router se reinicie.
Si todo ha ido bien, ya tendremos el router reiniciado y extroot montado.
Para saberlo, ponemos
df y miramos si el espacio que nos devuelve rootfs es aproximadamente 1 millón de sectores (1GB)
root@OpenWrt:~# df
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 999320 66128 864380 7% /
/dev/root 5888 5888 0 100% /rom
tmpfs 30712 228 30484 1% /tmp
/dev/sda1 999320 66128 864380 7% /
tmpfs 512 0 512 0% /dev
Ahora podemos volver a configurar /etc/config/fstab para montar swap, por ejemplo.
block detect > /etc/config/fstab
Editamos
/etc/config/fstab; Borramos toda alusión a sda1 y sólo dejamos la swap y la partición sda2 a montar:
config 'global'
option anon_swap '0'
option anon_mount '0'
option auto_swap '1'
option auto_mount '1'
option delay_root '5'
option check_fs '0'
config 'swap'
option uuid 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
option enabled '1'
config 'mount'
option target '/mnt/sda2'
option uuid 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
option enabled '1'
Ahora, si reiniciamos, veremos que estas dos particiones también se montan en el sistema.
root@OpenWrt:~# df
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 999320 66128 864380 7% /
/dev/root 5888 5888 0 100% /rom
tmpfs 30712 228 30484 1% /tmp
/dev/sda1 999320 66128 864380 7% /
tmpfs 512 0 512 0% /dev
/dev/sda2 6218056 15700 5863452 0% /mnt/sda2
Instalación PHP:Instalar los paquetes:
php5
php5-cgi
php5-mod-gd
php5-mod-mbstring
php5-mod-session
zoneinfo-europe
Ajustamos unas cuantas variables en php.ini
Editar el fichero
/etc/php.iniEn la sección [
PHP] agregar la variable:
date.timezone = "Europe/Madrid"
Editar las variables bajo ";Language Options" y ponerlas con valor:
short_open_tag = On
Editar las variables bajo ";Resource Limits" y ponerlas con valor:
max_execution_time = 120
max_input_time = 120
Editar el fichero
/etc/config/uhttpdEn la sección 'main' agregar:
list interpreter ".php=/usr/bin/php-cgi"
option script_timeout '120'
Rearrancar el servidor http con
/etc/init.d/uhttpd restartInstalación MySQL:Instalamos :
mysql-server
libmysqlclient
Las bases de datos NO DEBEN ESTAR NUNCA EN LA FLASH, o nos cepillaremos la flash en menos que canta un gallo, amén de lo insoportablemente lento que puede llegar a ser.
Las bases de datos van a estar en un dispositivo montado en /mnt/sda2
Creamos los siguientes directorios [
importante]:
mkdir /mnt/sda2/databases/data/mysql/
mkdir /mnt/sda2/databases/data/tmp/
Ahora configuramos /etc/my.cnf
Este es mi contenido:
[client]
port = 3306
socket = /var/run/mysqld.sock
[mysqld]
user = root
socket = /var/run/mysqld.sock
port = 3306
basedir = /usr
############ Don't put this on the NAND #############
# Figure out where you are going to put the databases
# And run mysql_install_db --force
datadir = /mnt/sda2/databases/data/mysql/
######### This should also not go on the NAND #######
tmpdir = /mnt/sda2/databases/data/tmp/
skip-external-locking
bind-address = 0.0.0.0
# Fine Tuning
#key_buffer = 16M
#max_allowed_packet = 16M
#thread_stack = 192K
#thread_cache_size = 8
key_buffer = 8M
max_allowed_packet = 8M
thread_stack = 192K
thread_cache_size = 6
# Here you can see queries with especially long duration
#log_slow_queries = /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-queries-not-using-indexes
# The following can be used as easy to replay backup logs or for replication.
#server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log
#expire_logs_days = 10
#max_binlog_size = 100M
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name
[mysqldump]
quick
quote-names
max_allowed_packet = 8M
[mysql]
#no-auto-rehash # faster start of mysql but no tab completition
[isamchk]
key_buffer = 8M
Ahora tenemos que teclear:
mysql_install_db
mysqld &
mysqladmin -u root password 'mysqlrootpassword'
killall mysqld
/etc/init.d/mysqld start
mysqlrootpassword es la contraseña que queramos ponerle al usuario root para mysql. No nos debemos olvidar de esta contraseña.
Ahora en luci nos vamos a System -> Startup y habilitamos mysqld para que mysql se inicie al reiniciar al router.
Instalación Adminer:Visitamos la página
http://www.adminer.orgNos bajamos adminer-4.1.0.php (o versión posterior), lo renombramos a adminer.php y lo subimos al router en /www/adminer/adminer.php (mediante SCP, por ejemplo)
Instalamos el siguiente módulo:
php5-mod-mysql
Editamos
/etc/php.iniEn la sección
[Pdo_mysql] ponemos valor a la variable
pdo_mysql.default_socket = /var/run/mysqld.sock
(Nos servirá cuando vayamos a utilizar el driver pdo para mysql)
En la sección
[MySQL] ponemos valor a la variable
mysql.default_socket = /var/run/mysqld.sock
(El socket está definido en /etc/my.cnf -> [mysqld] -> socket=/var/run/mysqld.sock)
Accedemos a
http://192.168.1.1/adminer/adminer.phpRellenamos los datos de conexión.
Si no nos conecta con localhost, intentamos con 127.0.0.1
Hint: Para crear un acceso de root desde cualquier servidor (por ejemplo un phpMyAdmin remoto)
En
SQL Command teclead lo siguiente:
CREATE USER 'root'@'%' IDENTIFIED BY 'mysqlrootpassword';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
Instalación codeka:Visitamos la página oficial de codeka:
http://www.codeka.net, y nos descargamos la versión 1.0 de codeka. La descomprimimos y la subimos al router en /www/codeka/
Existe otra versión de codeka, modificada para poder generar también presupuestos, en:
http://blog.eduardopagan.com/blog/2013/05/18/codeka-facturacion-web-ahora-con-modulo-de-presupuestos/La segunda versión parece más completa, así que es la que recomiendo usar.
Creamos nueva base de datos:
Create New DatabaseLa nombramos codekadb con collation latin1_spanish_ci (SAVE)
Ahora pinchamos en
Privilegesy después en
Create userEn Server dejamos localhost.
Le ponemos de usuario/contraseña codekauser/codekauser
En el cuadro de la derecha de
Privileges?, nos aseguramos de que pone `codekadb`.* para darle privilegios sólo sobre la base de datos que acabamos de crear. Marcamos la casilla "
All privileges" y le damos a
SAVE.
Ahora en el menú de la izquierda nos aseguramos de que la base de datos seleccionada es "codekadb" y pinchamos en
Import.
File Upload "
Browse" y seleccionamos el fichero basededatos.sql de codeka para introducir la estructura de la base de datos.
Pinchamos en
Execute.
Nos saldrá algo parecido a esto:
84 queries executed OK. (1.802 s)
Ya tenemos la estructura de codeka en MySQL.
Ahora debemos configurar codeka con ese usuario y contraseña que acabamos de crear.
Editamos el fichero
/www/codeka/config.php (en el codeka original), o el fichero
/www/codeka/conectar.php (en el codeka modificado) y ponemos nuestros datos
$Usuario="codekauser";
$Password="codekauser";
$Servidor="localhost";
$BaseDeDatos="codekadb";
Ahora accedemos a codeka con
http://192.168.1.1/codeka/index.phpSi al navegar en codeka recibimos un error del tipo:
Parse error: syntax error, unexpected end of file in /www/codeka/proveedores/index.php on line 213
entonces necesitamos editar el fichero /etc/php.ini y cambiar la siguiente línea:
;short_open_tag = Off
por
short_open_tag = On
En general, el programa de facturación va bien, a excepción de las imágenes de los artículos, que no aparecen, pero es debido a un fallo en el módulo php-mod-gd, que viene compilado sin soporte de texto en las imágenes, y no produce las imágenes.