Hay muchas formas de llevar a cabo la tarea de desplegar un servidor Web, incluso se puede optar por algún servicio que nos ofrezca un panel de control para administrar el contenido perdidiendo la capacidad de administrar físicamente los servicios. Como digo, existen muchas maneras de hacer esto, esta es una de ellas.
Introducción
No entramos en detalles sobre el hardware de la máquina, ya está instalado un sistema GNU/Linux Debian Squezee. Hemos contratado un servidor que incluye nombre DNS para nuestro dominio midominio.com.
El usuario
La ejecución del servidor debe ser bajo un usuario no privilegiado y sin shell válida en el sistema. En Debian, tras instalar Apache, se crea un usuario www-data para esta tarea, pero lo vamos a cambiar por otro por no mantener, en la medida de lo posible, los valores por defecto. Nuestro usuario será webuser que es bastante descriptivo de la labor que tendrá.
Creamos el grupo y el usuario y le asignamos contraseña:
# groupadd webuser # useradd -d /home/webuser -s /bin/false -g webuser -m webuser # passwd webuser Introduzca la nueva contraseña de UNIX: Vuelva a escribir la nueva contraseña de UNIX: passwd: contraseña actualizada correctamente
Con esto contamos con el usuario, vamos a instalar Apache.
Instalando Apache
Vamos a instalarlo mediante la utilidad tasksel que es gráfica de consola y nos ahorra escribir.
# tasksel
De las opciones disponibles, elegimos la de Servidor Web, como vemos en la imagen, luego le damos a aceptar.
Instalará Apache y todas las dependencias.
Ya podemos pasar a configurar el servidor.
Configurando Apache
La configuración que trae Debian para Apache es la que me hace elegir esta distribución frente a otras como CentOS que también es conocida por estar presente en muchos servidores web de internet. El primer fichero que vamos a configurar es /etc/apache2/envvars y añadimos el usuario y grupo que hemos creado.
# vim /etc/apache2/envvars
[...] export APACHE_RUN_USER=webuser export APACHE_RUN_GROUP=webuser [...]
A continuación deshabilitamos los VirtualHosts que vienen por defecto para crear el nuestro, podemos crear tantos como sean necesarios.
# a2dissite 000-default Site default disabled. Run '/etc/init.d/apache2 reload' to activate new configuration!
Ahora creamos nuestro sitio empezando por crear la estructura de directorios. Para ello vamos a crear siguiendo la filosofía que vi en SuSE y me gustó.
# mkdir -p /server/midominio.com
De esta forma, contamos con el directorio /server y de él colgaran todos los servidores virtuales.
Ajustamos los permisos del directorio:
# chown -R webuser.webuser /server
Configuramos ahora las stanzas para nuestro servidor, para ello creamos un nuevo fichero /etc/apache2/sites-available/misitio.
# vim /etc/apache2/sites-available/midominio.com
NameVirtualHost *:80
<VirtualHost *:80>
ServerName midominio.com
ServerAlias www.midominio.com
ServerAdmin Email protegido.
DocumentRoot /server/midominio.com/
<Directory />
Options FollowSymLinks
AllowOverride all
</Directory>
<Directory /server/midominio.com/>
Options FollowSymLinks Multiviews Indexes
AllowOverride all
Order allow,deny
allow from all
</Directory>
ErrorLog /var/log/apache2/error.midominio.com.log
LogLevel warn
CustomLog /var/log/apache2/error.midominio.com.log combined
ServerSignature Off
</VirtualHost>
Comentamos que permitimos AllowOverride a all para que podamos customizar el sitio a través de .htaccess y no tener que tocar mucho la configuración del servidor. También personalizamos los archivos de logs por si añadimos más servidores distinguir entre ellos.
Habilitamos el sitio.
# a2ensite misitio
Ya podemos arrancar el servidor.
# apache2ctl graceful
Ahora ya podemos abrir un navegador web y entrar en el sitio, aunque no tiene contenido, cosa que resolveremos ahora.
En nuestro panel de control habilitamos que tanto midominio.com como www.midominio.com resuelvan a nuestra web, luego podemos usar un truco como este para que por defecto se utilice las uves dobles que es mejor desde el punto de vista SEO.
Añadir contenido, el servidor FTP
El usuario no tiene shell, luego no podemos iniciar una sesión en el servidor para crear los archivos html que queramos servir ni copiarlos por ssh, así que desplegamos un servidor FTP, por razones más históricas que otra cosa, uso Proftpd que tiene una configuración modular similar a la de Apache. Tiene soporte de VirtualHost pero la limitación del protocolo hace que no se pueda usar el mismo puerto en todos los servidores, esto es, cada VirtualHost que configures estará asociado a un puerto.
Pasamos a instalarlo.
# apt-get install proftpd
Lo instalamos como servidor independiente.
La configuración es esta:
# /etc/proftpd/proftpd.conf -- This is a basic ProFTPD configuration file. # To really apply changes reload proftpd after modifications. # Includes DSO modules Include /etc/proftpd/modules.conf # Set off to disable IPv6 support which is annoying on IPv4 only boxes. UseIPv6 off # If set on you can experience a longer connection delay in many cases. IdentLookups off ServerName "Mi servidor FTP" ServerType standalone DeferWelcome off MultilineRFC2228 on DefaultServer on ShowSymlinks on TimeoutNoTransfer 600 TimeoutStalled 600 TimeoutIdle 1200 DisplayLogin welcome.msg DisplayChdir .message true ListOptions "-l" DenyFilter \*.*/ # Use this to jail all users in their homes # DefaultRoot ~ # Users require a valid shell listed in /etc/shells to login. # Use this directive to release that constrain. # RequireValidShell off # Port 21 is the standard FTP port. Port 0 # In some cases you have to specify passive ports range to by-pass # firewall limitations. Ephemeral ports can be used for that, but # feel free to use a more narrow range. PassivePorts 49152 65534 # If your host was NATted, this option is useful in order to # allow passive tranfers to work. You have to use your public # address and opening the passive ports used on your firewall as well. # MasqueradeAddress 1.2.3.4 # This is useful for masquerading address with dynamic IPs: # refresh any configured MasqueradeAddress directives every 8 hours <IfModule mod_dynmasq.c> # DynMasqRefresh 28800 </IfModule> # To prevent DoS attacks, set the maximum number of child processes # to 30. If you need to allow more than 30 concurrent connections # at once, simply increase this value. Note that this ONLY works # in standalone mode, in inetd mode you should use an inetd server # that allows you to limit maximum number of processes per service # (such as xinetd) MaxInstances 30 # Set the user and group that the server normally runs at. User webuser Group webuser # Umask 022 is a good standard umask to prevent new files and dirs # (second parm) from being group and world writable. Umask 022 022 # Normally, we want files to be overwriteable. AllowOverwrite on # Uncomment this if you are using NIS or LDAP via NSS to retrieve passwords: # PersistentPasswd off # This is required to use both PAM-based authentication and local passwords # AuthOrder mod_auth_pam.c* mod_auth_unix.c # Be warned: use of this directive impacts CPU average load! # Uncomment this if you like to see progress and transfer rate with ftpwho # in downloads. That is not needed for uploads rates. # # UseSendFile off TransferLog /var/log/proftpd/xferlog SystemLog /var/log/proftpd/proftpd.log <IfModule mod_quotatab.c> QuotaEngine off </IfModule> <IfModule mod_ratio.c> Ratios off </IfModule> # Delay engine reduces impact of the so-called Timing Attack described in # http://security.lss.hr/index.php?page=details&ID=LSS-2004-10-02 # It is on by default. <IfModule mod_delay.c> DelayEngine on </IfModule> <IfModule mod_ctrls.c> ControlsEngine off ControlsMaxClients 2 ControlsLog /var/log/proftpd/controls.log ControlsInterval 5 ControlsSocket /var/run/proftpd/proftpd.sock </IfModule> <IfModule mod_ctrls_admin.c> AdminControlsEngine off </IfModule> <VirtualHost midominio.com> ServerName "midominio.com" Port 21 DefaultRoot /server/midominio <Limit LOGIN> AllowUser webuser AllowGroup webuser DenyAll </Limit> RequireValidShell off AllowOverwrite on </VirtualHost>
Hemos cambiado el puerto FTP por el 0 para usar el 21 para el VirtualHost e indicamos que el usuario (webuser) no requiere de una shell valida.
Ahora podemos usar un cliente FTP, por ejemplo Filezilla para subir ficheros al servidor.
Y ya hemos terminado, hemos creado un servidor web desde cero, aun quedan cosas por hacer pero lo básico está cubierto, os invito a seguir navegando por el blog y veáis como configurar mod_deflate para servir contenido comprimido, mod_evasive para evitar ataques DDOS, o mod_expires para almacenar contenido estático en la caché del usuario.