?>/script>'; } ?> [Tutorial] Servidor LAMP - HTTP, MySQL, PHP Widgets Magazine

Autor Tema: [Tutorial] Servidor LAMP - HTTP, MySQL, PHP  (Leído 9668 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2247
[Tutorial] Servidor LAMP - HTTP, MySQL, PHP
« en: 18-02-2015, 18:45 (Miércoles) »

    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:
Código: [Seleccionar]
[ 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:

Código: [Seleccionar]
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
Código: [Seleccionar]
chmod +x /etc/make_extroot.bat
Y lo ejecutamos
Código: [Seleccionar]
/etc/make_extroot.bat
Ahora editamos /etc/config/fstab

Código: [Seleccionar]
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 '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)
Código: [Seleccionar]
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.
Código: [Seleccionar]
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:
Código: [Seleccionar]
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.

Código: [Seleccionar]
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:
Código: [Seleccionar]
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.ini
En la sección [PHP] agregar la variable:
Código: [Seleccionar]
date.timezone = "Europe/Madrid"

Editar las variables bajo ";Language Options" y ponerlas con valor:
Código: [Seleccionar]
short_open_tag = On

Editar las variables bajo ";Resource Limits" y ponerlas con valor:
Código: [Seleccionar]
max_execution_time = 120
max_input_time = 120

Editar el fichero /etc/config/uhttpd
En la sección 'main' agregar:
Código: [Seleccionar]
     list interpreter ".php=/usr/bin/php-cgi"
     option script_timeout '120'

Rearrancar el servidor http con /etc/init.d/uhttpd restart


Instalación MySQL:

Instalamos :
Código: [Seleccionar]
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]:
Código: [Seleccionar]
mkdir /mnt/sda2/databases/data/mysql/
mkdir /mnt/sda2/databases/data/tmp/

Ahora configuramos /etc/my.cnf
Este es mi contenido:
Código: [Seleccionar]
[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:
Código: [Seleccionar]
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.org

Nos 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:
Código: [Seleccionar]
php5-mod-mysql

Editamos /etc/php.ini

En la sección [Pdo_mysql] ponemos valor a la variable
Código: [Seleccionar]
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
Código: [Seleccionar]
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.php


Rellenamos 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:
Código: [Seleccionar]
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 Database
La nombramos codekadb con collation latin1_spanish_ci (SAVE)


Ahora pinchamos en Privileges


y después en Create user
En 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:
Código: [Seleccionar]
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

Código: [Seleccionar]
$Usuario="codekauser";
$Password="codekauser";
$Servidor="localhost";
$BaseDeDatos="codekadb";

Ahora accedemos a codeka con http://192.168.1.1/codeka/index.php


Si al navegar en codeka recibimos un error del tipo: 
Código: [Seleccionar]
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:
Código: [Seleccionar]
;short_open_tag = Offpor
Código: [Seleccionar]
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.



Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2247
Re: [Tutorial] Servidor LAMP - HTTP, MySQL, PHP
« Respuesta #1 en: 18-02-2015, 19:02 (Miércoles) »
Sobre la anterior instalación de servidor, vamos a incorporar al router una aplicación de CRM, más como ejercicio, que como utilidad. Necesitaremos un router de al menos 64MB de RAM, y un procesador decente. La instalación en un HG556a es bastante lenta y pesada. Cada página tarda una media de 10-12 segundos en generarse, ya que la aplicación es un peso-pesado, pero dejo esto aquí, a modo de ejercicio, para que se vea qué es capaz de hacer un router con openwrt.


Instalación SuiteCRM

Bajamos suiteCRM de https://suitecrm.com/download y lo descomprimimos en un directorio del PC.
Editamos el fichero /jssource/minifu_utils.php
Buscamos la línea
Código: [Seleccionar]
       @ini_set('max_execution_time', 300);y aumentamos el tiempo máximo de ejecución:
Código: [Seleccionar]
       @ini_set('max_execution_time', 1300);
Ahora subimos toda la estructura al directorio del router /www/suitecrm/ mediante SCP.

Instalamos los siguientes módulos:
Código: [Seleccionar]
zoneinfo-core
php5-mod-ctype
php5-mod-json
php5-mod-xml
php5-mod-zip

Editar el fichero /etc/php.ini y comprobar si tenemos la siguiente opción en la sección [PHP]:
Código: [Seleccionar]
short_open_tag = On
Configuramos el límite de memoria para PHP de 32MB (buscar la línea y editarla):
Código: [Seleccionar]
memory_limit = 32M
Editar el fichero /etc/config/uhttpd
Agregar las siguientes líneas a la sección:
Código: [Seleccionar]
config uhttpd 'main'
 
    [...]
 
     list index_page 'index.html'
     list index_page 'index.htm'
     list index_page 'default.html'
     list index_page 'default.htm'
     list index_page 'index.php'

Rearrancar el servidor http con /etc/init.d/uhttpd restart

Ahora, sobre la unidad sda2 que tenemos montada, creamos un nuevo directorio en el que vamos a albergar los ficheros temporales y logs de la aplicación, que más adelante configuraremos en la instalación:
Código: [Seleccionar]
mkdir /mnt/sda2/suiteCRM
Abrimos un navegador y ponemos http://192.168.1.1/suitecrm/

Nos aparecerá la página de inicio de suiteCRM.
Seleccionamos el idioma Español y esperamos 4 - 6 segundos a que el idioma se cambie. El router va un poquito lento, pero funciona.


Tardará alrededor de 10 minutos en generarnos la página de configuración e instalación. Pasado ese tiempo accederemos a la instalación propiamente dicha. (La tardanza de esta instalación es la causa de que hayamos tenido que editar el fichero /jssource/minifu_utils.php anterior, aumentando el tiempo por defecto, para la ejecución de scripts php)



Seleccionamos la instalación personalizada y vamos pasando pantallas.



Definimos los datos de acceso al servidor MySQL. En la pantalla de usuarios, proveemos un usuario nuevo para acceder a la base de datos, ya que no queremos brechas de seguridad innecesarias. Creamos un usuario "suitecrm" y password "suitecrm".


En la pantalla de admin, ponemos una contraseña al administrador de suiteCRM; la que queramos.


En la siguiente pantalla se nos presenta la configuración de ficheros temporales y logs de la aplicación. Debemos escoger la personalización de datos y configurar:

     Utilizar un Directorio Personalizado para las Sesiones de SuiteCRM: /mnt/sda2/suiteCRM

     Utilizar un Directorio Personalizado para Logs: /mnt/sda2/suiteCRM


Terminamos de instalar en el siguiente paso.


Una vez se haya terminado de instalar la suite, accedemos a http://192.168.1.1/suitecrm/ y accedemos con el usuario admin que hemos creado.


Terminamos de configurar los datos y ya podemos usar la aplicación.



Teniendo en cuenta lo limitado de los routers y la velocidad de proceso de éstos, no podremos precisamente volar por la aplicación. Cada página generada tarda una media de 10 segundos en un HG556a. Si lo probamos en otro tipo de router con más capacidad de proceso, seguramente conseguiremos que vaya más fluído. De todas formas, esto es sólo un ejercicio de prácticas para ver la posibilidades que ofrece un router con openwrt.

« Última modificación: 18-02-2015, 19:34 (Miércoles) por Tki2000 »

Desconectado jar229

  • Moderador
  • *
  • Mensajes: 4607
Re: [Tutorial] Servidor LAMP - HTTP, MySQL, PHP
« Respuesta #2 en: 18-02-2015, 19:36 (Miércoles) »
Impresionante tutorial  >:( >:(

Codeka no lo conocía y tiene una pinta estupenda  ;D

Te encargas tú de ponerle 'chincheta' y añadirlo al índice ?

Y que luego haya quien pregunte para qué sirve instalar OpenWrt en un router ...  ;D

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2247
Re: [Tutorial] Servidor LAMP - HTTP, MySQL, PHP
« Respuesta #3 en: 18-02-2015, 19:46 (Miércoles) »
Impresionante tutorial  >:( >:(

Codeka no lo conocía y tiene una pinta estupenda  ;D

Te encargas tú de ponerle 'chincheta' y añadirlo al índice ?

Y que luego haya quien pregunte para qué sirve instalar OpenWrt en un router ...  ;D

Me has pillado en ello.
¡Hecho! Lo dejo con chinchetoide unos días...

CCCP

  • Visitante
Re: [Tutorial] Servidor LAMP - HTTP, MySQL, PHP
« Respuesta #4 en: 20-02-2015, 14:26 (Viernes) »
Gracias Tki2000

Gran

  • Visitante
Re: [Tutorial] Servidor LAMP - HTTP, MySQL, PHP
« Respuesta #5 en: 23-02-2015, 11:30 (Lunes) »
Gracias Tiki!
Esto es muy útil.

skywalky

  • Visitante
Re: [Tutorial] Servidor LAMP - HTTP, MySQL, PHP
« Respuesta #6 en: 12-03-2015, 19:22 (Jueves) »
Gracias, hace tiempo que buscaba algo parecido.