Ir al contenido
Otras versiones

Cargando…

Configurar Apache HTTP Reverse-Proxy

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 ser infectada por PerlBot. El puerto 8080 puede estar bloqueado por un cortafuegos; por este motivo es recomendable 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 que gestione estas peticiones y las reenvíe al servidor de aplicaciones Tomcat mediante 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 mediante conexiones TCP. Para reducir el costoso 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 múltiples 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 utilizar dos IP: la IP externa (Internet) y la IP interna (LAN).

La dirección IP interna (también conocida como “dirección IP local”) es la dirección que asigna el router de su red local y que suele empezar 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 de su red local.

En la imagen anterior hay tres equipos en la red local a cada uno de los cuales 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 todos ven su dirección IP externa, pero cualquier información que llega al 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 tanto, necesita configurar algún tipo de servidor DNS dentro de la LAN o modificar el archivo hosts de cada cliente para que resuelva a la IP interna.

Lo primero es instalar el software de Apache necesario. En Debian/Ubuntu puede instalar Apache con un solo comando:

Ventana de terminal
$ sudo apt-get install apache2

Edite el archivo llamado /etc/apache2/apache2.conf y configure un ServerName para evitar advertencias en el proceso de arranque de Apache:

Ventana de terminal
$ vim /etc/apache2/apache2.conf
ServerRoot "/etc/apache2"
ServerName "your-domain.com"

Habilite el módulo proxy:

Ventana de terminal
$ sudo a2enmod proxy_ajp
$ sudo a2enmod proxy_wstunnel

 Cree el archivo 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/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 diferente del ServerName de la configuración principal de Apache. Habilite esta configuración de sitio:

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

Debe habilitar explícitamente el acceso proxy editando el archivo 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 desde http://openkm.your-domain.com/.  

Utilice el gestor de aplicaciones yum para instalar Apache:

Ventana de terminal
$ sudo yum install httpd

Habilítelo en el arranque:

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

Ahora cree el archivo /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/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>

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 desde 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 el registro muestra un error como Permission denied: proxy: AJP: attempt to connect, para solucionarlo ejecute el siguiente comando:

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

Si funciona, haga el cambio permanente para que se conserve tras los reinicios:

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

El servidor web Apache ya está incluido en la carpeta “extras”.

Edite el archivo de configuración C:\tomcat\extras\Apache\conf\httpd.conf y descomente la sección VirtualHost del final. Modifique 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>
Ventana de terminal
C:\> cd tomcat/extras/Apache/bin
C:\> httpd.exe -k install

Establezca la ubicación de la configuración de OpenSSL:

Ventana de terminal
C:\> set OPENSSL_CONF=C:\tomcat\extras\Apache\conf\openssl.cnf

Ejecute este comando para generar el certificado autofirmado:

Ventana de terminal
C:\> cd c:/tomcat/extras/Apache/bin
C:\> openssl.exe req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ..\conf\server.key -out ..\conf\server.crt

Este es un ejemplo de salida:

Ventana de terminal
You are about to be asked to enter information that will be incorporated
into 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]:ES
State or Province Name (full name) [Some-State]:Alicante
Locality Name (eg, city) []:Alicante
Organization Name (eg, company) [Internet Widgits Pty Ltd]:OpenKM
Organizational Unit Name (eg, section) []:IT Manager
Common Name (e.g. server FQDN or YOUR name) []:192.168.10.230
Email Address []:noreply@openkm.com

Descomente esta sección de configuración:

Ventana de terminal
# Secure (SSL/TLS) connections
Include conf/extra/httpd-ssl.conf

Cambie el nombre de servidor por defecto en conf/extras/httpd-ssl.conf para que coincida con su dominio o IP:

Ventana de terminal
# General setup for the virtual host
DocumentRoot "${SRVROOT}/htdocs"
ServerName 192.168.10.230:443
ServerAdmin admin@example.com
ErrorLog "${SRVROOT}/logs/error.log"
TransferLog "${SRVROOT}/logs/access.log"

Si ve un mensaje de error como:

Debe habilitar este módulo 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; si no está presente, debe añadirlo.

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