Ir al contenido

Configurando el Reverse-Proxy HTTP de Apache

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 firewall; 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 explicamos cómo configurar Apache para gestionar estas peticiones y reenviarlas al servidor de aplicaciones Tomcat usando el protocolo AJP13.

De la documentación de Apache: El protocolo AJP13 está orientado a paquetes. Presumiblemente se eligió un formato binario en lugar del texto plano, más legible, por razones de rendimiento. El servidor web se comunica con el contenedor de servlets a través de 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.

Su OpenKM puede accederse desde dos zonas distintas: Internet y LAN. Esto significa que para acceder a este servidor necesita usar dos IPs: IP externa (Internet) e IP interna (LAN).

La dirección IP interna (también conocida como “dirección IP local”) es la dirección asignada por su router de red local, que a menudo empieza por 192.168.x.x. Estas direcciones IP solo pueden verse desde otros equipos de su red local (LAN) y no desde ningún equipo conectado en una red externa como Internet.

Para llegar a Internet o a un equipo en otra red, su equipo suele tener asignada una dirección IP externa, que puede usarse para referirse al equipo dentro de su red local.

En la imagen de arriba, hay tres equipos en la red local a los que el router ha asignado 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 llegue del router se “convierte” de la dirección IP externa a la dirección IP interna.

Así que si quiere que su instalación de OpenKM sea accesible tanto desde la LAN como desde Internet, el truco aquí es 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 usa el DNS público. Por tanto, necesita configurar un servidor DNS dentro de la LAN o modificar el fichero hosts de cada cliente para que resuelva a la IP interna.

El primer paso es instalar el software Apache necesario. En Debian/Ubuntu puede instalar Apache con un único comando:

Ventana de terminal
$ sudo apt-get install apache2

Edite el fichero /etc/apache2/apache2.conf y configure un ServerName para evitar avisos en el proceso de arranque de Apache:

Ventana de terminal
$ vim /etc/apache2/apache2.conf
ServerRoot "/etc/apache2"
ServerName "localhost"

Active el módulo proxy:

Ventana de terminal
$ sudo a2enmod proxy_ajp
$ sudo a2enmod proxy_wstunnel

Cree el fichero de configuración /etc/apache2/sites-available/openkm.conf con este contenido:

Ventana de terminal
$ vim /etc/apache2/sites-available/openkm.conf
<VirtualHost *:80>
ServerName openkm.your-domain.com
RedirectMatch ^/$ /openkm # WebSocket support - needs proxy-wstunnel
ProxyPass /openkm/webSocket ws://127.0.0.1:8080/openkm/webSocket
ProxyPassReverse /openkm/webSocket ws://127.0.0.1:8080/openkm/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. Active esta configuración de sitio:

Ventana de terminal
$ cd /etc/apache2/sites-available/
$ sudo a2ensite openkm.conf

Tiene que activar explícitamente el acceso proxy editando el fichero de configuración de Apache /etc/apache2/mods-available/proxy.conf:

Ventana de terminal
$ 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>

Reinicie Apache:

Ventana de terminal
$ sudo /etc/init.d/apache2 restart

Compruebe el acceso a su instalación de OpenKM en http://openkm.your-domain.com/.

Use el gestor de aplicaciones yum para instalar Apache:

Ventana de terminal
$ sudo yum install httpd

Actívelo en el arranque:

Ventana de terminal
$ sudo chkconfig httpd --level 2345 on

Ahora cree el fichero /etc/httpd/conf.d/openkm.conf con este contenido:

Ventana de terminal
$ vim /etc/httpd/conf.d/openkm.conf
<VirtualHost *:80>
ServerName openkm.your-domain.com
RedirectMatch ^/$ /openkm # WebSocket support ProxyPass /openkm/webSocket ws://127.0.0.1:8080/openkm/webSocket ProxyPassReverse /openkm/webSocket ws://127.0.0.1:8080/openkm/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>

Reinicie Apache:

Ventana de terminal
$ sudo /etc/init.d/httpd restart

Si este comando falla, pruebe con:

Ventana de terminal
$ sudo systemctl restart httpd

Compruebe 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 un error como Permission denied: proxy: AJP: attempt to connect en el log, resuélvalo ejecutando el siguiente comando:

Ventana de terminal
$ /usr/sbin/setsebool httpd_can_network_connect 1

Si funciona, haga la configuración permanente para que persista tras reinicios:

Ventana de terminal
$ /usr/sbin/setsebool -P httpd_can_network_connect 1

Si ve un mensaje de error como:

Necesita activar estos módulos de Apache:

Ventana de terminal
$ sudo a2enmod rewrite
$ sudo a2enmod proxy_http
$ sudo a2enmod headers

Si ve errores como estos:

Ventana de terminal
[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 necesita añadirlo.

Más información en Apache Tomcat 8 Configuration Reference.