apache

Activar la compresión gzip en Apache (httpd)

Gzip en el servidos de aplicaciones httpd de Aapche

Introducción

En este artículo os voy a explicar como servir comprimido el contenido a través del servidor de aplicaciones httpd de Apache. La gente no suele tener esto en cuenta y la verdad es que haciendo esto podemos hacer que nuestras páginas web carguen mucho más rápido ya que el tamaño que se va a tener que descargar el navegador será mucho menor.

Configuración

Lo primero que tendremos que hacer es elegir que tipo de contenido queremos servir comprimido (normalmente es todo el que sea texto). Una lista de los tipos de contenido que se suele comprimir es el siguiente:

  • text/plain
  • text/html
  • text/xml
  • text/gml
  • text/css
  • application/json
  • application/xml
  • application/xhtml+xml
  • application/rss+xml
  • application/javascript
  • application/x-javascript

Como no siempre apache sabe el tipo de contenido que tiene un fichero, también podremos indicarle que ficheros servir comprimidos a través de sus extensiones. Estas suelen ser: html, xml, gml, js, css.

Para servir comprimido estos tipos de contenido, lo que tendremos que hacer es cargar el módulo deflate y activarlo. Luego tendremos que indicar que tipo de contenido y que archivos (a través de su extensión) queremos comprimir. Para ello tendremos que añadir las siguientes líneas a nuestro fichero de configuración de Apache httpd.conf:

LoadModule deflate_module modules/mod_deflate.so

<IfModule mod_deflate.c>

    # Activamos la compresión
    SetOutputFilter DEFLATE

    # Indicamos los tipos de contenido a comprimir
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE text/gml
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE application/json
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE application/xhtml+xml
    AddOutputFilterByType DEFLATE application/rss+xml
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/x-javascript

    # Indicamos las extensiones de los ficheros a comprimir
    <files *.html>
        SetOutputFilter DEFLATE
    </files>
    <files *.xml>
        SetOutputFilter DEFLATE
    </files>
    <files *.gml>
        SetOutputFilter DEFLATE
    </files>
    <files *.json>
        SetOutputFilter DEFLATE
    </files>
    <files *.js>
        SetOutputFilter DEFLATE
    </files>
    <files *.css>
        SetOutputFilter DEFLATE
    </files>

</IfModule>

Además tendremos que tener en cuenta, que si estamos usando la versión 2.4 del servidor de Apache httpd, tenemos que cargar también el módulo filter con la siguiente línea:

LoadModule filter_module modules/mod_filter.so

Por último tendremos que reiniciar el servicio para que cargue la nueva configuración. Si estamos en Windows desde el panel de control de los servicios o si estamos en Linux con el siguiente comando:

>> sudo service apache2 restart

Si estáis en linux y queréis comprobar si una url se esta sirviendo comprimida, podéis hacerlo ejecutando el siguiente comando (acordaros de sustituir la url).

>> wget --no-cache --header="accept-encoding: gzip" -S TU_URL 2>&1 | grep "Content-Encoding"

Si se ha devuelto comprimida, al ejecutar el comando os indicará: "Content-Encoding: gzip"

temas: 

Instalar el servidor Apache Httpd de 64 bits en Windows

Apache httpd de 64 bits

Introducción

Apache no provee una versión para windows de 64 bits, pero como el código es libre cualquiera puede bajárselo y compilarlo para 64 bits. Pero esto implica un esfuerzo que a muchos nos echa para atrás. Por suerte hay comunidades por internet que hacen este paso y nos ofrecen la descarga de los binarios. Una de ellas es la web The Apache Haus, otra es Apache Lounge.

Instalación

Lo primero que tenemos que hacer es bajarnos el apache de 64 bits de su página de descarga http://www.apachehaus.com/cgi-bin/download.plx. Una vez lo hemos descargado solo tenemos que descomprimirlo en la carpeta donde lo queramos tener. Una vez hecho esto, solo nos queda instalarlo como servicio con el siguiente comando:

