Instalando y configurando el servidor web

En esta guía vamos a hacer una instalación de Apache, PHP y MySQL donde podremos instalar software hecho en PHP (nuestros sitios en PHP) usando un servidor Ubuntu server 12.04 x64. Algunos pasos serán válidos en otras distribuciones. En Debian, por ejemplo debemos ser root para ejecutar algunas cosas en lugar de hacerlo con sudo, en SUSE, debemos usar yast en lugar de apt-get…

Instalación básica

Para instalar Apache escribimos:

$ sudo apt-get install apache

# Confirmamos que queremos instalar y esperamos.

En unos segundos, tendremos el servidor instalado, y si accedemos a la IP del servidor desde nuestro navegador:

Screenshot 02-06-2013-210604

Apache creará el usuario www-data y el grupo con el mismo nombre. Los ficheros y los scripts serán accedidos desde esos grupo y usuario.

Aunque cuando queremos reiniciar nuestro servidor:

$ sudo service apache2 restart

vemos el siguiente mensaje:

apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName

Para arreglarlo, debemos incluir la directiva ServerName en /etc/apache2/httpd.conf con un FQDN (Fully Qualified Domain Name), es decir, el nombre del ordenador, punto, nombre de dominio; como argumento. Si, por ejemplo nuestro FQDN es vps.mydomain.com debemos incluir la siguiente línea en /etc/apache2/httpd.conf:

ServerName vps.mydomain.com

Cuando salvemos el archivo y reiniciemos el servidor, no volveremos a ver el mensaje.

Ahora, instalaremos PHP e instalaremos algunos módulos tanto para Apache como para PHP. Comenzaremos por los de PHP:

$ sudo apt-get install php5 libapache2-mod-php5 php-pear php5-gd php5-mcrypt php-apc php5-intl php5-curl

Aunque puede ser que algunos scripts en PHP requieran otros módulos. Para ver los que están disponibles en nuestra distribución:

$ aptitude search php

Ahora instalaremos el servidor MySQL:

$ sudo apt-get install mysql-server

Aceptamos la confirmación de la instalación y tras unos segundos veremos una pantalla como esta:

Screenshot 03-06-2013-010648

Donde debemos escribir la contraseña para nuestro servidor MySQL (usuario root), debemos escoger una contraseña segura y deberemos escribirla dos veces.

Almacenar todas las páginas dentro del home de nuestro usuario principal

Esto lo podemos hacer de muchas formas, depende de cómo queramos organizarnos, y aquí describo la manera que utilizo en algunos de mis servidores. Mi home está en /home/cloud, allí creo un directorio llamado www

~ $ mkdir www

Dentro de ese directorio, creo tantos directorios como sitios web quiera alojar, imaginemos que quiero alojar totaki.com, gaspar.totaki.com y admin.totaki.com (también puedo alojar webs en otros dominios, ya tendremos que comprarlos y hacer que apunten a la ip de nuestro servidor):

~ $ cd www

www $ mkdir totaki.com

www $ mkdir gaspar.totaki.com

www $ mkdir admin.totaki.com

Por supuesto que puedo crear gaspar.totaki.com y admin.totaki.com dentro de totaki.com, pero bueno, eso depende de cada uno de nosotros. Dentro de cada directorio crearé dos directorios más: www, donde pondré los archivos que conformarán la web y logs donde almacenaremos los informes del servidor. (Prefiero almacenar los informes de cada web por separado).

www $ mkdir totaki.com/{www,logs}

www $ mkdir gaspar.totaki.com/{www,logs}

www $ mkdir admin.totaki.com/{www,logs}

Entonces, copiamos los archivos de las diferentes webs en totaki.com/www, gaspar.totaki.com/www, más adelante copiaremos algo en admin.totaki.com/www con algunas herramientas

Tras copiar estos ficheros, debemos crear los sitios en Apache. Para esto, creamos los archivos /etc/apache2/sites-available/totaki.com, /etc/apache2/sites-available/gaspar.totaki.com y /etc/apache2/sites-available/admin.totaki.com ; para cada nuevo sitio que vayamos a crear, debemos crear un nuevo archivo en /etc/apache2/sites-available/ y estos archivos contendrán algo como esto: (ejemplo con totaki.com)

<VirtualHost *:80>
        ServerAdmin info@totaki.com
        ServerName totaki.com
        ServerAlias www.totaki.com

        DocumentRoot /home/cloud/www/totaki.com/www
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /home/cloud/www/totaki.com/www/>
                Options FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
        ErrorLog    "/home/cloud/www/totaki.com/logs/error.log"        
        LogLevel warn        
        CustomLog "/home/cloud/www/totaki.com/logs/access.log" combined       
</VirtualHost>

