Instalar Apache, MySQL y PHP en Linux (Ubuntu 14.04)

Probablemente este conjunto (Linux + Apache + MySQL + PHP), o también conocido como LAMP, sea uno de los más softwares libres que más se utilizan en servidores web. Hoy os voy a contar cómo instalar Apache, MySQL y PHP en una distribución Linux (Ubuntu 14.04).

1. Actualizar la base de datos de paquetes de apt-get

Sin entrar en mucho detalle, apt-get, es una herramienta para gestionar el software de varias distribuciones Linux. En el caso de Ubuntu, es la herramienta por defecto. Lo primero que debemos de hacer es actualizar la base de datos con las últimas versiones de los paquetes disponibles para nuestra distribución. Para ello utilizaremos el siguiente comando:

sudo apt-get update

2. Instalar Apache

Apache es un conocido servidor web de código abierto, y probablemente el más usado del mundo.

sudo apt-get install apache2

Una vez instalado, podremos probar que funciona a través de un navegador web usando las URLs http://hostname_o_dominio_servidor ó http://ip_de_servidor, según prefieras. En mi caso http://tesla:

Si has podido ver esta página, es que la instalación ha ido correctamente. Es la página web por defecto de Apache, con información básica del servidor.

3. Instalar MySQL

MySQL es un sistema de gestión de Base de Datos ampliamente utilizado en conjunto con Apache y PHP. En este caso también instalaremos varios paquetes para la integración de MySQL con Apache y PHP.

sudo apt-get install mysql-server libapache2-mod-auth-mysql php5-mysql

Durante la instalación, nos pedirá que asignemos una contraseña para el usuario root de MySQL.

Una vez instalado, es recomendable activar las tablas del sistema MySQL:

sudo mysql_install_db

Otro paso recomendable es ejecutar el programa mysql_secure_installation para mejorar la seguridad del servidor MySQL. Con esto:

  • Puedes definir una password para los usuarios root.
  • Puedes borrar los usuarios root para que son accesibles desde fuera del host local.
  • Puedes borrar cuentas de usuarios anónimos.
  • Puedes borrar la base de datos de test.

Ejecuta el siguiente comando y sigue sus instrucciones:

sudo mysql_secure_installation

Ahora ya podemos instalar PHP.

4. Instalar PHP

PHP es un lenguaje de código abierto de web scripting que es usado masivamente para construir páginas webs dinámicas.

sudo apt-get install php5 libapache2-mod-php5 php5-mcrypt

Puede ser interesante añadir index.php al principio de los ficheros que puede indexar Apache. Para ello hay que editar el fichero dir.conf e incluir el index.php al principio.

sudo vi /etc/apache2/mods-enabled/dir.conf

De tal modo que quede así:

<IfModule mod_dir.c>
        DirectoryIndex index.php index.html index.cgi index.pl index.php index.xhtml index.htm
</IfModule>

Podría interesarte instalar más podulos de PHP. Aquí verías un listado:

yvoictra@tesla:~$ apt-cache search php5-
php5-common - Common files for packages built from the php5 source
php5-curl - CURL module for php5
php5-dev - Files for PHP5 module development
php5-json - JSON module for php5
php5-readline - Readline module for php5
php5-cgi - Lenguaje de guiones embebidos en HTML para servidores (binario CGI)
php5-cli - intérprete de órdenes para el lenguaje de guión php5
php5-dbg - Símbolos de depuración para PHP5
php5-gd - Módulo GD para php5
php5-gmp - Módulo GMP para php5
php5-ldap - Módulo LDAP para php5
php5-mysql - Módulo MySQL para php5
php5-odbc - Módulo ODBC para php5
php5-pgsql - Módulo PostgreSQL para php5
php5-pspell - Módulo pspell para php5
php5-recode - Módulo recode para php5
...

Para instalar cualquiera de los paquetes, usa la el comando apt-get:

sudo apt-get install nombre_del_modulo

5. Ver resultados

Ya tenemos los paquetes de LAMP instalados. Ahora podemos ver que PHP esté correctamente instalado creando la web de test. Creamos el siguiente fichero:

sudo vi /var/www/html/info.php

Y añadimos esto:

<?php
phpinfo();
?>

Ahora visitamos la web en las siguientes URLs http://hostname_o_dominio_servidor/info.php ó http://ip_de_servidor/info.php, según prefieras. En mi caso http://tesla/info.php.

Aparecerá la web de información de PHP:

php_info

¡Y se acabó! Ya está instalado Apache + MySQL + PHP en nuestro servidor Ubuntu.

Formato vertical de salida en MySQL

A veces, especialmente en tablas con mucho campos, la salida horizontal (por defecto) puede ocupar demasiado espacio y ser difícil de seguir. Esto se puede agravar más sin pretendemos pegar los resultados en un e-mail, por ejemplo.

Utilizando \G en lugar de ; para terminar la query, conseguiremos que la salida se muestre con formato vertical.

Ejemplo de Formato horizontal:

mysql> SELECT * FROM table;

MySQL_horizontal

Ejemplo de Formato vertical:

mysql> SELECT * FROM table \G

MySQL_vertical

También se puede iniciar el cliente de MySQL con la opción –vertical y que afectaría a todas las consultas.

Resetear password de root en MySQL

Esto a mí me ha venido bien en algún momento, y es que no siempre recordamos o sabemos la password de root la BBDD.

En MySQL se puede resetear así:

1. Reiniciar la base de datos con la opción –skip-grant-tables:

# /etc/init.d/mysqld restart --skip-grant-tables

2. Conectarte a la BBDD con usuario root:

# mysql -u root

3. Establecer la nueva password:

mysql> UPDATE mysql.user SET Password=PASSWORD('newpwd') WHERE User='root';
mysql> FLUSH PRIVILEGES;

4. Volver a arrancar la BBDD sin –skip-grant-tables:

# /etc/init.d/mysqld restart

Table is marked as crashed and should be repaired

Hace poco me encontré un error en una aplicación que tengo con Perl en la que realiza SELECTs, DELETEs y UPDATEs en una BBDD MySQL.

El error lo provocaba MySQL e indicaba lo siguiente:

Error    : Table './base_de_datos/nombre_de_tabla' is marked as crashed and should be repaired

Esto se puede solucionar de varias maneras. En esta entrada describiremos cómo solucionarlo utilizando las herramientas que proporciona MySQL.

Utilizando el comando «mysqlcheck» chequea y repara si está corrupta:

[root@host01]# ./mysql/bin/mysqlcheck --auto-repair base_de_datos nombre_de_tabla -u usuario -p
Enter password: 
base_de_datos.nombre_de_tabla
warning  : Table is marked as crashed
warning  : 4 clients are using or haven't closed the table properly
error    : Record-count is not ok; is 112323   Should be: 112803
warning  : Found 33620 deleted space.   Should be 0
warning  : Found 480 deleted blocks       Should be: 0
error    : Corrupt

Es conveniente hacer backup de la BBDD antes de hacer cualquier cambio.

Cómo resetear un autoincremental en MySQL

En las BBDD es típico utilizar la función de autoincrementar las claves primarias de las tablas. De este modo se consigue que se vaya incrementando el campo en cada nueva tupla.

Si necesitamos borrar la tabla, y que además este valor se resetee, para volver a comenzar con 1, la opción más sencilla es ejecutar la siguiente sentencia:

TRUNCATE nombre_tabla;

Con esto conseguimos vaciar la tabla, como si hubieramos hecho de nuevo el CREATE TABLE.

Si lo que necesitamos es hacer que el valor autoincremental tome un valor determinado es posible utilizar la siguiente sentencia, que establece un valor para la siguiente tupla.

ALTER TABLE nombre_tabla AUTO_INCREMENT=1

Con esto conseguimos resetear el campo autoincrementable. Ojo, si existen registros con el valor que hemos asignado, continuará por el último…

Fuente.

Setencias MySQL directamente desde la terminal

Hoy he descubierto un modo interesante, y sobretodo ágil para ejecutar sentencias de MySQL directamente en la terminal de comandos del SSOO, sin tener que estar dentro del propio sistemas de gestión de BBDD.

La sentencia en concreto sería:

[root@host01:~]# mysql -umiusuario -pmipassword -e 'select * from mi_tabla where fecha > "2009-09-17 17:00:00";' mi_base_de_datos

donde:

  • -u: indica el usuario de acceso a la BBDD.
  • -p: indica la password de acceso a la BBDD.

El único problema que le veo a esto, es que en el histórico se quedan almacenados tanto el usuario como la password de la BBDD, lo cuál puede ser un agujero de seguridad…

Para evitar que en el histórico se quede almacenada la password de la BBDD, es posible no indicar la password en el propio comando y que el propio MySQL la pida posteriormente de esta forma:

[root@host01:~]# mysql -umiusuario -p -e 'select * from mi_tabla where fecha > "2009-09-17 17:00:00";' mi_base_de_datos

El problema es que este comando no nos valdrá para usarlo en scripts.

Administrar usuarios de MySQL

Para administrar los usuarios de una base de datos de mysql, existen los siguientes comandos:

mysql> use mysql;
Database Changed
mysql> set password for 'elforum'@'localhost' = password('98m4@9er');
Query OK, 0 rows affected (0.00 sec)
mysql> set password for 'mysysad'@'localhost' = password('950v4.Kr');
Query OK, 0 rows affected (0.00 sec)

Y para mostrar los usuarios, y las passwords asociadas…

mysql> SELECT user, password FROM user;
+---------------+-------------------------------------------+
| user          | password                                  |
+---------------+-------------------------------------------+
...
| elforum |   *EAE7DE143B1B9598745AD571885A98E723ABE9056 |
| mysysad | *Ebe7D596878627EDD581EADEFSA98E723ABE9C58 |
...

Crear BBDD en MySQL, y dar permisos a un usuario

Para crear una base de datos en mysql se utiliza la siguiente sentencia:

mysql> CREATE DATABASE NombreBaseDeDatos;

Para dar permisos a un usuario para que use la base de datos, se utiliza el siguiente comando:

mysql> GRANT ALL ON NombreBaseDeDatos.* TO el_usuario@localhost IDENTIFIED BY "la_password";
mysql> FLUSH privileges;

También hay más formas de hacerlo:

# mysql -u root -p
mysql> CREATE DATABASE moodle;
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,ALTER ON moodle.*
TO moodleuser@localhost IDENTIFIED BY 'yourpassword';
mysql> quit
# mysqladmin -p reload

La diferencia es que la primera forma da todos los privilegios al usuario, y en la segunda se va especificando uno a uno los privilegios que le quieres dar al usuario sobre la BBDD. Además en la primera se aplican los cambios con la sentencia flush y en la segunda con un reload de la BBDD.