>> cd CARPETA_APACHE\bin
>> httpd.exe -k install

Ya lo podemos empezar a usar.

Desinstalación

Para desinstalarlo solo tenemos que deshacer los pasos que hemos seguido en la parte de la instalación. Primero desinstalamos el servicio:

>> cd CARPETA_APACHE\bin
>> httpd.exe -k uninstall

Y por último borramos la carpeta que descomprimimos.

Problemas

Librería MSVCR100.dll

Puede darse el caso de que cuando arranquemos el apache, nos aparezca una ventana con el mensaje de error "Error al iniciar la aplicación porque no se encontró MSVCR100.dll. La reinstalación de la aplicación puede solucionar el problema".

Solución

Para solucionar esto tendremos que instalar el componente "Microsoft Visual C++ 2010 Redistributable Package" de Windows. Lo podemos descargar de los siguientes enlaces:

temas: 

Conectar un Apache con un oc4j con mod_jk

Balancear con apache a un oc4j

Introducción

Mod_jk es un módulo de Apache que nos permite conectar el Apache con otros servidores (tomcat, oc4j) a través del protocolo ajp13. Aunque Oc4j tiene un modulo para Apache llamado mod_oc4j, yo no he conseguido que me funcione con un OC4J Standalone y un Apache Genérico (Sin utilizar el que traen alguans versiones de Oc4j). Para balancear contra servidores de oc4j tendremos que seguir los pasoso descritos en la guía de balancear tomcats con apache, pero en vez de hacer los pasos de configurar el tomcat, tendremos que hacer los siguientes.

Configurar el OC4J

Lo primero será configurar el Oc4j para que escuche peticiones por el protocolo ajp13.

Vamos a crear un fichero ajp-web-site.xml en el que le indicaremos que escuche en un puerto con el protocolo ajp13 y las aplicaciones que podrá servir por este protocolo. Un ejemplo de este fichero para que escuche por el puerto 3000 con el protocolo ajp13 y que sirva una aplicación de nombre MiAplicacion con un módulo de nombre MiModulo y en un contexto MiContexto sería el siguiente (podemos poner tantas líneas web-app como módulos queramos que sirva):

<web-site xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://xmlns.oracle.com/oracleas/schema/web-site-10_0.xsd" port="3000" protocol="ajp13" display-name="OC4J 10g (10.1.3) Default Web Site" schema-major-version="10" schema-minor-version="0" >
    <default-web-app application="default" name="defaultWebApp" />
    <web-app application="MiAplicacion" name="MiModulo" load-on-startup="true" root="/MiContexto" />
</web-site>

Luego tendremos que ir a la carpeta C:\oc4j\j2ee\home\config y editar el fichero server.xml. En el tendremos que añadir la siguiente línea:

<application-servet ...>
    ...
    <web-site path="./ajp13-web-site.xml" />
    ...
</application-server>

Y por último reiniciamos el servidor.

Configurar el Apache

En nuestro archivo worker.properties tendremos que añadir la definición para el oc4j. Le indicamos el puerto, url y protocolo y lo añadimos a la lista de los workers:

worker.list=...,oracle
... 
worker.oracle.port=3000
worker.oracle.host=localhost
worker.oracle.type=ajp13

Luego tendremos que añadir al fichero de configuración del apache httpd.conf (por defecto estará en C:\Archivos de programa\Apache Software Fundation\Apache2.2\conf\) los parámetros del modulo modjk indicandole que aplicaciones queremos balancear al oc4j:

# Cargamos el módulo JK LoadModule jk_module modules/mod_jk.so
# Path to workers.properties
JkWorkersFile "C:/Archivos de programa/Apache Software Foundation/Apache2.2/conf/worker.properties"
# Path to jk logs
JkLogFile "C:/Archivos de programa/Apache Software Foundation/Apache2.2/logs/mod_jk.log"
# Jk log level debug/error/info
JkLogLevel info
# Jk log format
JkLogStampFormat "%a %b %d %H:%M:%S %Y "
# JkOptions for forwarding
#JkOptions +ForwardKeySize +ForwardURICompat -ForwardDiretories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
# Aplicaciones que estan en el OC4J
JkMount /MIAPLICACION* oracle

