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

Apache avanzado

  • 1.
    Apache Miguel Ángel Nieto<miguelangel@irontec.com> Irontec – Internet y Sistemas sobre GNU/Linux
  • 2.
    Irontec – CursoApache 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
  • 3.
    Irontec – CursoApache Protocolo HTTP ● Elementos: – Cliente=user agent: web browser, spider, wget, curl,... – Servidor – Intermediarios: Proxy, gateway, túnel 3
  • 4.
    Irontec – CursoApache 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
  • 5.
    Irontec – CursoApache 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
  • 6.
    Irontec – CursoApache 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
  • 7.
    Irontec – CursoApache 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
  • 8.
    Irontec – CursoApache 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
  • 9.
    Irontec – CursoApache 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
  • 10.
    Irontec – CursoApache 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
  • 11.
    Irontec – CursoApache 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
  • 12.
    Irontec – CursoApache 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
  • 13.
    Irontec – CursoApache 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
  • 14.
    Irontec – CursoApache 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
  • 15.
    Irontec – CursoApache 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
  • 16.
    Irontec – CursoApache 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
  • 17.
    Irontec – CursoApache 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
  • 18.
    Irontec – CursoApache Introducción 18
  • 19.
    Irontec – CursoApache Instalación ● Código fuente ● Paquete binario para la distribución Debian GNU/Linux ¿Ventajas y desventajas de cada uno? 19
  • 20.
    Irontec – CursoApache 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
  • 21.
    Irontec – CursoApache 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
  • 22.
    Irontec – CursoApache 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
  • 23.
    Irontec – CursoApache 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
  • 24.
    Irontec – CursoApache 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
  • 25.
    Irontec – CursoApache 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
  • 26.
    Irontec – CursoApache 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
  • 27.
    Irontec – CursoApache 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
  • 28.
    Irontec – CursoApache 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
  • 29.
    Irontec – CursoApache 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
  • 30.
    Irontec – CursoApache 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
  • 31.
    Irontec – CursoApache 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
  • 32.
    Irontec – CursoApache 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
  • 33.
    Irontec – CursoApache 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
  • 34.
    Irontec – CursoApache 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
  • 35.
    Irontec – CursoApache 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
  • 36.
    Irontec – CursoApache 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
  • 37.
    Irontec – CursoApache 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
  • 38.
    Irontec – CursoApache 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
  • 39.
    Irontec – CursoApache 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
  • 40.
    Irontec – CursoApache 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
  • 41.
    Irontec – CursoApache 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
  • 42.
    Irontec – CursoApache 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
  • 43.
    Irontec – CursoApache 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
  • 44.
    Irontec – CursoApache 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
  • 45.
    Irontec – CursoApache 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
  • 46.
    Irontec – CursoApache 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
  • 47.
    Irontec – CursoApache 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
  • 48.
    Irontec – CursoApache 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
  • 49.
    Irontec – CursoApache 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
  • 50.
    Irontec – CursoApache 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
  • 51.
    Irontec – CursoApache 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
  • 52.
    Irontec – CursoApache 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
  • 53.
    Irontec – CursoApache 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
  • 54.
    Irontec – CursoApache 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
  • 55.
    Irontec – CursoApache 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
  • 56.
    Irontec – CursoApache 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
  • 57.
    Irontec – CursoApache 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
  • 58.
    Irontec – CursoApache 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
  • 59.
    Irontec – CursoApache 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
  • 60.
    Irontec – CursoApache 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
  • 61.
    Irontec – CursoApache 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
  • 62.
    Irontec – CursoApache 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
  • 63.
    Irontec – CursoApache 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
  • 64.
    Irontec – CursoApache 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
  • 65.
    Irontec – CursoApache VirtualHost ● Para configurar un VirtualHost por nombre son necesarias estas directivas: – <VirtualHost> – NameVirtualHost – ServerName – ServerAlias – DocumentRoot 65
  • 66.
    Irontec – CursoApache 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
  • 67.
    Irontec – CursoApache 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
  • 68.
    Irontec – CursoApache 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
  • 69.
    Irontec – CursoApache 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
  • 70.
    Irontec – CursoApache Certificados 70
  • 71.
    Irontec – CursoApache 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
  • 72.
    Irontec – CursoApache 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
  • 73.
    Irontec – CursoApache 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
  • 74.
    Irontec – CursoApache 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
  • 75.
    Irontec – CursoApache 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
  • 76.
    Irontec – CursoApache 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
  • 77.
    Irontec – CursoApache 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
  • 78.
    Irontec – CursoApache 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
  • 79.
    Irontec – CursoApache 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
  • 80.
    Irontec – CursoApache 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
  • 81.
    Irontec – CursoApache 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
  • 82.
    Irontec – CursoApache 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
  • 83.
    Irontec – CursoApache 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
  • 84.
    Irontec – CursoApache 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
  • 85.
    Irontec – CursoApache 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
  • 86.
    Irontec – CursoApache 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
  • 87.
    Irontec – CursoApache Balanceo de carga 87
  • 88.
    Irontec – CursoApache 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
  • 89.
    Irontec – CursoApache 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
  • 90.
    Irontec – CursoApache 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
  • 91.
    Irontec – CursoApache Balanceo de carga GLB (Galera Load Balancer) 91
  • 92.
    Irontec – CursoApache 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
  • 93.
    Irontec – CursoApache 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
  • 94.
    Irontec – CursoApache 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
  • 95.
    Irontec – CursoApache 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
  • 96.
    Irontec – CursoApache 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
  • 97.
    Irontec – CursoApache Balanceo de carga LVS 97
  • 98.
    Irontec – CursoApache 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
  • 99.
    Irontec – CursoApache 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
  • 100.
    Irontec – CursoApache 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
  • 101.
    Irontec – CursoApache 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
  • 102.
    Irontec – CursoApache Balanceo de carga Keepalived 102
  • 103.
    Irontec – CursoApache 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
  • 104.
    Irontec – CursoApache Balanceo de carga DNS 104
  • 105.
    Irontec – CursoApache 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
  • 106.
    Irontec – CursoApache 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
  • 107.
    Irontec – CursoApache Balanceo de carga mod_proxy_balancer 107
  • 108.
    Irontec – CursoApache 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
  • 109.
    Irontec – CursoApache 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
  • 110.
    Irontec – CursoApache Balanceo de carga ● Estadísticas: 110
  • 111.
    Irontec – CursoApache Balanceo de carga <Location /balancer­manager> SetHandler balancer­manager Order deny,allow Allow from all </Location> 111
  • 112.
    Irontec – CursoApache Módulos MÓDULOS 112
  • 113.
    Irontec – CursoApache 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
  • 114.
    Irontec – CursoApache 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
  • 115.
    Irontec – CursoApache 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
  • 116.
    Irontec – CursoApache 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
  • 117.
    Irontec – CursoApache 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
  • 118.
    Irontec – CursoApache 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
  • 119.
    Irontec – CursoApache 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
  • 120.
    Irontec – CursoApache 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
  • 121.
    Irontec – CursoApache 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
  • 122.
    Irontec – CursoApache Mod_Rewrite RewriteCond %{HTTPS} !^on$ [NC] RewriteRule . nossl.html 122
  • 123.
    Irontec – CursoApache 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
  • 124.
    Irontec – CursoApache Mod_Rewrite RewriteEngine On RewriteCond %{HTTP_USER_AGENT} firefox [NC] RewriteCond %{REMOTE_ADDR} ^10.10.0.123 RewriteRule (.*) $1 [F] 124
  • 125.
    Irontec – CursoApache 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
  • 126.
    Irontec – CursoApache Mod_Rewrite RewriteEngine On RewriteCond %{REQUEST_URI} ^/google/(.*) RewriteRule . http://www.google.es/search?q=%1 126
  • 127.
    Irontec – CursoApache 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
  • 128.
    Irontec – CursoApache Mod_Rewrite RewriteRule .*­(.*) $1 128
  • 129.
    Irontec – CursoApache 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
  • 130.
    Irontec – CursoApache 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
  • 131.
    Irontec – CursoApache Mod_Security Mod Security 131
  • 132.
    Irontec – CursoApache 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
  • 133.
    Irontec – CursoApache 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
  • 134.
    Irontec – CursoApache 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
  • 135.
    Irontec – CursoApache 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
  • 136.
    Irontec – CursoApache 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
  • 137.
    Irontec – CursoApache 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
  • 138.
    Irontec – CursoApache 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
  • 139.
    Irontec – CursoApache 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
  • 140.
    Irontec – CursoApache 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
  • 141.
    Irontec – CursoApache 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
  • 142.
    Irontec – CursoApache 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
  • 143.
    Irontec – CursoApache 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
  • 144.
    Irontec – CursoApache 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
  • 145.
    Irontec – CursoApache 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
  • 146.
    Irontec – CursoApache 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
  • 147.
    Irontec – CursoApache 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
  • 148.
    Irontec – CursoApache 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
  • 149.
    Irontec – CursoApache 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