Sunteți pe pagina 1din 149

Apache

Miguel Ángel Nieto <miguelangel@irontec.com>


Irontec – Internet y Sistemas sobre GNU/Linux
Irontec – Curso Apache

Protocolo HTTP

● Hypertext Transfer Protocol


● Desde 1994
● RFC 2616
● Sobre TCP.
● Puertos por defecto:
– No seguro: tcp 80
– Seguro (ssl/tls): 443
● Versiones: 0.9, 1.0, 1.1 (la más usada), 1.2
● Protocolo stateless

2
Irontec – Curso Apache

Protocolo HTTP

● Elementos:
– Cliente=user agent: web browser, spider, wget, curl,...
– Servidor
– Intermediarios: Proxy, gateway, túnel

3
Irontec – Curso Apache

Protocolo HTTP

● Mensaje de petición:
– Línea de método de petición
– Líneas de cabecera de petición (de tipo XXX:YYY)
– <CR><LF> (Línea en blanco)
– Cuerpo (opcional)
● Mensaje de respuesta:
– Línea de código de estado
– Líneas de cabecera de respuesta (de tipo XXX:YYY)
– <CR><LF> (Línea en blanco)
– Cuerpo (opcional)
● Todas las líneas acaban en <CR><LF>

4
Irontec – Curso Apache

Protocolo HTTP