Instalar phpLDAPadmin

phpLDAPadmin

Introducción

phpLDAPadmin es un gestor web para un servidor de ldap.

Instalación

Manual

La instalación es sencilla. Hay que bajarselo, descomprimirlo, ponerlo ene l apache y configurar los datos para que acceda a nuestro servidor de ldap:

>> wget http://nfsi.dl.sourceforge.net/sourceforge/phpldapadmin/phpldapadmin-1.1.0.7.tar.gz
>> tar -zxvf phpldapadmin-1.1.0.7.tar.gz
>> sudo cp -R phpldapadmin-1.1.0.7 /var/www/html/phpldapadmin
>> sudo cp /var/www/html/phpldapadmin/config/config.php.example /var/www/html/phpldapadmin/config/config.php

Automatica

Necesitaremos tener un servidor web con php y un servidor mysql con una base de datos para el phpldapadmin. Para instalarlo en ubuntu, desde los repositorios:

>> sudo aptitude install phpldapadmin

Indicarle los datos de conexión

Editamos el fichero y nos aseguramos que rellenamos los siguientes campos que son los minimos:

$i=0;
$ldapservers = new LDAPServers;
...
$ldapservers->SetValue($i,'server','name','NOMBRE_SERVIDOR');
...
$ldapservers->SetValue($i,'server','host','IP_DEL_SERVIDOR_DONDE_ESTA_EL_LDAP');
...
$ldapservers->SetValue($i,'server','port','389');
...
$ldapservers->SetValue($i,'server','base',array('RAIZ_BASE_DE_NUESTRO_LDAP'));

Ya tendria que funcionar el phpLDAPadmin.

Configuración

Cambiar la forma de autentificarse

Por defecto la forma que usa para autentificarse con el servidor de ldap es manual (tenemos que introducir un usuario y una contraseña), pero podemos ponerla en automática. Para usar una u otra tendremos que tener el fichero de configuración como nos indica en cada apartado:

Automáticamente

Para que se conecte automáticamente al servidor de ldap, con un usuario cn=root,dc=example,c=es y contraseña passuser, tendremos que usar las siguientes líneas en el fichero de configuración (/var/www/html/phpldapadmin/config/config.php):

$ldapservers->SetValue($i,'server','auth_type','config');
$ldapservers->SetValue($i,'login','dn','cn=root,dc=example,c=es');
$ldapservers->SetValue($i,'login','pass','passuser');
$ldapservers->SetValue($i,'server','tls',false);

Manual

Para que nos pida que introduzcamos un usuario y clave del ldap para conectarnos al servidor, usaremos las siguientes líneas (recalcar que las variables dn y pass de login, tenemos que dejarlas vacías) en el fichero de configuración (/var/www/html/phpldapadmin/config/config.php):

$ldapservers->SetValue($i,'server','auth_type','cookie');
$ldapservers->SetValue($i,'login','dn','');
$ldapservers->SetValue($i,'login','pass','');
$ldapservers->SetValue($i,'server','tls',false);
$config->custom->session['blowfish'] = "cadena";

La cadena blowfish puede ser cualquier cadena (se usa para encriptar la cookie).

 Solo queremos que muestre unos determinados campos

Si lo que queremos es que no muestre todos los atributos tendremos que editar el fichero /var/www/html/phpldapadmin/config/config.php y buscar el vector hidden_attrs, descomentarlo si está comentado y poner los campos que no queramos que se muestren. Por ejemplo: Si no queremos que se muestren los campos uidNumber, gidNumber, homeDirectory y objectClass tendremos que poner la siguiente línea:

$hidden_attrs = array(
   'uidNumber','gidNumber', 'homeDirectory', 'objectClass');

Guardamos el fichero y ya esta.

Cambiar los nombres que se muestran de cada parametro

Alguien que no tiene conocimientos de ldap cuando vea que hay que rellenar el parámetro l (ciudad) puede que no sepa que significa. Phpldapadmin tiene la posibilidad de definir el nombre que se lista para cada parámetro. Para ello tendremos que editar el fichero /var/www/html/phpldapadmin/config/config.php y añadir en el vector friendly_attrs los campos que queremos renombrar en la salida. Por ejemplo: si queremos que los campos l, st y sn aparezcan como Ciudad, Localidad y Apellidos tendremos que añadir als siguientes líneas:

$friendly_attrs = array();

$friendly_attrs['l']                      = 'Ciudad';
$friendly_attrs['st']                     = 'Localidad';
$friendly_attrs['sn']                     = 'Apellidos';

Solo nos quedará guardar los cambios y cerrar el archivo.

Definir el orden en que se listan los parametros

Hay una opcion (attrs_display_order) para definir el orden en el que se muestran los parámetros. Por ejemplo: si queremos que primero nos pregunte por el nombre, luego por los apellidos y por último el nombre completo, tendríamos que añadir la siguiente variable al archivo /var/www/html/phpldapadmin/config/config.php:

  $attrs_display_order = array(
   'sn',
   'cn',
   'displayName'
  );

Los parámetros que no pongamos en este vector  se mostraran despues de los que hallamos indiado y en orden alfabético. Guardamos el fichero para mantener los cambios.

Parametros de solo lectura

Si queremosq eu ciertos parametros no se puedan modificar, podemos hacerlo con el parámetro read_only_attrs. Por ejemplo: si queremos que el campo dni no se pueda modificar, tendremos que añadir el siguiente vector al archivo /var/www/html/phpldapadmin/config/config.php:

$read_only_attrs = array( 'dni' );

Guardamos y listo.

Entrar solo con el nombre de un parámetro único

Por defecto para autentificarnos en phpLDAPadmin tenemos que escribir el dn de nuestro usuario. El dn es el que identifica a un objeto y tiene una forma parecida a este ejemplo uid=manolo,ou=personas,o=tuempresa,c=es. Poner toda esta cadena para autentificarte no es nada comodo, pero podemos sustituir el nombre que el usuario utiliza para autentificarse por uno que sea único y más sencillo de recordar, por ejemplo el uid. Para ello tendremos que editar el fichero /var/www/html/phpldapadmin/config/config.php y descomentar y modificar la siguiente línea:

$ldapservers->SetValue($i,'login','attr','uid');

Guardamos los cambios y ya esta.

Elegir el idioma

Para indicar que lo muestre en español (es) tendremos que editar el fichero /var/www/html/phpldapadmin/config/config.php y editar la siguiente línea:

$config->custom->appearance['language'] = 'es';

Otros idiomas serian: 'ct', 'de', 'en', 'es', 'fr', 'it', 'nl', y 'ru'.

Activar el log

Para activar el log y que escriba en un fichero /tmp/pla_debug.log tendremos que editar el fichero /var/www/html/phpldapadmin/config/config.php y añadir o descomentar estas líneas:

$config->custom->debug['level'] = 255;
$config->custom->debug['syslog'] = true;
$config->custom->debug['file'] = '/tmp/pla_debug.log';

Errores

Límite de memoria de php bajo

Al instalarlo, cuando accedemos a la url nos aparece el siguiente mensaje de error:

Memory Limit low.
Your php memory limit is low - currently 16M

Solución

Tendremos que editar el fichero /etc/php.ini y buscar la siguiente línea:

memory_limit = 16M

Cambiamos el 16 por 32. Guardamos el fichero y reiniciamos el apache:

>> sudo /etc/init.d/httpd restart

