El alojamiento web (en inglés: web hosting) es el servicio que provee a los usuarios de Internet un sistema para poder almacenar información, imágenes, vídeo, o cualquier contenido accesible vía web. Es una analogía de «hospedaje o alojamiento en hoteles o habitaciones» donde uno ocupa un lugar específico, en este caso la analogía alojamiento web o alojamiento de páginas web, se refiere al lugar que ocupa una página web, sitio web, sistema, correo electrónico, archivos etc. en internet o más específicamente en un servidor que por lo general hospeda varias aplicaciones o páginas web.

Las compañías que proporcionan espacio de un servidor a sus clientes se suelen denominar con el término en inglés web host.

El hospedaje web aunque no es necesariamente un servicio, se ha convertido en un lucrativo negocio para las compañías de Internet alrededor del mundo.

Se puede definir como «un lugar para tu página web o correos electrónicos», aunque esta definición simplifica de manera conceptual el hecho de que el alojamiento web es en realidad espacio en Internet para prácticamente cualquier tipo de información, sea archivos, sistemas, correos electrónicos, videos, etcétera.

Tipos de alojamiento web

  • Alojamiento gratuito
  • Alojamiento por donación
  • Alojamiento compartido
  • Alojamiento de imágenes
  • Alojamiento de vídeo
  • Alojamiento de correo corporativo
  • Alojamiento revendedor (reseller)
  • Servidores virtuales (Virtual Private Server, VPS)
  • Servidores dedicados
  • Servidores dedicados administrados
  • Alojamiento Administrado y No Administrado
  • Colocación (housing)
  • Alojamiento web en la nube (cloud hosting)

El objetivo es montar un servidor que ofrezca un servicio de de hospedaje de páginas web con las siguientes características:

  • Podemos dar de alta a un usuario y al nombre de dominio (por ejemplo nombrededominio.com) por el que va estar referido su espacio.
  • Se podrán hospedar páginas estáticas (html) y páginas web dinámicas construidas con PHP.
    Automáticamente se creará una página principal, que al acceder a la pagina web (www.nombrededominio.com) de la bienvenida e informe que dicha página está en construcción.
  • Para ello vamos a instalar el paquete apt install apache2 con dicho paquete vamos a poder tener un servidor web.

  • Para gestionar los ficheros hospedados en nuestro espacio utilizaremos un servidor FTP ftp.nombrededominio.com.
  • Para ello vamos a instalar el paquete apt install proftpd

  • Para gestionar las tablas de mysql accederemos al programa phpmyadmin en la dirección mysql.nombrededominio.com.
  • Y para gestionar las tablas de mysql vamos a instalar apt install mysql-server y phpmyadmin apt install phpmyadmin

Respuestas a las siguientes preguntas

  1. ¿Qué servidores necesitas instalar en la máquina donde vamos a implantar el hosting? Cuando damos de alta una nueva cuenta en nuestro hosting hay que indicar un usuario y un nombre de dominio. ¿Qué acciones hay que hacer en el servidor con el usuario? ¿Qué acciones hay que hacer con el nombre de dominio?
  2. Servidores apache, ftp, dns, ldap, mysql

    Acciones en el servidor Habilitar su directorio para ftp, Crear usuario en ldap, Crear usuario y una base de datos.

    Acciones en el dominio Crear virtualhost, Introducir los CNAME de los diferentes virtualhost, Crear la zona en el DNS

  3. ¿Cómo puedes comprobar que existe ya un usuario con el mismo nombre?¿y qué ya está dado de alta un determinado nombre de dominio?
  4. Consultando la base de datos

  5. ¿Qué debes tener en cuenta, a la hora de crear el directorio home del usuario, para que accediendo por ftp, el usuario pueda gestionar su página web?
  6. Debemos configurar proftpd para que el directorio del usuario sea el directorio raíz en ftp.

  7. ¿Cuantos nombres habrá que dar de alta en la zona de resolución directa de nombrededominio.com?
  8. http://www.nombrededominio.com
    mysql.nombrededominio.com
    ftp.nombrededomino.com