● Mensajes de petición
● Ej:
– GET / HTTP/1.1
– Host:
– User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
rv:1.8.1.12) Gecko/20080207 Ubuntu/7.10 (gutsy)
Firefox/2.0.0.12 Paros/3.2.13
– Accept: text/xml,text/plain;q=0.8,image/png,*/*;q=0.5
– Accept-Language: es-es,en-us;q=0.7,en;q=0.3
– Accept-Charset: UTF-8,*
● Otras líneas de cabecera:
– Keep-Alive, Proxy-Connection, Referer, Cookie, Content-
length,...
– Ref: http://en.wikipedia.org/wiki/List_of_HTTP_headers

5
Irontec – Curso Apache

Protocolo HTTP

● GET: solicita una petición dentro de la URL.


● POST: envía datos en el cuerpo de la petición
● PUT: upload
● HEAD: solicita una respuesta idéntica a GET pero sólo
devuelve las cabeceras (no el cuerpo).
● DELETE: borrado
● TRACE: devuelve la petición, para comprobar si algún
equipo intermedio modifica la original
● OPTIONS: devuelve los métodos soportados por el
servidor
● CONNECT: empleado para túneles tcp/ip, típicamente
para hacer conexiones https a través de un proxy http.
Riesgo si en el proxy no se limitan los posibles destinos6
Irontec – Curso Apache

Protocolo HTTP

● Mensajes de respuesta
● Ej:
– HTTP/1.1 200 OK
– Date: Thu, 27 Mar 2008 21:29:14 GMT
– Content-Type: text/html; charset=US-ASCII
– Server: AmazonS3
● Otras líneas de cabecera:
– ETag, Expires, Pragma, Vary, X-*
– Ref: http://en.wikipedia.org/wiki/List_of_HTTP_headers

7
Irontec – Curso Apache

Protocolo HTTP

● Codigos de estado
● Son los códigos devueltos por el servidor.
● Se agrupan en:
– 1xx Información
– 2xx Éxito
– 3xx Redirección
– 4xx Error de cliente
– 5xx Error de servidor

8
Irontec – Curso Apache

Protocolo HTTP

● Negociación de contenidos: mecanismo para


devolver distintos recursos o documentos a partir de
una URI solicitada. Ejs: Tipo imagen (gif, png), Idioma,
text/html o text/*
– Cabeceras:
● De cliente. Ej. Accept-encoding: gzip, deflate
● De servidor. Ej: Content-encoding: gzip
– Tipos MIME (Multipurpose Internet Mail Extensions):
● Forma de describir el tipo de documento a transmitir.
● Sintaxis: major type/minor type. Ej: text/html, image/gif
● Basados en extensión o en análisis (file ...)

9
Irontec – Curso Apache

Protocolo HTTP

● Conexiones persistentes (“HTTP keep-alive”)


(v1.1): hacer varias conexiones http con una sóla
conexión tcp.
– Ventajas:
● Menor carga de sistema operativo
● Menos congestión en la red (menos conexiones tcp) y
menor latencia en solicitudes posteriores.
● Posibilidad de http pipelining
– Según rfc2616 un cliente no debería establecer más de 2
conexiones persistentes al mismo tiempo con un
servidor, para evitar la congestión.

10
Irontec – Curso Apache

Protocolo HTTP

● HTTP pipelining (v1.1): peticiones asíncronas: enviar


más de una petición http sin esperar las respuestas.
– Ventaja: como se pueden enviar varias peticiones en un
único paquete tcp, es posible reducir la carga de red.

11
Irontec – Curso Apache

Protocolo HTTP

● Protocolo stateless: no guarda información sobre los


clientes
● Técnicas para mantener la historia:
– Cookies (rfc 2109). Inconveniente: han de habilitarse en el
browser
– URL rewriting (Ej. http://host/path;sessionid=12axY)
Inconvenientes:
● Todas las URLs han de llevar el id. Por tanto, hay que
generar todas las páginas de forma dinámica
● Los bookmarks no valen
● (URLs poco estéticas)
– Campos ocultos en formularios. Inviable a nivel general: no
todo está en formularios

12
Irontec – Curso Apache

Protocolo HTTP

● Se suelen encapsular a más alto nivel:


– APIs de php, java servlets,...
– Aplicación
● Cada sesión incluye:
– Identificador de sesión a incluir en el tráfico http
– Variables de sesión: pueden guardarse en ficheros de disco
o ej. en base de datos
– Timeout
● Implicaciones de seguridad: secuestro de sesión, ej.
con URL rewriting

13
Irontec – Curso Apache

Protocolo HTTP

● Alternativas de almacenamiento de información de


sesiones:
– En el lado del servidor. Inconvenientes:
● Acceso a la información si hay varios servidores ejs. cluster,
balance de carga. Soluciones:
– Replicación entre servidores
– Compartición: sockets, memoria, disco, BD
● (Limitación en el nº de clientes)
– En el lado del cliente: se usan cookies y criptografía.
Inconvenientes:
● Limitación de tamaño de cookie
● Información del usuario no accesible fuera de la sesión

14
Irontec – Curso Apache

Introducción

● Desarrollado inicialmente por Rob McCool (NCSA)


● Es desde 1996 el servidor web HTTP más utilizado en
Internet.
● Es multiplataforma (Unix, Microsoft, Novell)
● La versión 2 de apache se ha reescrito completamente.
● Es extremadamente estable.
● Modularizado para evitar mantener un código
extremadamente complejo y monolítico.
● Es software libre aunque no GPL.

http://www.apache.org

15
Irontec – Curso Apache

Introducción

● Roadmap: Evolución de las versiones


● 1.2.X
● 1.3.X
● 2.0.X
● 2.2.X
● Trunk o versión en desarrollo

16
Irontec – Curso Apache

Introducción

● Velocidad mayor en el caching


● Filtros Inteligentes
● Configurarión modular
● Balanceo de Carga para Proxys
● Soporte para apagado transparente
● Soporte para archivos mayores de 2GB
● Nuevas opciones para autenticación y autorización

http://httpd.apache.org/docs/2.2/new_features_2_2.html

17
Irontec – Curso Apache

Introducción

18
Irontec – Curso Apache

Instalación

● Código fuente
● Paquete binario para la distribución Debian
GNU/Linux

¿Ventajas y desventajas de cada uno?

19
Irontec – Curso Apache

Instalación – Código fuente

● Descargamos las últimas fuentes del mirror oficial más


próximo (http://apache/rediris.es/httpd)
● Se pueden buscar más mirrors y comprobar sus
estados en http://www.apache.org/mirrors/

http://apache.rediris.es/httpd/httpd-2.2.11.tar.gz

http://apache.rediris.es/httpd/httpd-2.2.11.tar.gz.asc

20
Irontec – Curso Apache

Instalación – Código fuente

● Verificamos la integridad del código fuente:


● Averiguamos la clave con la que fue firmada
$ gpg –-verify httpd-2.2.11.tar.gz.asc
gpg: Firmado el sáb 06 dic 2008 16:18:37 CET usando clave DSA ID 
311A3DE5
gpg: Imposible comprobar la firma: Clave pública no encontrada

● Importamos la clave pública con la que fue firmada


$ gpg --keyserver pgpkeys.mit.edu --recv-key 311A3DE5
gpg: anillo `/root/.gnupg/secring.gpg' creado
gpg: solicitando clave 311A3DE5 de hkp servidor pgpkeys.mit.edu
gpg: /root/.gnupg/trustdb.gpg: se ha creado base de datos de 
confianza
gpg: clave 311A3DE5: clave pública "Ruediger Pluem 
<rpluem@apache.org>" importada
gpg: no se encuentran claves absolutamente fiables
gpg: Cantidad total procesada: 1
gpg:               importadas: 1

21
Irontec – Curso Apache

Instalación – Código fuente

●Verificamos la integridad del código fuente:


● Verificamos la firma digital

$ gpg --verify httpd-2.2.11.tar.gz.asc


gpg: Firmado el sáb 06 dic 2008 16:18:37 CET usando clave DSA ID 311A3DE5
gpg: Firma correcta de "Ruediger Pluem <rpluem@apache.org>"
gpg: ATENCIÓN: ¡Esta clave no está certificada por una firma de confianza!
gpg:           No hay indicios de que la firma pertenezca al propietario.
Huellas dactilares de la clave primaria: 120A 8667 241A EDD4 A78B  4610 
4C04 2818 311A 3DE5

● La firma digital es válida pero la clave no es de


confianza!

22
Irontec – Curso Apache

Instalación – Código fuente

● Confiamos en la clave (¿seguro?)


$ gpg --edit-key 10FDE075
pub  1024D/311A3DE5  creado: 2005­10­02  caduca: nunca       uso: SCA 
                     confianza: desconocido   validez: desconocido
sub  2048g/A21CD598  creado: 2005­10­02  caduca: nunca       uso: E   
[desconocida] (1). Ruediger Pluem <rpluem@apache.org>
Orden> trust
pub  1024D/311A3DE5  creado: 2005­10­02  caduca: nunca       uso: SCA 
                     confianza: desconocido   validez: desconocido
sub  2048g/A21CD598  creado: 2005­10­02  caduca: nunca       uso: E   
[desconocida] (1). Ruediger Pluem <rpluem@apache.org>

Por favor, decida su nivel de confianza en que este usuario
verifique correctamente las claves de otros usuarios (mirando
pasaportes, comprobando huellas dactilares en diferentes fuentes...)

 1 = No lo sé o prefiero no decirlo
 2 = NO tengo confianza
 3 = Confío un poco
 4 = Confío totalmente
 5 = confío absolutamente
  m = volver al menú principal

23
Irontec – Curso Apache

Instalación – Código fuente


● Continuamos...
¿Su decisión? 5
¿De verdad quiere asignar absoluta confianza a esta clave? (s/N) s

pub  1024D/311A3DE5  creado: 2005­10­02  caduca: nunca       uso: SCA 
                     confianza: absoluta      validez: desconocido
sub  2048g/A21CD598  creado: 2005­10­02  caduca: nunca       uso: E   
[desconocida] (1). Ruediger Pluem <rpluem@apache.org>
Por favor, advierta que la validez de clave mostrada no es necesariamente
correcta a menos de que reinicie el programa.

24
Irontec – Curso Apache

Instalación – Código fuente

● Verificamos de nuevo la firma digital


$ gpg --verify httpd-2.2.11.tar.gz.asc
gpg: Firmado el sáb 06 dic 2008 16:18:37 CET usando clave DSA ID 311A3DE5
gpg: comprobando base de datos de confianza
gpg: 3 dudosa(s) necesarias, 1 completa(s) necesarias,
modelo de confianza PGP
gpg: nivel: 0  validez:   1  firmada:   0  confianza: 0­, 0q, 0n, 0m, 0f, 
1u
gpg: Firma correcta de "Ruediger Pluem <rpluem@apache.org>"

● ¡Firma digital verificada! Podemos instalar el software


con seguridad.
http://www.gnupg.org/

25
Irontec – Curso Apache

Instalación – Código fuente

● Instalamos todo lo necesario para la compilación con


un solo comando:
apt-get install build-essential

● Descomprimimos el código fuente:


tar -xzf httpd-2.2.11.tar.gz

26
Irontec – Curso Apache

Instalación – Código fuente

● La instalación de apache se hace en 3 pasos:


● Seleccionar los módulos a incluir en el servidor
● Crear una configuración para el sistema operativo
$ ./configure
● Compilar el ejecutable
$ make
# make install
● Ponemos en marcha el servidor:
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start

Intentaremos arrancarlo como usuario NO ROOT.


¿Podemos?

27
Irontec – Curso Apache

Instalación – Código fuente

● El script configure nos permite varias opciones.


● -- prefix=/directorio/destino
Es el directorio en el que Apache va a ser instalado. Apache
tiene que ser configurado para el directorio que se especifique
para que funcione correctamente.
● --enable-module
Utilizado para compilar un módulo estático.
● --disable-module
Para no compilar un módulo
● --enable-module=shared
Para compilar el modulo como dinámico (DSO)

IMPORTANTE: no avisa si el modulo indicado existe o28


Irontec – Curso Apache

Instalación – Código fuente

● Los módulos estáticos son módulos incluidos en


tiempo de compilación:
● Para conocer que módulos hay incluidos en el binario
compilado podemos hacerlo con:
– Instalado desde las fuentes:
/usr/local/apache2/bin/httpd -l
Compiled-in modules:
http_core.c
mod_env.c
[...]
– Instalado en Debian desde apt:
/usr/sbin/apache2 -l
Compiled-in modules:
core.c
mod_so.c

29
Irontec – Curso Apache

Instalación – Código fuente

● Módulos dinámicos son los cargados externamente:


● Apache permite cargar módulos independientes al
archivo binario httpd.
● Es posible gracias al módulo mod_so, que debe
compilarse estáticamente en el núcleo de Apache y
a la herramienta apxs (APache eXtenSion).
● Apache necesita ser compilado previamente para
poder utilizar la herramienta apxs.
● Para usa este mecanismo el sistema también debe
soportar DSO.
¿Cómo compilamos Apache con soporte DSO?

30
Irontec – Curso Apache

Instalación – Código fuente

● Módulos cargados externamente vs incluídos:


● Si compilamos estáticamente los módulos, cada
cambio en ellos hay que recompilar apache!
● Ventajas DSO
– El servidor es mucho más flexible
– Permite tener diferentes instancias de servidor con una
única instalación de Apache
– Más sencillo el prototipado y desarrollo de módulos
● Desventajas DSO
– El servidor es un 20% más lento en el arranque
– El servidor en un 5% más lento en funcionamiento

31
Irontec – Curso Apache

Instalación – Código fuente

● Ya tenemos Apache compilado y con posibilidad de


añadir módulos dinámicamente. Vamos a compilar
PHP5 como DSO :)

32
Irontec – Curso Apache

Instalación – Código fuente

● PHP es un lenguaje de programación interpretado,


diseñado originalmente para la creación de páginas
web dinámicas. Es usado principalmente en
interpretación del lado del servidor (server-side
scripting).
● Es un lenguaje multiplataforma.
● Capacidad de conexión con la mayoría de los
manejadores de base de datos.
● ES LIBRE.

http://es.wikipedia.org/wiki/.php

33
Irontec – Curso Apache

Instalación – Código fuente

● Descargamos el código fuente de PHP:

wget http://es2.php.net/get/php-5.2.9.tar.gz/from/es.php.net/mirror
● Comprobamos que la suma de integridad es correcta
con md5sum:

$md5sum php-5.2.9.tar.gz 98b647561dc664adefe296106056cf11 php-


5.2.9.tar.gz
● Configuramos la compilación como módulo de
Apache, con soporte Mysql y GD.

./configure –-with-apxs2=/usr/local/apache2/bin/apxs \
--with-mysql \
--with-gd

34
Irontec – Curso Apache

Instalación – Código fuente

● Cargamos el módulo en Apache


LoadModule php5_module modules/libphp5.so

● Configuramos Apache para que interprete las


páginas .php mediante el módulo de PHP
AddType application/x-httpd-php .php

● Configuramos Apache para que busque páginas .php


índice en caso de no solicitar una.
DirectoryIndex index.html index.php

35
Irontec – Curso Apache

Instalación – Código fuente

● Para probar el funcionamiento de PHP tenemos que


crear una página en... ¡PHP! :D
● En el directorio raíz de Apache creamos un fichero
llamado info.php con el siguiente contenido:
<? phpinfo() ?>
● Accedemos a la página desde nuestro navegador.

36
Irontec – Curso Apache

Instalación – Paquetes binarios

● Podemos instalar Apache2, PHP, etc. desde apt-get


apt-get install apache2 php5 php5-mysql php5-gd

● Apache estará automáticamente configurado con


soporte php5.

● En el futuro si deseamos actualizar (por algún parche de


seguridad) podremos hacerlo mediante apt-get sin
tener que recompilar nada.

● Apt-get es más sencillo y simple, pero compilar es más


universal.
37
Irontec – Curso Apache

Instalación – Paquetes binarios

● Apache instalado por apt-get viene preparado para


trabajar con módulos DSO. Dispone de sus propios
comandos para habilitar y deshabilitar módulos.
● Habilitar módulo SSL
a2enmod ssl
● Deshabilitar módulo SSL
a2dismod ssl
● Con cada cambio es necesario reiniciar Apache.
● Los modulos disponibles están en:
/etc/apache2/mods-available
● Los módulos habilitados están en:
/etc/apache2/mods-enabled
38
Irontec – Curso Apache

Configuración

● Apache dispone de cientos de directivas de


configuración.
● No nos podemos saber todas de memoria, por lo que
tendremos que memorizar una URL :)
http://httpd.apache.org/docs/2.2/mod/directives.html
● El fichero de configuración general se encuentra en:
/etc/apache2/apache2.conf
● Existe un VirtualHost por defecto.
/etc/apache2/sites-available/default
● Los puertos de escucha se configuran en:
/etc/apache2/ports.conf

39
Irontec – Curso Apache

Configuración

● .htaccess es un archivo de texto oculto que contiene


una serie de directivas para el servidor Apache.

● Cada vez que visitamos una web, Apache busca en la


carpeta accedida el fichero .htaccess para cargar las
opciones que en el se encuentran.

● Es posible deshabilitar el uso de estas directivas con:


AllowOverride None
● Y habilitarlas mediante:
AllowOverride All

40
Irontec – Curso Apache

Configuración

● En general los archivos .htaccess no se deben usar


nunca, a menos que no se tenga acceso al archivo
de configuración del servidor (Ej: ISP)
● Se debe usar el contenedor <Directory>
● Razones:
– Eficiencia: Apache debe buscar ficheros .htaccess por
todo el arbol de directorios, en busca de herencias
– Seguridad: Se permite a los usuarios hacer cambios sobre
las directivas del servidor. Cambios sobre los que no se
tiene control.

41
Irontec – Curso Apache

Configuración

● Las distintas directivas solo pueden aplicarse en algunos


contextos, por lo que antes de aplicarlo es necesario
saber donde.

● Contextos de aplicación
– Servidor
– Host Virtual
– <Directory>,<Location>,<Files>,<Proxy>
– Fichero .htaccess

42
Irontec – Curso Apache

Configuración

● La directiva <directory> nos permite establecer una


configuración específica a un directorio del sistema de
ficheros.

<Directory /var/www/info/>
AllowOverride None
DirectoryIndex prueba.php
</Directory>

● Ahora cada vez que accedamos a http://ip/info nos aplicará la


configuración indicada en la directiva Directory anterior.

43
Irontec – Curso Apache

Configuración

● La directiva Allow/Deny nos permiten definir a quien


damos acceso a nuestra web:
Order Deny,Allow
Deny from all
Allow from 192.168.1.101
● Estas directivas deben ser aplicadas a nivel
<Directory> o mediante .htaccess
● El modulo encargado de darnos esta funcionalidad es:
mod_authz_host

44
Irontec – Curso Apache

Configuración

● Location es similar a Directory. En este caso Location


hace referencia a una URL, en lugar de una carpeta del
sistema de ficheros.
● Location no debe ser usado para establecer permisos a
nivel del sistema de ficheros, ya que una misma carpeta
puede ser accedida desde diferentes zonas.

<Location /info>
Deny from All
</Location>

45
Irontec – Curso Apache

Configuración

● La directiva Files nos permite establecer permisos a


nivel de ficheros mediante expresiones regulares.
● Usando esta directiva junto con la vista anteriormente,
es posible permitir acceso a ciertos ficheros a un
número limitado de usuarios.
● Ejemplo, no permitir el acceso a nadie a las imagenes
.jpg

<Files ~ "\.jpg$">
Deny from all
</Files>

46
Irontec – Curso Apache

Configuración

● Limit y LimitExcept nos permiten denegar en funcion


de la petición que se haga al servidor.
● Las peticiones validas son:
GET, POST, PUT, DELETE, CONNECT, OPTIONS, PATCH, PROPFIND,
PROPPATCH, MKCOL, COPY, MOVE, LOCK y UNLOCK
● Con Limit indicamos a que peticiones habilitar los
controles. Las peticiones no indicadas no se ven
afectadas.
● Con LimitExcept indicamos que peticiones no se ven
afectadas por los controles.
● LimitExcept != Limit
Denegad la descarga de páginas web a todo el
mundo excepto a mi :)
47
Irontec – Curso Apache

Configuración

● Redirect nos permite redirigir una petición a otra


página.
● De esta forma, si movemos un documento a otro lado,
es posible que los antiguos usuarios puedan seguir
accediendo al contenido.
Redirect /google http://google.es
● Si alguien accede a /google/prueba, se le reenviara a
google.es/prueba.
● Se pueden establecer distintos códigos de redirección:
301 Redirección permanente
302 Redirección temporal
303 El contenido a sido reemplazado
410 El contenido ya no existe
48
Irontec – Curso Apache

Configuración

● ErrorLog y CustomLog nos permiten definir donde y


como se guardarán los Logs de error y Acceso.

● Podemos guardar los logs en la carpeta que queramos,


siempre y cuando Apache tenga permisos para escribir
en ella.

● El formato del log es muy configurable, de forma que


podamos guardar solo aquellos datos que nos
interesen.

49
Irontec – Curso Apache

Configuración

● CustomLog tiene la siguiente sintaxis:


CustomLog logs/access_log "%h %l %u %t \"%r\" %>s %b"
● En primer lugar se indica la directiva, el fichero de
destino y entrecomillado el formato que tendrá.
● Para definir el formato se está haciendo uso de la
directiva LogFormat
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
● Cread el log de Acceso en /tmp/acceso con el siguiente
formato:
192.168.1.101 - [27/Feb/2009:15:10:04 +0100]
● Los logs de error se definen con ErrorLog.
● Cread el log de Error en /tmp/error con el formato
anterior.
50
Irontec – Curso Apache

Configuración

● En caso de disponer de un gran número de Servidores


Virtuales y si estos loggean en diferentes archivos puede
darse el caso que Apache se quede sin descriptores de
fichero.
● Son objetos que usan los programas para leer o escribir

un archivo, socket o dispositivo.


● Apache utiliza:

– 10 a 20 descriptores de fichero para uso interno


– 1 para cada archivo de error (ErrorLog)
– 1 para cada directiva de log distinta (CustomLog)
● El sistema operativo se encarga de limitar el número de
descriptores de fichero que puede abrir un programa
determinado.
51
Irontec – Curso Apache

Configuración

●El límite de Linux es de 1024 descriptores de fichero.


● Límites:

– Kernel: depende del SO. En Linux


– Hardware
– Software

# ulimit -n
1024

52
Irontec – Curso Apache

Configuración

● MaxClients nos permite definir el número máximo de


conexiones que pueden ser atentidas simultáneamente.
● El número a indicar dependerá de las características de
la máquina.
● A más peticiones simultaneas, mas necesidad de
memoria RAM.
MaxClients 100

53
Irontec – Curso Apache

Configuración

● Alias es como un enlace simbólico a nivel de Apache


● Nos permite crear enlaces para acceder a documentos
que no están en la raíz de Apache.
● Si hacemos un alias a un directorio externo de la raíz,
es necesario dar permisos de acceso a la misma.
Alias /tmp /tmp
<Directory /tmp>
Order allow,deny
Allow from all
</Directory>

54
Irontec – Curso Apache

Configuración

● Options nos permite especificar que características de


servidor Apache estan disponibles para el directorio en
cuestión.
<Directory /tmp>
Options Indexes FollowSymLinks
</Directory>
● Con dichas opciones nos mostrará el contenido de la
carpeta en el navegador y seguirá los enlaces.

http://httpd.apache.org/docs/2.2/mod/core.html#options

55
Irontec – Curso Apache

Configuración

● Cuando una carpeta tiene la opcion index podremos


navegar por el contenido y hacer click en lso ficheros.
● Las opciones de index se establecen con IndexOptions.

● Cambios para el index de tmp


– Los iconos deben ser enlaces
– No se debe mostrar la fecha de última modificación

56
Irontec – Curso Apache

Configuración

● Con LimitRequestBody especificamos el tamaño


máximo en bytes que se pueden especificar en una
petición.

● LimitRequestBody nos puede ayudar de varias


maneras:
– Defendiendonos ante posibles denegaciones de servicio.
– Limitando el tamaño de los fichero que un usuario puede
subir a nuestro servidor.

LimitRequestBody 102400

57
Irontec – Curso Apache

Configuración

● Listen nos permite especificar en que puertos va a


escuchar Apache las peticiones.
● Por defecto es 80 y 443 si se tiene https.
● También es posible especificar un puerto por cada
interfaz del sistema
Listen 192.170.2.1:80
Listen 192.170.2.5:8000

58
Irontec – Curso Apache

Autenticación de usuarios

● Es posible controlar el acceso al contenido del servidor


mediante usuario / contraseña
● El módulo encargado es mod_auth
● Generación de archivo de usuarios
# htpasswd -c /etc/apache2/passwd/.passwd miguel
New password:
Re-type new password:
Adding password for user miguel

miguel:YXP3FBeNjIHDs

# htpasswd -c /etc/apache2/passwd/.passwd iker


New password:
Re-type new password:
Adding password for user iker

miguel:YXP3FBeNjIHDs
iker:g1Zy7z22KMSko

59
Irontec – Curso Apache

Autenticación de usuarios

● Solicitar al servidor que pida una contraseña


– En el archivo de configuración general (httpd.conf)
dentro de una sección <Directory>.
AuthType Basic
AuthName "Acceso Restringido"
AuthUserFile /etc/apache2/passwd/.passwd
Require user miguel

– A través del archivo .htaccess


● Igual que el modo anterior
● Es necesario habilitar las directivas de autenticación

AllowOverride AuthConfig

60
Irontec – Curso Apache

Autenticación de usuarios

● Generación de archivo de grupos de usuarios


/etc/apache2/.group

Grupo1: miguel iker

● Configuración de Apache para soporte de validación


por grupos de usuarios
AuthType Basic
AuthName "Acceso solo para grupos"
AuthUserFile /etc/apache2/passwd/.passwd
AuthGroupFile /etc/apache2/passwd/.group
Require group Grupo1

61
Irontec – Curso Apache

Autenticación de usuarios

● Valores que puede adoptar la directriz Require:


Require user <nombre_de_usuario>
Require group <nombre_de_grupo>
Require valid-user

● Inconvenientes
– Cada acceso al directorio protegido hace una nueva
comprobación del nombre de usuario y contraseña. Esto
carga de forma considerable el servidor.
– Es útil para número reducido de usuarios.

62
Irontec – Curso Apache

VirtualHost

● El uso de VirtualHost nos permite alojar diferentes


páginas con sus dominios en un solo servidor Apache.
● Los VirtualHost pueden estar basados en IP (que cada
sitio web tenga su ip) o basados en nombre (con una
sola IP sitios web con diferentes nombres).
● Imaginemos un proveedor de Hosting que tiene 1000
clientes en una máquina.
● El fichero que hemos estado modificando todo el rato,
000-default, es un virtual host :)

63
Irontec – Curso Apache

VirtualHost

● Cada VirtualHost se puede configurar por separado,


teniendo sus logs, directivas y restricciones propias.
● Dichos ficheros de configuración se guardan en
/etc/apache2/sites-available
● Los comandos para Inicar o Parar un VirtualHost es:
# a2ensite mihost
Enabling site mihost.
# a2dissite mihost
Site mihost disabled.

64
Irontec – Curso Apache

VirtualHost

● Para configurar un VirtualHost por nombre son


necesarias estas directivas:
– <VirtualHost>
– NameVirtualHost
– ServerName
– ServerAlias
– DocumentRoot

65
Irontec – Curso Apache

VirtualHost

● NameVirtualHost indica a Apache que vamos a utilizar


VirtualHosts basados en nombre.
● Se debe especificar al principio del fichero.
NameVirtualHost 192.168.1.103:80
● Se puede especificar cualquier IP que tengamos en el
sistema así como cualquier puerto.
● La IP se puede sustituir por un *

66
Irontec – Curso Apache

VirtualHost

● Una vez que hemos indicado que nuestros hosts serán


por nombre hay que configurar los VirtualHosts.
● <VirtualHost> nos permite indicar en que IP y puerto
está escuchando Apache las peticiones. Por lo general
será:
<VirtualHost 192.168.1.103:80>
● La directiva debe cerrarse con:
</VirtualHost>
● Cuando trabajamos con nombres, es recomendable
especificar la IP para evitar mensajes de Warning

67
Irontec – Curso Apache

VirtualHost
● Dentro de <VirtualHost> es donde llevaremos a cabo
todas las configuraciones necesarias. Como mínimo se
recomienda:
ServerName mihost.com
ServerAlias www.mihost.com
DocumentRoot /var/www/info
● Con ServerName indicamos el nombre del VirtualHost.
Por lo tanto, cuando entremos con Firefox en
mihost.com estaremos accediendo realmente al
VirtualHost
● ServerAlias nos permite añadir distintos Alias al
dominio.
● DocumenRoot nos ayudará a especificar donde se
68
Irontec – Curso Apache

VirtualHost

● Configurar un VirtualHost para mihost.com tal y como


se ha indicado antes
● Crear un index.php que me muestre la información de
PHP
● Los logs se deben guardar en /var/log/mihost
● Si yo entro a mihost.com me debe dejar acceder sin
problemas. Pero todos los demas, al intentar entrar, les
debe pedir un usuario y contraseña para acceder

69
Irontec – Curso Apache

Certificados

70
Irontec – Curso Apache

Certificados

● Introducción a la Criptografía
● Criptografía simétrica o de Clave Privada
● Criptografía de Clave Pública
● Resúmenes o Hashes
● Firmas Digitales
● Certificados

71
Irontec – Curso Apache

Certificados

●Se encargan de asociar una clave pública con la


identidad real de un individuo, servidor u otra
entidad, conocido como sujecto.
● Como Nombre Distinguido se conoce a una serie

de información que distingue a una entidad:


– Nombre Común
– Compañía
– Departamento
– Ciudad
– Provincia
– País
72
Irontec – Curso Apache

Certificados

● Certificados
● Información que contiene un Certificado
– Sujeto:
● Nombre Distinguido
● Clave Pública
– Expendedor
● Nombre Distinguido
● Firma Digital
– Periodo de Validez
– Información Administrativa
● Versión
● Número de Serie
73
Irontec – Curso Apache

Certificados

● Autoridades de Certificación
● Son las entidades encargadas de expedir y
gestionar los certificados
● Hay 3 tipos de Autoridades de Certificación
– Oficiales y reconocidas por las herramientas más
comunes
● Verisign, Thawte, Comodo...
– Oficiales y no reconocidas por las herramientas más
comunes
● Izenpe, Ceres, Camerfirma...
– No Oficiales
● Nosotros mismos ;-)
74
Irontec – Curso Apache

Certificados
● Consideraciones Previas
● La longitud de las claves privadas para SSL
debe ser 512 o 1024 bits (recomendado), para
compatibilidad con todos los navegadores.
● Una secuencia SSL se compone de:
– Negociación de cifrado a utilizar durante el
intercambio de datos (criptografía simétrica)
– Establecer e intercambiar una clave de sesión
– Puede autenticar al servidor por parte del cliente
– Puede autenticar al cliente por parte del servidor

75
Irontec – Curso Apache

Certificados
● Creación de Certificados
● Generar la clave privada del servidor
– Cifrada con criptografía simétrica por seguridad
# openssl genrsa -des3 -out apache.key
1024
– Sin cifrar
# openssl genrsa -out apache.key 1024
● Securizar la clave para que nadie tenga acceso
# chmod 400 apache.key
● Generar la Solicitud de Certificado (CSR)
# openssl req -new -key apache.key -out dominio.csr
● Las Solicitudes de Certificado se realizan para un
dominio concreto.

76
Irontec – Curso Apache

Certificados

● El siguiente paso consiste en hacer llegar la


Solicitud de Certificado (CSR) a una Autoridad
de Certificación (CA) para generar el Certificado
(CRT)

77
Irontec – Curso Apache

Certificados
● Creación de Certificados
● Autoridad de Certificación Oficial
– Se envía, habitualmente, a través de un formulario
web a la empresa certificadora
– Validan si se ha pagado, en caso de ser necesario.
– Validan nuestras credenciales.
– Generan el Certificado (.crt), con su clave
privada y con la Solicitud de Certificado
remitida por nosotros.

– Remiten el certificado y las instrucciones de


instalación vía mail
– La Solicitud de Certificado ya no es válida.

78
Irontec – Curso Apache

Certificados

● Creación de Certificados
● Certificados auto-firmados
–Generar la Clave Privada de nuestra propia CA
# openssl genrsa -out mica.key 1024
– Generar el Certificado auto-firmado
# openssl req -new -x509 -nodes -sha1 -days 365 -key
mica.key -out dominio.crt

79
Irontec – Curso Apache

Certificados

● Instalar Certificados en Apache


● Es necesario que Apache disponga del módulo
mod_ssl compilado. mod_ssl ofrece soporte
SSL v2/v3 y TLS v1.
● Cuando EEUU relajó las restricciones en materia
de exportación criptográfica, mod_ssl entró a
formar parte de Apache (Apache 2).
● Si no lo tiene:
– Compilado estáticamente:
./configure –-enable-ssl
make && make install
– Como DSO:
a2enmod ssl
80
Irontec – Curso Apache

Certificados

● Instalar Certificados en Apache


● Configurar un host virtual para alojar el dominio
con certificado auto-firmado

<VirtualHost IP:443>

Listen 443
DocumentRoot /var/www

SSLEngine on
SSLCertificateFile /usr/local/apache2/ssl/mica.crt
SSLCertificateKeyFile /usr/local/apache2/ssl/mica.key

</VirtualHost>
81
Irontec – Curso Apache

Certificados

● Conversión de Formatos
● El formato por defecto de OpenSSL es PEM.
● Algunas aplicaciones (IExplorer) requieren el
formato DER
● Algunas aplicaciones (Mozilla) requieren el
formato PKCS#12
● Para transformar de formato PEM a DER:
# openssl x509 -in certificado.pem -out certificado.der -outform
DER
● Para transformar de formato PEM a PKCS#12
# openssl pkcs12 -export -clcerts -in certificado.pem -inkey
server.key -out certificado.p12

82
Irontec – Curso Apache

Certificado cliente

● Nuestros usuarios pueden autenticarse con un usuario y


clave o mediante un certificado cliente
● Estos certificados se crean a partir de una CA
● Solo podrá entrar si tiene instalado un certificado
válido:
– No caducado
– No revocado
● Vamos a proteger nuestro VirtualHost, de forma que
solo sea accesible mediante un certificado válido

83
Irontec – Curso Apache

Certificado cliente

● Primero generamos la CA de la que colgarán todos los


certificados cliente
● Generamos un certificado cliente, para ello creamos un
fichero de configuración específico que indicara que
tipo de certificado es:
cat config.txt 
basicConstraints = critical,CA:FALSE
extendedKeyUsage = clientAuth
● Generamos un certificado cliente:
openssl genrsa ­out miguelangel.key 2048
openssl req ­new ­key private/miguelangel.key ­out 
miguelangel.csr
openssl x509 ­CA CA.crt ­CAkey private/CA.key ­req ­in 
miguelangel.csr ­set_serial 2 ­days 3650 ­extfile 
config.txt ­sha1 ­out miguelangel.crt
84
Irontec – Curso Apache

Certificado cliente

● Lo exportamos a un formato aceptable por los


navegadores, por ejemplo p12:
openssl pkcs12 ­export ­in miguelangel.crt ­inkey 
private/miguelangel.key ­certfile CA.crt ­out 
miguelangel.p12
● Configuramos Apache:
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/test1.crt
SSLCertificateKeyFile /etc/apache2/ssl/test1.key
SSLCACertificateFile /etc/ssl/clientes/CA.crt
SSLVerifyClient require 

85
Irontec – Curso Apache

Certificado cliente

● Cuando no queremos seguir dando acceso a un usuario


debemos revocar su certificado
openssl ca ­revoke miguelangel.crt
● Una vez revocado, generamos/actualizamos el fichero
de revocados que leerá apache
openssl ca ­gencrl ­out revovados.crl
● Configuramos Apache para que lo lea :)
SSLCARevocationFile /etc/apache2/ssl/revocados.crl

86
Irontec – Curso Apache

Balanceo de carga

87
Irontec – Curso Apache

Balanceo de carga

● Cuando el servidor no es capaz de responder a las


peticiones es necesario aumentar de alguna manera su
rendimiento
– Más memoria RAM
– Más procesador
– Discos SSD
– RAID con write cache (con bateria)
– Proxy Inverso
– Comprar más servidores

88
Irontec – Curso Apache

Balanceo de carga

● A veces es más sencillo comprar un servidor extra que


ampliar el que ya tenemos
● Podemos tener diferentes servidores y repartir la carga
entre ellos
● Esto se conoce como balanceo de carga
● Existe mucho software distinto para montar un
balanceo
● Nosotros vamos a ver:
– GLB
– Keepalived
– DNS
– mod_proxy_balancer
89
Irontec – Curso Apache

Balanceo de carga

● El servicio de balanceo de carga se monta en un


servidor externo. Este a su vez debería estar en HA
● Un buen balanceo de carga debería comprobar el
estado de los servidores
● Si un servidor se cae, debería sacarlo de la cola
● De la misma manera, si vuelve a estar Online se
volvería a añadir a la cola

90
Irontec – Curso Apache

Balanceo de carga

GLB (Galera Load Balancer)

91
Irontec – Curso Apache

Balanceo de carga

● Galera Load Balance


http://www.codership.com/en/downloads/glb
● Fácil de implantar y utilizar, sigue la filosofía KISS ;)
– Multithread
– Conexiones distribuidas proporcionalmente
– De momento en Beta
● Para usarlo, hay que compilarlo:
– wget
– tar -xzf
– ./configure
– make && make install

92
Irontec – Curso Apache

Balanceo de carga

punisher@shyris:~$ glbd ­­help
Usage:
  glbd [OPTIONS] LISTEN_ADDRESS [DESTINATION_LIST]
OPTIONS:
  ­­help                  this help message.
  ­­daemon                run as a daemon.
  ­­fifo <fifo name>      name of the FIFO file for control.
  ­­control [HOST:]PORT   listen for control requests on this address.
  ­­threads N             number of working threads (connection pools).
  ­­source_tracking       turn on source tracking: route connections from 
one
                          source to the same destination.
  ­­verbose               turn on verbose reporting.
  ­­version               print program version.
LISTEN_ADDRESS:
  [IP:]PORT               where to listen for incoming TCP connections.
DESTINATION_LIST:
  [H1[:P1[:W1]]] [H2[:P2[:W2]]]...  ­ a space­separated list of destinations
                          in the form address:port:weight.

93
Irontec – Curso Apache

Balanceo de carga

● Haciendo uso de los pesos es posible enviar más


peticiones al servidor más potente
● Si los pesos son iguales, se distribuirán las conexiones
● Si deseamos conexiones persistentes (mismo origen
mismo servidor destino) debemos habilitar el
source_tracking
● Bueno como solución de implantación rápida y sencilla

94
Irontec – Curso Apache

Balanceo de carga

punisher@shyris:~$ glbd ­­verbose 10.10.0.123:8081 
10.10.0.211:80:1 10.10.0.204:80
Incoming address:     10.10.0.123:8080 , control FIFO: 
/tmp/glbd.fifo
Control  address:  none
Number of threads: 1, source tracking: OFF, verbose: ON, 
daemon: NO
Destinations: 2
   0:     10.10.0.211:80   , w: 1.000
   1:     10.10.0.204:1    , w: 1.000
Router:
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
        Address       :   weight   usage   conns
    10.10.0.211:80    :    1.000   0.000     0
    10.10.0.204:1     :    1.000   0.000     0
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
Destinations: 2, total connections: 0

95
Irontec – Curso Apache

Balanceo de carga

   INFO:glb_pool.c:323: Pool 0: added connection, (total pool connections: 1)
   INFO:glb_listener.c:77: Accepted connection from     10.10.0.123:45370 
   INFO:glb_listener.c:79: to     10.10.0.204:80   

   INFO:glb_pool.c:323: Pool 0: added connection, (total pool connections: 2)
   INFO:glb_listener.c:77: Accepted connection from     10.10.0.123:45371 
   INFO:glb_listener.c:79: to     10.10.0.211:80   

   INFO:glb_pool.c:323: Pool 0: added connection, (total pool connections: 2)
   INFO:glb_listener.c:77: Accepted connection from     10.10.0.123:45372 
   INFO:glb_listener.c:79: to     10.10.0.204:80   

   INFO:glb_pool.c:323: Pool 0: added connection, (total pool connections: 2)
   INFO:glb_listener.c:77: Accepted connection from     10.10.0.123:45373 
   INFO:glb_listener.c:79: to     10.10.0.211:80   

96
Irontec – Curso Apache

Balanceo de carga

LVS

97
Irontec – Curso Apache

Balanceo de carga

● LVS es el estándar de facto para crear balanceadores de


carga en Linux
● Actúa como si fuese un router de capa 4
● El “director” recibe las conexiones y las reenvía al
destino
● Se pueden añadir y eliminar servidores reales en
tiempo real sin tener que reiniciar el servicio

98
Irontec – Curso Apache

Balanceo de carga

apt­get install ipvsadm
● La configuración es en consola, mediante el comando
ipvsadm
● Es posible guardar las reglas en un fichero de
configuración para que se carguen al arranque
● LVS puede actuar como master o backup, de forma
que podemos tener HA en el balanceador
● Cuando un master se cae, los estados de las conexiones
pasan al Backup

99
Irontec – Curso Apache

Balanceo de carga

● Creamos un servidor virtual:


debian1:~# ipvsadm ­A ­t 10.10.0.10:80 ­p 600
● Añadimos un servidor real:
debian1:~# ipvsadm ­a ­t 10.10.0.10:80 ­r 10.10.0.144 ­m
● Añadimos otro servidor rea:
debian1:~# ipvsadm ­a ­t 10.10.0.10:80 ­r 10.10.0.144 ­m

Listamos los componentes de nuestro balanceador de


carga:
debian1:~# ipvsadm ­l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  ­> RemoteAddress:Port           Forward Weight ActiveConn 
InActConn
TCP  10.10.0.10:www wlc persistent 600
  ­> 10.10.0.145:www              Masq    1      0          0   
      
  ­> 10.10.0.144:www              Masq    1      0          0   
       100
Irontec – Curso Apache

Balanceo de carga

● Si un servidor real se cae somos nosotros los que


tenemos que sacar el servidor manualmente
● Existe software que hace uso de LVS para el balanceo y
nos ofrece además herramientas para la auto detección
de las caídas
● Si un servidor se cae, debería sacarlo de las colas sin
necesidad de intervención manual
● Debería comprobar tanto la conexión correcta al
puerto como el contenido descargado de la web (con
un hash)

101
Irontec – Curso Apache

Balanceo de carga

Keepalived

102
Irontec – Curso Apache

Balanceo de carga

● Keepalived nos proporciona todo (y bastantes cosas


más) usando por debajo LVS
http://www.keepalived.org/
– Balanceo de carga
– Balanceo de LVS
– Gestión de del pool de servidores
– Control del contenido
– HA en el director (con VRRP)
– Notificaciones por mail

103
Irontec – Curso Apache

Balanceo de carga

DNS

104
Irontec – Curso Apache

Balanceo de carga

● Otra forma típica de balanceo es mediante DNS


● Se deben configurar diferentes registros A para un
único dominio
● El servidor DNS nos dará un registro u otro en Round
Robin
http://es.wikipedia.org/wiki/Planificaci%C3%B3n_Round-robin
● Se usa activamente en servidores de correo electrónico

105
Irontec – Curso Apache

Balanceo de carga

● Ventajas
– Facil de implementar
– No necesita de un servidor extra
– Rápido (consulta DNS)
● Desventajas
– No controla la caída de un servidor
– Las caches de los DNS pueden hacer que no sea tan
Round Robin
– No puedes establecer pesos

106
Irontec – Curso Apache

Balanceo de carga

mod_proxy_balancer

107
Irontec – Curso Apache

Balanceo de carga

● Es un módulo dependiente de mod_proxy que nos


permite configurar un balanceo de carga nativo en
Apache
● Permite 3 tipos de algoritmos para el balanceo:
– Dependiente de las peticiones (se reparten las peticiones
equitativamente)
– Dependiente del tráfico (se reparte en función de los bytes
que ha transmitido cada servidor)
– Dependiente de la carga (se envían las conexiones al que
menos peticiones tenga en ese momento)

108
Irontec – Curso Apache

Balanceo de carga

● Primero debemos añadir unos módulos:


– a2enmod proxy
– a2enmod proxy_balancer
– a2enmod proxy_http
● Y luego configuramos Apache:
<Proxy balancer://supercluster>
BalancerMember http://10.10.0.210:80
BalancerMember http://10.10.0.214:80
Order deny,allow
Allow from all

</Proxy>
ProxyPass /test balancer://supercluster

109
Irontec – Curso Apache

Balanceo de carga

● Estadísticas:

110
Irontec – Curso Apache

Balanceo de carga

<Location /balancer­manager>
SetHandler balancer­manager

Order deny,allow
Allow from all

</Location>

111
Irontec – Curso Apache

Módulos

MÓDULOS

112
Irontec – Curso Apache

Mod_Cache

● Mod_Cache nos permite cachear tanto el contenido


local como el accedido a través de proxy en el servidor
● El cacheo se puede hacer a disco duro o memoria
– mod_disk_cache
– mod_mem_cache
● Para activarlo:
a2enmod cache
a2enmod disk_cache
a2enmod mem_cache

113
Irontec – Curso Apache

Mod_Cache

CacheRoot /tmp/cache
CacheEnable disk /
CacheDirLevels 5
CacheDirLength 4
CacheMaxFileSize 64000
CacheDefaultExpire 86400

Habilitamos la cache en /tmp/cache, como máximo 5


subdirectorios con nombres de no más de 4 letras. El
tamaño máximo de fichero 64000 y expirará a los
86400 segundos

114
Irontec – Curso Apache

Mod_Cache

● CacheIgnoreCacheControl
Ingora las cabeceras no-cache o no-store, guardándo
los datos en caché
● CacheIgnoreHeaders
Podemos especificar una serie de cabeceras a ignorar.
Por ejemplo para prevenir que las cookies se guarden
en cache (Set-Cookie)
● CacheIgnoreNoLastMod
Si no dispone de “Last Modified” lo cachea igualmente.
Por defecto no se cachearian

115
Irontec – Curso Apache

Mod_Cache

● CacheSize
Tamaño global de la cache, importante poner un valor
normal que no nos deje sin espacio en el disco duro
● CacheMinFileSize
Tamaño mínimo que debe tener un fichero para poder
se cacheado
● CacheIgnoreURLSessionIdentifiers
No cacheamos las páginas que incluyan un
identificador de sesión

116
Irontec – Curso Apache

Mod_Cache

Manuales de Apache

http://httpd.apache.org/docs/2.2/mod/mod_cache.html
http://httpd.apache.org/docs/2.2/mod/mod_disk_cache.html
http://httpd.apache.org/docs/2.2/mod/mod_mem_cache.html

117
Irontec – Curso Apache

Mod_Deflate

● Mod_deflate permite comprimir los datos en el lado del


servidor y enviarselos al cliente
● Sirve para ahorrar ancho de banda, a costa de consumo
de CPU
SetOutputFilter DEFLATE
● Algunos navegadores no gestionan la compresión de
todos los elementos de una web, solamente TXT y
HTML
AddOutputFilterByType DEFLATE text/html
● Si sabemos de algun navegador con problemas, lo
podemos ignorar
BrowserMatch ^Mozilla/4 gzip-only-text/html
118
Irontec – Curso Apache

Mod_Rewrite

● Mod_Rewrite nos permite reescribir URLs en base a


unas reglas, basadas generalmente en expresiones
regulares
● Muy usadas para posicionamiento web
http://example.com/wiki/index.php?title=Page_title
http://example.com/wiki/Page_title
● Más info y ejemplos en la wikipedia:
http://en.wikipedia.org/wiki/Rewrite_engine

119
Irontec – Curso Apache

Mod_Rewrite

● Para activarlo:
– a2enmod rewrite
http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html
● Lo habilitamos:

– RewriteEngine On
● Y le indicamos donde realizar la reescritura (opcional)
– RewriteBase /vida
● Finalmente reescribimos
– RewriteRule ^index\.html$ home.hmtl

120
Irontec – Curso Apache

Mod_Rewrite

● Podemos poner unas condiciones para la ejecución de


las reglas con RewriteCond:
– RewriteCond %{HTTP_USER_AGENT} firefox [NC]
– RewriteRule ^/$ firefox.html
● Si se cumple la condición “HTTP_USER_AGENT
incluye la palabra firefox” se reenvía la petición a
firefox.html
● Con [NC] lo hacemos Case Insensitive
● Con [OR] podemos concatenar condiciones
● Vamos a hacer que todas las peticiones que no
sean https muestren un mensaje de error

121
Irontec – Curso Apache

Mod_Rewrite

RewriteCond %{HTTPS} !^on$ [NC]
RewriteRule . nossl.html

122
Irontec – Curso Apache

Mod_Rewrite

● RewriteRule también dispone de flags:


– [F] prohibe el acceso (403)
– [G] marca la URL como no existente (401)
– [L] aplica la regla y termina, no sigue aplicando las restantes
– [N] vuelve a empezar la reescritura desde el principio
– [NC] no importa mayúsculas/minúsculas
– [R] marca redirect (302)
– [S=num] ignora el siguiente número (num) de reglas
● Denegadme el acceso a mi IP, solamente si
uso Firefox

123
Irontec – Curso Apache

Mod_Rewrite

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} firefox [NC]
RewriteCond %{REMOTE_ADDR} ^10\.10\.0\.123
RewriteRule (.*) $1 [F]

124
Irontec – Curso Apache

Mod_Rewrite

● En RewriteCond y RewriteRule podemos meter una


expresión regular entre paréntesis, que luego se
sustituirán
– RewriteCond (.*) → %1
– RewriteRule (.*) → $1
● Enviar el subdominio como parámetro de búsqueda a
google
● Por ejemplo:
– http://dominio.com/google/vida
– http://www.google.es/search?q=vida

125
Irontec – Curso Apache

Mod_Rewrite

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/google/(.*)
RewriteRule . http://www.google.es/search?q=%1

126
Irontec – Curso Apache

Mod_Rewrite

● Un poco de SEO
● http://voz-ip.com
● La URL incluye el nombre del producto, simplemente
para posicionamiento
● Todo lo que hay antes del guión no importa a nivel
interno, solamente el identificativo final
● Crear una regla de Rewrite de forma que:
– dskndnpsn3-hola.html
– 324234n-vida.html
● Sin importar lo que tengamos antes del guión,
nos muestre el documento indicado.

127
Irontec – Curso Apache

Mod_Rewrite

RewriteRule .*­(.*) $1

128
Irontec – Curso Apache

Mod_Rewrite

● A veces únicamente deseamos que la página de login


esté cifrada y no así el resto de la web
– Ahorro de recursos
– Navegación más rápida
– …
● Mediante Mod_Rewrite podemos hacer que una
página en particular tenga que ser mostrada en https
mientras que las demás no
● ¿Como lo haríamos?

129
Irontec – Curso Apache

Mod_Rewrite

<Directory /var/www/inicio>
RewriteEngine On
RewriteCond %{REQUEST_URI} ^(.*)login\.html
RewriteCond %{HTTPS} !^on$ [NC]
RewriteRule . https://%{HTTP_HOST}%{REQUEST_URI}  [L]
RewriteCond %{REQUEST_URI} !^(.*)login\.html
RewriteCond %{HTTPS} ^on$ [NC]
RewriteRule . http://%{HTTP_HOST}%{REQUEST_URI}  [L]
</Directory>

130
Irontec – Curso Apache

Mod_Security

Mod Security

131
Irontec – Curso Apache

Mod_Security

● Mod_Security es un módulo de seguridad que hace de


barrera entre la red y el servidor Apache
● Tiene un funcionamiento basado en reglas, parecido a
un antivirus o IDS
http://www.modsecurity.org/index.html
● Detecta DDOS, XSS, troyanos, violaciones de
protocolo, etc.
● En Debian Lenny no tenemos paquetes
http://etc.inittab.org/~agi/debian/libapache-mod-security2
● Descargamos:
– libapache-mod-security_2.5.9-1_i386.deb
– mod-security-common_2.5.9-1_all.deb
132
Irontec – Curso Apache

Mod_Security

● Una vez instalado el paquete ya tenemos el módulo


instalado y habilitado, solo hay que reiniciar
● Ahora toca instalar las reglas:
http://www.modsecurity.org/download/modsecurity-core-rules_2.5-1.6.1.tar.gz
● Movemos los .conf a /etc/apache2/modsecurity2
● Añadimos al final de apache2:
– include /etc/apache2/modsecurity2/
● Creamos en siguiente enlace simbólico:
– ln ­s /var/log/apache2 /etc/apache2/logs

133
Irontec – Curso Apache

Mod_Security

● Podemos crear nuestras propias reglas de prueba


● Por ejemplo, vamos a filtrar a los que navegan con
Chrome :)
SecRule REQUEST_HEADERS:User­Agent "Chrome" "log,drop"
● Hará una búsqueda en las cabeceras, usando una
expresión regular
● Si concuerda, dropea la conexión y lo logea
● Se pueden descargar más reglas de:
http://www.owasp.org/index.php/Category:OWASP_ModSecurity_Core_Rule_Set_Project
● Cuidado, ya que algunas pueden no ser compatibles

134
Irontec – Curso Apache

Mod_Security

● Vamos a probar cuanto de seguro es :)


● Nikto2 es una herramienta de testo de la seguridad de
un servidor web
● Comprueba configuraciones y hace más de 7000 teses
● Si Mod_Security está habilitado, el log error.log debería
crecer muchisimo ;)
./nikto.pl ­h 10.10.0.147 

135
Irontec – Curso Apache

Mod_Proxy

● Mod_Proxy puede funcionar en dos modos, reenvío y


proxy inverso
– El modo de reenvío (forward proxy) es el típico. El servidor
está entre el cliente y el servidor destino. Vamos, ¡el
proxy de toda la vida!
– En el modo inverso actúa como un servidor web. El cliente
accede al servidor y este reenvía la petición a otro para
finalmente devolverle el contenido como si
originalmente fuese suyo
a2enmod proxy

136
Irontec – Curso Apache

Mod_Proxy

● Para habilitar Apache como Proxy creamos un


VirtualHost en el puerto 8080
● Ponemos las siguientes directivas:

<VirtualHost *:8080>
   ProxyRequests On
   ProxyVia On
<Proxy *>
   Order deny,allow
   Allow from all
</Proxy>
</VirtualHost>

● Tenemos que configurar nuestro navegador para que use el


Proxy

137
Irontec – Curso Apache

Mod_Proxy

● Otro VirtualHost

<VirtualHost *:81>
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /ma/b/ http://miguelangelnieto.net/
ProxyPassReverse /ma/b/ http://miguelangelnieto.net/
</VirtualHost>

● Cuidado con las barras!

138
Irontec – Curso Apache

Optimización del servidor

● La optimización de Apache, al igual que cualquier otro


servicio, depende de:
– Tarjeta de red rápida
– Discos rápidos
– Mucha RAM
– Mucha CPU
● Contra más, mejor
● Como ya hemos dicho, cuando un servidor no da para
más y no se puede ampliar, la solución es montar otro y
repartir carga

139
Irontec – Curso Apache

Optimización del servidor

● La regla principal en linux es:


– NO SWAP
● Si el sistema se queda sin RAM y necesita más recursos
usará la SWAP, lo cual degradará el rendimiento hasta
hacerlo inusable
● Para no llegar a ese extremo hay que poner un valor
normal en MaxClients
● MaxClients=RAM/AVG(apache)

140
Irontec – Curso Apache

Optimización del servidor

● Muchas consultas DNS pueden ralentizar las respuestas


● A poder ser en Deny y Allow se debe poner direcciones
IP
● HostnameLookups está por defecto Off. Si se requiere
para un directorio en especial se puede habilitar, pero
no se recomienda hacerlo globalmente

141
Irontec – Curso Apache

Optimización del servidor

● Los ficheros .htaccess se leen en cada acceso


● Si tienes muchos repartidos por múltiples directorios el
rendimiento de acceso a disco se puede degradar con
muchas lecturas no secuenciales
● AllowOverride None
● El contenido del .htaccess lo podemos mover al
VirtualHost y hacer un reload
● De esa forma se lee una vez y se ejecuta infinito

142
Irontec – Curso Apache

Optimización del servidor

● Si tenemos enlaces simbólicos y la directiva


SymLinksIfOwnerMatch habilitada, el sistema tendrá
que hacer dos llamadas al sistema cada vez que quiera
acceder a el
● Si quiere seguridad, no tienes más remedio que tenerlo
activado
● Si quieres rendimiento, tendrás que evitar dicho
chequeo
● Puedes programar una tarea que cada 5 minutos
compruebe los enlaces y sus propietarios
● Será más rápido que hacerlo por cada conexión

143
Irontec – Curso Apache

Optimización del servidor

● Las páginas web deberían estar en la misma máquina


donde corre Apache
● Tener los datos montados por NFS o Samba solo añade
OverHead y latencia a las peticiones
● Dependiendo del sistema puede funcionar mejor (o no)
con:
– EnableSendfile Off (envío de ficheros)
– EnableMMap Off (lectura del contenido de ficheros)

144
Irontec – Curso Apache

Optimización del servidor

● Ningún software es perfecto :)


● Para evitar memory leaks se recomienda reiniciar los
distintos threads
● Se puede matar un thread cuando haya cumplido su
objetivo en la vida, responder a un número de
peticiones
● 0 significa infinito
● Depende del hardware y del tipo de web que
tengamos, será mejor un valor u otro, no hay regla fija
Setting MaxRequestsPerChild to a non­
zero value limits the amount of memory 
that process can consume by 
(accidental) memory leakage.
145
Irontec – Curso Apache

Optimización del servidor

● Con KeepAlive, los threads se quedan esperando más


peticiones de la conexión abierta
● Por defecto espera 15 segundos
● Debes elegir entre ahorro de ancho de banda y
recursos del sistema
KeepAliveTimeout
● Una conexión se queda abierta para bajar el contenido
de la web, por lo tanto esperas superiores a 5 segundos
suelen carecer de sentido

146
Irontec – Curso Apache

Optimización del servidor

● Apache soporta varios modos de concurrencia


diferentes dependiendo del sistema operativo
● Se llaman MPM (multi-process Modules)
● En unix tenemos:
– Worker: múltiples procesos con múltiples threads cada
uno. Cada thread gestiona una conexión. Consume
menos memoria y es recomendable para webs con alto
tráfico
– Prefork: múltiples procesos con un único thread. Cada
thread gestiona una conexión. Usa más memoria, tiene
prácticamente el mismo rendimiento, pero es
recomendable usarlo para trabajar con módulos No-
Thread-Safe (PHP5 de Debian requiere este modo)

147
Irontec – Curso Apache

AB

● Apache provee una herramienta para el testeo de


rendimiento, Apache Benchmark (ab).
● Nos permite simular miles de accesos
● Las opciones más importantes son:
● -n número de conexiones a realizar
● -c número de conexiónes concurrentes
● -k usar keepalive

148
Irontec – Curso Apache

AB

ab -n 1000 -c 10 http://mihost.com/awstats
● Realiza 1000 conexiones, 10 concurrentes a la URL
indicada:
Concurrency Level: 10
Time taken for tests: 0.331 seconds
Complete requests: 1000
Failed requests: 0

● Comparad los datos haciendo solicitudes normales y


con keep alive.
● Poned valores exagerados y comprobad como se
consumen los recursos del sistema.

149

S-ar putea să vă placă și