Montar un Servidor Web

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.

Tasksel

Tasksel

Instalará Apache y todas las dependencias.

Instalando

Instalando

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 webmaster@midminio.com
        
        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/access.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.

This entry was posted in Apache, Linux and tagged , , , , , . Bookmark the permalink.

6 Responses to Montar un Servidor Web

  1. Dany says:

    Me están entrando ganas de montarlo en casa para darle utilidad al PC y trastear con Linux.

  2. nordri says:

    ándale! Para probar cosillas nada mejor que un server casero.

  3. Giorgio Snuiv says:

    mmm genial!! si se admitiesen peticiones en este blog, yo pediría un DIY de un server casero barato barato, en el qeu rulen los gestoes de contenido más conocidos y consuma poco. Pero sólo si se admiten 😛

  4. nordri says:

    @Giorgio Snuiv Puedes probar estos instaladores http://bitrock.com son unos asistentes para instalar y configurar aplicaciones web.

    Me alegro que te guste! 😉

  5. Ezú says:

    Muy buen tutorial, sobretodo la primera parte de cambiar el usuario, para que no coja el usuario por defecto.

    Me guardo este manual para cuando me cargue la instalación actual.

    Un saludo.

  6. nordri says:

    Asias Ezú!! xDD

Comments are closed.