Instalación y configuración paquete necesarios

Ahora procedemos a descargar todos los paquete necesarios para poner en funcionamiento nuestro servidor de hosting, vamos utilizar usuarios virtuales, un servidor apache, un servidor FTP, una base de datos en mysql y un servidor DNS.

Servidor apache

Podemos ver como instalar y configurar un servidor mas detalladamente en Servidor Web, así que simplemente instalamos el paquete apt install apache2 libapache2-mod-php5, creamos un virtualhost el cual vamos a llamar igual que el dominio /etc/apache2/sites-available/www.jlramirez.com.conf y quedara asi:

<VirtualHost *:80>
        ServerName www.jlramirez.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/juanlu

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

También vamos a agregar un VirtualHost para poder acceder a phpmyadmin, el cual hemos instalado anteriormente, para ello hacemos una copia del VirtualHost creado anteriormente cp /etc/apache2/sites-available/www.jlramirez.com.conf /etc/apache2/sites-available/mysql.jlramirez.com.conf y modificamos para que quede así:

<VirtualHost *:80>
        ServerName mysql.jlramirez.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/
        RedirectMatch permanent ^/$ "/phpmyadmin/"

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Creamos el directorio mkdir /var/www/html/juanlu, habilitamos el virtualhost a2ensite www.juanluramirez.com.conf y por ultimo reiniciamos el servicio systemctl restart apache2

Servidor DNS

A continuación vamos a instalar el Servidor DNS, instalación y configuración que podemos ver mas detallada DNS bind9, en este caso vamos ha hacer una configuración básica para ello instalamos el paquete apt install bind9 y añadimos la zona con autoridad, para la resolución directa /etc/bind/named.conf.local:

zone "jlramirez.com" {
type master;
file "db.jlramirez.com";
};

Y modificamos el fichero de configuración especificado para la resolución de nombres /var/cache/bind/db.jlramirez.com, para que nos resulte mas facil vamos a copiar la plantilla que viene rellenada cp /etc/bind/db.empty /var/cache/bind/db.jlramirez.com

; BIND reverse data file for empty rfc1918 zone
;
; DO NOT EDIT THIS FILE - it is used for multiple zones.
; Instead, copy it, edit named.conf, and use that copy.
;
$TTL	86400
@	IN	SOA	hosting.jlramirez.com. mail.jlramirez.com. (
			      1		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			  86400 )	; Negative Cache TTL
;
@	IN	NS	hosting.jlramirez.com.
$ORIGIN jlramirez.com.
hosting	IN	A	192.168.1.53
www	IN	CNAME	hosting
ftp	IN	CNAME	hosting
mysql	IN	CNAME	hosting

Comprobamos que no tenemos ningún error:

root@hosting:/home/vagrant# named-checkzone jlramirez.com /var/cache/bind/db.jlramirez.com
zone jlramirez.com/IN: loaded serial 1
OK

Y reiniciamos el servicio systemctl restart bind9

FTP

Ahora procedemos a instalar el servidor FTP, el cual podemos ver una explicacion mas detallada en el siguiente post Servidor FTP, en este caso vamos a realizar una instalacion sencilla, por lo tanto instalamos los siguientes paquetes apt install proftpd-basic proftpd-mod-mysql

El siguiente paso es editar el fichero /etc/proftpd/proftpd.conf, para que las siguientes lineas queden como especifico aqui:

#Descomentamos esta linea

RequireValidShell off

#Ahora configuramos proftp para que use usuarios virtuales, 
#que almacenaremos en una base de datos mysql. 
#En el fichero de configuración añadimos lo siguiente:

# Use this to jail all users in their homes
DefaultRoot                     /var/www/html/juanlu juanlu