Balanceador de tomcats con apache

Hacer un balanceador de tomcats con apache

A veces no nos basta con un servidor para poder responder a todas las peticiones que nos llegan y necesitamos tener varios servidores. Pero esto tiene que ser invisible para los usuarios y por eso el punto de entrada es el mismo. Para ello podemos usar un balanceador que según le vayan llegando peticiones de los usaurios les ira redireccionando a un servidor u otro.

Para tener varios servidores con Tomctas instalados y un Apache que redireccione las peticiones a estos, tendremos que seguir los siguientes pasos:

  • Descargamos el instalador del apache (http://httpd.apache.org/).
  • Instalamos el apache.
  • Nos bajamos el conector jk de aqui (http://tomcat.apache.org/download-connectors.cgi): Vamos a Binary Releases, luego a win32 (si tenemos un windows de 32 bits) y por último entramos en jk-1.2.28. Hay una versión para los apache 2.0.x y otra para los apache 2.2.x, bajad la correspondiente al vuestro (para el apache 2.2.x sería mod_jk-1.2.28-httpd-2.2.3.so).
  • Paramos el apache.
  • Movemos el fichero del conector jk a la carpeta de modulos del apache (por defecto es C:\Archivos de programa\Apache Software Fundation\Apache2.2\modules) y lo renombramos como mod_jk.so.
  • Ahora tendremos que editar el fichero de configuración httpd.conf (por defecto estará en C:\Archivos de programa\Apache Software Fundation\Apache2.2\conf\) y añadir la siguiente línea en la zona donde se cargan los demás módulos:
LoadModule jk_module modules/mod_jk.so
  • Crearemos el fichero workers.properies con la definición de los tomcats y del tipo de balanceador. Por ejmplo, imaginemos que tenemos dos tomcats en la misma máquina (localhost), uno con el conector de AJP/1.3 en el puerto 8009 y otro en el puerto 8019 y que queremos usar un balanceador lb. Entonces tendremos el siguiente fichero de configuración:
workers.tomcat_home=C:/tomcat-5.5.20
workers.java_home=C:/jdk1.5.0_03
 
worker.list=balancer
 
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactor=1
 
worker.worker2.port=8019
worker.worker2.host=localhost
worker.worker2.type=ajp13
worker.worker2.lbfactor=1
 
worker.balancer.type=lb
worker.balancer.balance_workers=worker1,worker2
worker.balancer.method=B
  • En el archivo httpd.conf (por defecto estará en C:\Archivos de programa\Apache Software Fundation\Apache2.2\conf\) tendremos que configurar unos parametros del conector jk y pondremos las siguientes líneas en las que indicaremos donde escribir los logs, donde esta el fichero que define los workers y alguna cosa mas:
# Path to workers.properties
JkWorkersFile C:/Archivos de programa/Apache Software Fundation/Apache2.2/conf/workers.properties
 
# Path to jk logs
JkLogFile C:/Archivos de programa/Apache Software Fundation/Apache2.2/mod_jk.log
 
# Jk log level [debug/error/info]
JkLogLevel info
 
# Jk log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
 
# JkOptions for forwarding
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
 
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
  • Después de las líneas anteriores, en el fichero httpd.conf (por defecto estará en C:\Archivos de programa\Apache Software Fundation\Apache2.2\conf\) tendremos que indicar los path que queremos que se redireccionen a los tomcats y a cuales queremos que se redireccionen. Solo podremos direccionar explícitamente a los que esten puestos en la línea worker.list del workers.properties. Si queremos redireccionar a alguno que este dentro del balanceador, tendremos que ponerlos en esta línea también: worker.list=worker1,worker2,balancer. Por ejemplo, para que la url http://www.prueba.es/aplicacion sea redireccionada a algunos tomcats definidos en el archivo workers.properties, tendremos que poner alguna de las siguientes líneas dependiendo de a que lo queremos redireccionar (pondremos tantas líneas como sean necesarias):
# Para que envie al tomcat definido como worker1
JkMount /aplicacion worker1
 
# Para que envie a los tomcats definidos como worker1 y worker2
JkMount /aplicacion worker1 worker2
 
# Si queremos que lo envíe a los tomcats definidos en el balanceador
JkMount /aplicacion balancer

Usar Ldap para la autentificación en Apache

Apache y ldap

Alguna vez abréis tenido que proteger alguna carpeta del apache con un nombre de usuario y contraseña. Recordarlos luego puede ser un caos, pero hoy en dia existe el ldap, y podremos usar nuestras cuentas de ldap para acceder a estas carpetas. Vamos a necesitar tener instalado ldap, apache y los modulos de apache mod_ldap y mod_authz_ldap.

Lo primero que tendremos que hacer es activar los modulos en el apache (reiniciaremos el apache para que tengan efectos los cambios):

>> sudo a2enmod ldap
>> sudo a2enmod authz_ldap
>> sudo /etc/init.d/apache2 restart

Tendremos que asegurarnos de que esté activa la opcion del apache AllowOverride o si no queremos que esté activa para todas carpetas activarlo solo para la que queremos proteger (Por ejemplo para /var/www/html/carpeta):

<Directory "/var/www/html/carpeta">
    # Activamos para que use .htaccess
    AllowOverride All
</Directory>

Una vez tengamos todo lo qeu necesitamos vamos a lo que importa. Tendremos que ir al directorio que queramos proteger con la autentificación de apache y crearemos un archivo llamado .htaccess y añadiremos el siguiente contenído (para un ldap instalado en la misma máquina del apache 127.0.0.1 y con una raiz o=organizacion,c=es y que se logeen usando el uid):

order deny,allow
deny from all
# localhost
allow from  127.0.0.1
AuthName "Te tienes que autentificar con los usuarios de ldap."
AuthType Basic
AuthBasicProvider ldap
AuthzLDAPAuthoritative off
AuthLDAPURL ldap://127.0.0.1/o=organizacion,c=es?uid
require valid-user
Satisfy any

Esta configuración dejará el acceso a las peticiones desde la misma máquina en la que esta el apache y si se accede desde otra ip se requiere de un usuario que este en el ldap. No es la única manera, ya que podemos decir que deje acceso a los usuarios ldap de un grupo determinado, un usuario específico y muchas cosas mas.

Os recuerdo que estos y mas datos actualizados los podréis encontrar en mi wiki.

Tuve algunos problemas que os pongo a continuación con sus respectivas soluciones:

  • El fichero de .htaccess no tiene efecto, pongas lo que pongas el apache lo ignora.

Solución: Por seguridad puede ser que el apache no permita hacerle nada al fichero .htaccess. Tendremos que editar la configuración del apache y decirle, por ejemplo, que a la carpeta que queramos (en nuestro caso /var/www/html/carpeta) permita al .htaccess hacer cosas (None (por defecto), Limit o All), en nuestro caso le daremos todos los permisos.

    • Cuando nos pide el usuario y contraseña del ldap y se la ponemos no nos deja entrar. En el fichero /var/log/httpd/error_log nos encontramos la siguiente línea:
    [Thu Nov 20 13:33:40 2008] [error] [client 215.154.142.25] access to /index.php failed, reason: verification of user id 'usuario' not configured

    Solución: Falta de añadir la siguiente línea al fichero .htaccess:

    AuthBasicProvider ldap
    • Nos encontramos el siguiente mensaje de error en los logs:
      [Thu Nov 20 13:38:51 2008] [warn] [client 155.210.155.148] [3243] auth_ldap authenticate: user prodrig authentication failed; URI /mediawiki/index.php/Portada [LDAP: ldap_simple_bind_s() failed][Can't contact LDAP server]

      Solución: Puede que el ldap este parado. Para encenderlo:

      >> /etc/init.d/ldap start