Fácilmente podremos crear un script que cree este archivo para cada uno de los sitios que hospedemos. En ServerName podremos colocar admin.totaki.com y gaspar.totaki.com y también alias en ServerAlias para, como en el ejemplo, utilizar también la dirección con www. delante.

Ahora activamos los sitios que acabamos de crear:

$ sudo a2ensite totaki.com

$ sudo a2ensite gaspar.totaki.com

$ sudo a2ensite admin.totaki.com

No os preocupéis si no tenemos nada en admin.totaki.com por el momento. Para hacer que los sitios funcionen debemos recargar la configuración del servidor.

$ sudo service apache2 reload

Podemos utilizar restart, pero es más lento cuando tenemos muchos sitios activos y el servidor se apagará por completo antes de reiniciar por lo que los usuarios que vengan en ese momento se perderán (o recibirán un error del servidor).

Incluso después de activar un sitio, es posible cambiar su configuración editando /etc/apache2/sites-available/[nombre_del_sitio], la activación del sitio simplemente crea un enlace a este fichero en /etc/apache2/sites-enabled/[nombre_del_sitio].

Módulos útiles para Apach2

Activar módulos es similar a activar sitios, en lugar de a2ensite utilizaremos a2enmod. En primer módulo, y uno de mis favoritos es mod_rewrite. Permite que los sitios utilicen URLs amigables para el usuario haciendo una redirección interna a la hora de llamar al archivo dentro del servidor. Muchísimas webs lo usan. Para activarlo debemos escribir:

$ sudo a2enmod rewrite

$ sudo service apache2 restart

Y para utilizar este módulo debemos, además, escribir algo en el archivo de configuración del sitio /etc/apache2/sites-available/[nombre_del_sitio], dentro de la etiqueta <Directory>, algo como esto:

<Directory /home/cloud/www/site_name/www>
 ...
 AllowOverride All
 ....
</Directory>

(esto ya lo tenemos en el ejemplo de configuración de sitio un poco más arriba).

También podemos añadir el módulo SSL para sitios https:

$ sudo a2enmod ssl

Podemos ver los módulos disponibles en el directorio /etc/apache2/mods-available.

Instalando phpMyAdmin

Para administrar de forma sencilla las bases de datos MySQL, podemos instalar phpMyAdmin en nuestro servidor, por supuesto, protegido con contraseña. Debemos crear un nuevo directorio (por ejemplo tarbalss) para el archivo comprimido de phpMyadmin (y procederemos así para los archivos comprimidos que vayamos a instalar, a mí me gusta tenerlos a mano para el futuro).

www $ mkdir admin.totaki.com/tarballs

Ahora, descargamos el programa, para ello, nos dirigimos a la página oficial y bajamos la última versión. En el momento en el que escribo esta guía, vamos por la versión 4.0.2, podemos descargar la versión para todos los idiomas (all-languages) o la versión en inglés en formato .tar.bz2 (por ejemplo). Intentamos descargar el fichero y copiamos el enlace al archivo de descarga. Lo pegaremos en la sesión ssh con nuestro servidor (wget delante, para descargar):

www $ cd admin.totaki.com/tarballs

www/admin.totaki.com/tarballs $ wget [download_file].tar.bz2

En mi caso,

www/admin.totaki.com/tarballs $ wget http://sourceforge.net/projects/phpmyadmin/files/phpMyAdmin/4.0.2/phpMyAdmin-4.0.2-all-languages.tar.bz2/download

Ahora extraemos el archivo en nuestro directorio www:

www/admin.totaki.com/tarballs $cd ../www

www/admin.totaki.com/www/ $ tar xvjf ../tarballs/phpMyAdmin-4.0.2-all-languages.tar.bz2

Esto creará otro directorio (phpMyAdmin-4.0.2-all-languages/) podemos renonbrarlo a pma o phpMyAdmin (es decir, un directorio un poco más sencillo de escribir):

www/admin.totaki.com/www $ mv phpMyAdmin-4.0.2-all-languages pma

En este punto, podemos borrar el directorio setup, para evitar que algún intruso cargue estos scripts. Ya tenemos phpMyAdmin instalado, nos preguntará el usuario y password de la base de datos cuando entremos en http://admin.totaki.com/pma . Podemos dar otro par de pasos más para hacer más segura la entrada con un password extra, lo que nos ayudará para ejecutar herramientas futuras en nuestro servidor a través de admin.totaki.com; así como para hacer que phpMyAdmin entre directamente como root (o como cualquier usuario).

Proteger con contraseña una carpeta (por ejemplo la carpeta pma)

Para hacer que Apache pida usuario y contraseña antes de entrar en una carpeta de la web, primero debemos crear un fichero .htaccess (punto htaccess), eso es, un archivo oculto de UNIX; también debemos almacenar las contraseñas fuera del raíz de la web, por ejemplo en www/admin.totaki.com/passwords.

Las contraseñas debemos crearlas con el programa htpasswd, para ello (el usuario se llamará gaspar):