AuthPAM off
SQLBackend mysql
SQLAuthTypes Backend
SQLAuthenticate on
SQLConnectInfo ftpd@localhost proftpd proftpd
SQLDefaultGID 65534
SQLDefaultUID 65534
SQLMinUserGID 500
SQLMinUserUID 500
SQLGroupInfo grupos groupname gid members
SQLUserInfo usuarios username password uid gid homedir shell
SQLUserWhereClause "activa=1"
SQLLogFile /var/log/proftpd_mysql.log

Por ultimo modificamos el fichero de los módulos mysql de proftpd, para ello editamos el siguiente fichero /etc/proftpd/modules.conf, descomentaremos las siguiente lineas:

# the existent SQL backeds.
LoadModule mod_sql.c

# Install proftpd-mod-mysql and decomment the previous
# mod_sql.c module to use this.
LoadModule mod_sql_mysql.c

Y reiniciamos el servicio systemctl restart proftpd

Info! Al descomentar las lineas, si descomentas las que no son, no vas a poder reiniciar el servicio ten en cuenta que sean las especificadas en el párrafo anterior.

Mysql

Instalamos el servidor mysql apt install mysql-server phpmyadmin, una ves instalado entramos en la base de datos con el usuario root, creamos la base de datos ftpd y le damos permisos:

root@hosting:/home/vagrant# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.5.53-0+deb8u1 (Debian)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE DATABASE ftpd;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL ON ftpd.* TO proftpd@localhost IDENTIFIED BY "usuario";
Query OK, 0 rows affected (0.00 sec)

Una vez creada la base de datos, vamos a acceder use ftpd; y vamos a crear las tablas y vamos a insetar los datos:

mysql> CREATE TABLE usuarios (
    -> username char(20) NOT NULL,
    -> password char(70) NOT NULL,
    -> uid int(6) default NULL,
    -> gid int(6) default NULL,
    -> homedir char(50) default NULL,
    -> shell char(30) default NULL,
    -> activa tinyint(4) default '1',
    -> dominio char(50) default NULL
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE grupos (
    -> groupname char(20) NOT NULL,
    -> gid int(6) NOT NULL default '65534',
    -> members longtext
    -> );
Query OK, 0 rows affected (0.01 sec)

Y insertamos los datos:

mysql> insert into usuarios values('juanlu',password('usuario'),2001,2001,'/var/www/html/juanlu','/bin/bash',1,'jlramirez.com');
Query OK, 1 row affected (0.01 sec)

mysql> insert into grupos values('alumnos',2001,'alumnos');
Query OK, 1 row affected (0.00 sec)

Una vez insertados los usuarios vamos a crear un enlace ln -s /usr/share/phpmyadmin /var/www/html/ de phpmyadmin, para que al acceder de un navegador a mysql.jlramirez.com acceda a phpmyadmin.

Para que cada usuario tenga acceso a phpmyadmin y pueda crear una base de datos vamos a crear un usuario en la mysql por cada usuario con acceso ftp.

Para crear el usuario CREATE USER 'myjuanlu'@'localhost' IDENTIFIED BY 'usuario'; y asignamos los privilegios GRANT CREATE,DROP,DELETE,INSERT,SELECT,UPDATE ON * . * TO 'myjuanlu'@'localhost';

Dar de baja a un usuario virtual

DNS

Vamos a deshacer todas las configuración realizadas anteriormente, primero eliminamos la zona DNS, borrando lo añadido del fichero /etc/bind/named.conf.local.

A continuación eliminamos el fichero de definicion de la zona directa rm -rf /var/cache/bind/db.jlramirez.com

Y por ultimo eliminamos los ficheros creados:

Virtualhost

Deshabilitamos a2dissite www.jlramirez.com.conf y eliminamos dicho fichero rm -rf /etc/apache2/sites-available/www.jlramirez.com.conf

Mysql

Eliminamos de la tabla usuarios, el usuario juanlu:

mysql> use ftpd;
mysql> delete from usuarios where username='juanlu' and dominio='juanlu.com';

Y el directorio rm -rf /var/www/html/juanlu