Configuración de Apache HTTP como proxy inverso
Exponer OpenKM directamente desde Tomcat puede ser arriesgado si necesita que la aplicación sea accesible desde Internet (por ejemplo https://issues.jboss.org/browse/JBAS-3861). Podría infectarse con PerlBot. El puerto 8080 puede estar bloqueado por un cortafuegos; por esta razón, se recomienda exponer su instalación de OpenKM a través del puerto web estándar 80. En los siguientes pasos se explica cómo configurar Apache para gestionar estas peticiones y reenviarlas al servidor de aplicaciones Tomcat mediante el protocolo AJP13.
De la documentación de Apache: el protocolo AJP13 está orientado a paquetes. Se eligió un formato binario en lugar del texto plano, más legible, presumiblemente por motivos de rendimiento. El servidor web se comunica con el contenedor de servlets mediante conexiones TCP. Para reducir el coste del proceso de creación de sockets, el servidor web intentará mantener conexiones TCP persistentes con el contenedor de servlets y reutilizar una conexión para varios ciclos de petición/respuesta.
IP interna frente a IP externa
Sección titulada «IP interna frente a IP externa»Se puede acceder a su OpenKM desde dos zonas distintas: Internet y la LAN. Esto significa que, para acceder a este servidor, necesita utilizar dos direcciones IP: una IP externa (Internet) y una IP interna (LAN).
La dirección IP interna (también conocida como “dirección IP local”) es la dirección asignada por el router de su red local y suele comenzar por 192.168.x.x. Estas direcciones IP solo pueden ser vistas por otros equipos de su red local (LAN) y no por ningún equipo conectado a una red externa como Internet.
Para llegar a Internet o a un equipo de otra red, a su equipo se le suele asignar una dirección IP externa, que puede utilizarse después para referirse al equipo en su red local.

En la imagen anterior hay tres equipos en la red local a los que el router ha asignado a cada uno su propia dirección IP interna. El ISP está conectado al router y le proporciona una dirección IP externa que le permite comunicarse con Internet. En Internet todo el mundo ve su dirección IP externa, pero cualquier información que llega desde el router se “convierte” de la dirección IP externa a la dirección IP interna.
Por tanto, si desea que su instalación de OpenKM sea accesible tanto desde la LAN como desde Internet, el truco consiste en configurar los equipos cliente para que resuelvan su IP interna (192.168.0.50) si están dentro de la LAN o la IP externa si están en Internet. Para resolver la IP de Internet (67.166.214.148), su equipo utiliza el DNS público. Por lo tanto, necesita configurar algún tipo de servidor DNS dentro de la LAN o modificar el fichero hosts de cada cliente para que resuelva a la IP interna.
Debian y Ubuntu
Sección titulada «Debian y Ubuntu»Lo primero es instalar el software Apache necesario. En Debian/Ubuntu puede instalar Apache con un único comando:
$ sudo apt-get install apache2Edite el fichero /etc/apache2/apache2.conf y configure un ServerName para evitar avisos durante el proceso de arranque de Apache:
$ vim /etc/apache2/apache2.confServerRoot "/etc/apache2"ServerName "your-domain.com"Habilite el módulo proxy:
$ sudo a2enmod proxy_ajp$ sudo a2enmod proxy_wstunnelCree el fichero de configuración /etc/apache2/sites-available/openkm.conf con este contenido:
$ vim /etc/apache2/sites-available/openkm.conf<VirtualHost *:80> ServerName openkm.your-domain.com RedirectMatch ^/$ /openkm # WebSocket support - needs proxy-wstunnel ProxyPass /openkm/frontend/webSocket ws://127.0.0.1:8080/openkm/frontend/webSocket ProxyPassReverse /openkm/frontend/webSocket ws://127.0.0.1:8080/openkm/frontend/webSocket ProxyPass /openkm ajp://127.0.0.1:8009/openkm keepalive=On ProxyPassReverse /openkm http://openkm.your-domain.com/openkm ErrorLog /var/log/apache2/openkm-error.log CustomLog /var/log/apache2/openkm-access.log combined</VirtualHost>El ServerName del VirtualHost debe ser distinto del ServerName de la configuración principal de Apache. Habilite esta configuración de sitio:
$ cd /etc/apache2/sites-available/$ sudo a2ensite openkm.confDebe habilitar explícitamente el acceso proxy editando el fichero de configuración de Apache /etc/apache2/mods-available/proxy.conf:
$ vim /etc/apache2/mods-available/proxy.conf<IfModule mod_proxy.c> #turning ProxyRequests on and allowing proxying from all may allow #spammers to use your proxy to send email.
ProxyRequests Off
<Proxy *> AddDefaultCharset off Order deny,allow Allow from all Deny from all #Allow from .example.com </Proxy>
# Enable/disable the handling of HTTP/1.1 "Via:" headers. # ("Full" adds the server version; "Block" removes all outgoing Via: headers) # Set to one of: Off | On | Full | Block
ProxyVia On</IfModule>Compruebe la configuración
Sección titulada «Compruebe la configuración»Reinicie Apache:
$ sudo /etc/init.d/apache2 restartCompruebe el acceso a su instalación de OpenKM en http://openkm.your-domain.com/.
Red Hat y CentOS
Sección titulada «Red Hat y CentOS»Utilice el gestor de aplicaciones yum para instalar Apache:
$ sudo yum install httpdHabilítelo en el arranque:
$ sudo chkconfig httpd --level 2345 onAhora cree el fichero /etc/httpd/conf.d/openkm.conf con este contenido:
$ vim /etc/httpd/conf.d/openkm.conf<VirtualHost *:80> ServerName openkm.your-domain.com RedirectMatch ^/$ /openkm # WebSocket support ProxyPass /openkm/frontend/webSocket ws://127.0.0.1:8080/openkm/frontend/webSocket ProxyPassReverse /openkm/frontend/webSocket ws://127.0.0.1:8080/openkm/frontend/webSocket ProxyPass /openkm ajp://127.0.0.1:8009/openkm keepalive=On ProxyPassReverse /openkm http://openkm.your-domain.com/openkm ErrorLog /var/log/httpd/openkm-error.log CustomLog /var/log/httpd/openkm-access.log combined</VirtualHost>Compruebe la configuración
Sección titulada «Compruebe la configuración»Reinicie Apache:
$ sudo /etc/init.d/httpd restartSi este comando falla, pruebe con:
$ sudo systemctl restart httpdCompruebe el acceso a su instalación de OpenKM en http://openkm.your-domain.com/.
Error Permission denied: proxy: AJP: attempt to connect
Sección titulada «Error Permission denied: proxy: AJP: attempt to connect»Si aparece en el registro un error como Permission denied: proxy: AJP: attempt to connect, resuélvalo ejecutando el siguiente comando:
$ /usr/sbin/setsebool httpd_can_network_connect 1Si funciona, haga que la configuración sea permanente para que se mantenga tras los reinicios:
$ /usr/sbin/setsebool -P httpd_can_network_connect 1Windows
Sección titulada «Windows»El servidor web Apache ya está incluido en la carpeta “extras”.
Edite el fichero de configuración C:\tomcat\extras\Apache\conf\httpd.conf y descomente la sección VirtualHost situada al final. Modifique el ServerName para que coincida con el nombre o la IP de su servidor**:**
<VirtualHost *:80> ServerName 192.168.10.230
ProxyPass /openkm ajp://localhost:8009/openkm ProxyPassReverse /openkm http://192.168.10.230/openkm
ErrorLog logs/openkm-error.log CustomLog logs/openkm-access.log combined</VirtualHost>Registre el servicio de Apache
Sección titulada «Registre el servicio de Apache»C:\> cd tomcat/extras/Apache/binC:\> httpd.exe -k installConfiguración SSL de Apache
Sección titulada «Configuración SSL de Apache»Establezca la ubicación de la configuración de OpenSSL:
C:\> set OPENSSL_CONF=C:\tomcat\extras\Apache\conf\openssl.cnfEjecute este comando para generar el certificado autofirmado:
C:\> cd c:/tomcat/extras/Apache/binC:\> openssl.exe req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ..\conf\server.key -out ..\conf\server.crtEste es un ejemplo de salida:
You are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blank.For some fields there will be a default value.If you enter '.', the field will be left blank.-----Country Name (2 letter code) [AU]:ESState or Province Name (full name) [Some-State]:AlicanteLocality Name (eg, city) []:AlicanteOrganization Name (eg, company) [Internet Widgits Pty Ltd]:OpenKMOrganizational Unit Name (eg, section) []:IT ManagerCommon Name (e.g. server FQDN or YOUR name) []:192.168.10.230Email Address []:noreply@openkm.comDescomente esta sección de la configuración:
# Secure (SSL/TLS) connectionsInclude conf/extra/httpd-ssl.confCambie el nombre de servidor predeterminado en conf/extras/httpd-ssl.conf para que coincida con su dominio o IP:
# General setup for the virtual hostDocumentRoot "${SRVROOT}/htdocs"ServerName 192.168.10.230:443ServerAdmin admin@example.comErrorLog "${SRVROOT}/logs/error.log"TransferLog "${SRVROOT}/logs/access.log"Resolución de problemas
Sección titulada «Resolución de problemas»Si ve un mensaje de error como:
Necesita habilitar estos módulos de Apache:
$ sudo a2enmod rewrite$ sudo a2enmod proxy_http$ sudo a2enmod headersSi ve errores como estos:
[proxy_ajp:error] [pid 27579:tid 140057021224704] (70007)The timeout specified has expired: AH01030: ajp_ilink_receive() can't receive header[proxy_ajp:error] [pid 27579:tid 140057021224704] [client xxx.xxx.xxx.xxx:60526] AH00992: ajp_read_header: ajp_ilink_receive failed[proxy_ajp:error] [pid 27579:tid 140057021224704] (70007)The timeout specified has expired: [client xxx.xxx.xxx.xxx:60526] AH00878: read response failed from 127.0.0.1:8009 (127.0.0.1)Es posible que Tomcat no esté aceptando conexiones AJP. Descomente estas líneas en $TOMCAT_HOME/conf/server.xml:
<!-- Define an AJP 1.3 Connector on port 8009 --><Connector protocol="AJP/1.3" address="127.0.0.1" port="8009" redirectPort="8443" secretRequired="false" />El parámetro secretRequired es importante y, si no está presente, debe añadirlo.
Más información en Apache Tomcat 8 Configuration Reference.