$ cd www/admin.totaki.com

www/admin.totaki.com $ mkdir passwords

www/admin.totaki.com $ htpasswd -c passwords/www gaspar

New password:

Re-type new password

Adding password for user Gaspar

En este ejemplo hemos creado el archivo www dentro de www/admin.totaki.com/passwords y allí, hemos creado el usuario gaspar. El programa nos pedirá la contraseña dos veces. Entonces editaremos el archivo www/admin.totaki.com/www/.htaccess añadiendo la siguiente información:

AuthUserFile /home/cloud/www/admin.totaki.com/passwords/www
AuthType Basic
AuthName “Zona privada”
Require valid-user

Ahora, cuando un usuario entre en la web, verá un mensaje como este:

Screenshot 07-06-2013-190618Hacer que phpMyAdmin se identifique automáticamente como un usuario (por ejemplo, root)

No es recomendable hacer que nos identifiquemos con privilegios de superusuario (root), pero es útil si tenemos varios usuarios en nuestro sistema y queremos que se identifiquen automáticamente en sus bases de datos. Sólo mostraré una configuración básica de phpMyAdmin.

Activaremos algunas características de phpMyAdmin que requieren una base de datos, entonces, primero, crearemos la base de datos y las tablas que phpMyAdmin necesita gracias a un archivo sql incluido con el programa:

$ mysql -u root -p < /home/cloud/www/admin.totaki.com/www/pma/scripts/create-tables.sql

Una vez hayamos instalado esto, vamos a crear un usuario en MySQL y le entregaremos privilegios sobre la base de datos phpmyadmin:

$ mysql -u root -p

Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 104

mysql> CREATE USER ‘pma’@’localhost’ IDENTIFIED BY ‘axK12jMf’ [clave para el usuario pma]
Query OK, 0 rows affected (0.03 sec)

mysql> GRANT SELECT, INSERT, DELETE, UPDATE ON `phpmyadmin`.* TO ‘pma’@’localhost’;
mysql> exit

Ya está creado, ahora debemos hacer que phpMyAdmin utilice el usuario pma para acceder a la base de datos phpmyadmin. Ahora crearemos el archivo de configuración basado en el archivo de configuración de ejemplo:

www/admin.totaki.com/www/pma/ $ cp config.sample.inc.php config.inc.php

Ahora generamos una clave aleatoria, utilizada para las cookies en phpmyadmin:

pwgen -yns 46 1

Y, por último, editamos el archivo config.inc.php cambiando lo siguiente:

$cfg[‘blowfish_secret’] = ”Generated random key’; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
…..
…..
$i++;

$cfg[‘Servers’][$i][‘verbose’] = ‘Servidor Local’;
$cfg[‘Servers’][$i][‘host’] = ‘localhost’;
$cfg[‘Servers’][$i][‘port’] = ”;
$cfg[‘Servers’][$i][‘socket’] = ”;
$cfg[‘Servers’][$i][‘connect_type’] = ‘tcp’;
$cfg[‘Servers’][$i][‘extension’] = ‘mysqli’;
$cfg[‘Servers’][$i][‘auth_type’] = ‘config’;
$cfg[‘Servers’][$i][‘user’] = ‘root’;
$cfg[‘Servers’][$i][‘password’] = ‘NUESTRA CLAVE DE ROOT DE MYSQL’;
$cfg[‘Servers’][$i][‘controluser’] = ‘pma’;
$cfg[‘Servers’][$i][‘controlpass’] = ‘axK12jMf”;/* Storage database and tables */
$cfg[‘Servers’][$i][‘pmadb’] = ‘phpmyadmin’;
$cfg[‘Servers’][$i][‘bookmarktable’] = ‘pma_bookmark’;
$cfg[‘Servers’][$i][‘relation’] = ‘pma_relation’;
$cfg[‘Servers’][$i][‘table_info’] = ‘pma_table_info’;
$cfg[‘Servers’][$i][‘table_coords’] = ‘pma_table_coords’;
$cfg[‘Servers’][$i][‘pdf_pages’] = ‘pma_pdf_pages’;
$cfg[‘Servers’][$i][‘column_info’] = ‘pma_column_info’;
$cfg[‘Servers’][$i][‘history’] = ‘pma_history’;
$cfg[‘Servers’][$i][‘tracking’] = ‘pma_tracking’;
$cfg[‘Servers’][$i][‘designer_coords’] = ‘pma_designer_coords’;
$cfg[‘Servers’][$i][‘userconfig’] = ‘pma_userconfig’;

….
….
/* Select mysqli if your server has it */
$cfg[‘Servers’][$i][‘extension’] = ‘mysqli’;

One thought on “Instalando y configurando el servidor web

  1. Pingback: ownCloud un 2015. Instalación básica (I) - Poesía Binaria

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *