Incrementar el tamaño máximo del POST de Tomcat

Un equipo de desarrollo quería usar el Manager App de Tomcat para desplegar de los war). Aunque al intentar subir war de más de 50MB les arrojaba el siguiente error Message: FAIL - Tried to use command /upload via a GET request but POST is required.

El log manager.log registró el siguiente error:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
SEVERE: HTMLManager: FAIL - Deploy Upload Failed, Exception: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (68626547) exceeds the configured maximum (52428800)
java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (68626547) exceeds the configured maximum (52428800)
at org.apache.catalina.connector.Request.parseParts(Request.java:2929)
at org.apache.catalina.connector.Request.parseParameters(Request.java:3252)
at org.apache.catalina.connector.Request.getParameter(Request.java:1158)
at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:382)
at org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:108)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:958)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:452)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1087)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (68626547) exceeds the configured maximum (52428800)
at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:815)
at org.apache.tomcat.util.http.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:259)
at org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:283)
at org.apache.catalina.connector.Request.parseParts(Request.java:2859)
... 27 more

Apache: Instalar y configurar PHP-FPM (FastCGI Process Manager)

El servidor de PHP puede ejecutarse dentro de Apache como un módulo (mod_php) o como un servidor independiente. En caso de que corra como un servidor independiente, la comunicación entre Apache y el servidor PHP puede usar:

  • CGI: es un método de comunicación entre un servidor web y una aplicación externa, es decir, las aplicaciones CGI son ejecutadas por un proceso separado del servidor web. Este proceso es creado con cada petición CGI del servidor web y finalizado cuando termina su trabajo, lo cual hace que el rendimiento CGI sea limitado y poco escalable. Es independiente al lenguaje utilizado, es decir, CGI permite interconectar el servidor web con una aplicación externa programada en cualquier lenguaje. Es un método antiguo y en desuso debido principalmente a su pobre rendimiento.
  • FastCGI: Es una evolución de CGI donde existe un proceso persistente para procesar las peticiones CGI. Es indepediente al lenguaje utilizado, es decir, CGI permite interconectar el servidor web con una aplicación externa programada en cualquier lenguaje.
  • PHP-FPM: Es una alternativa a FastCGI para PHP, donde existe un demonio PHP en espera de peticiones CGI a través de un socket TCP o UNIX. Es exclusivo para conectar el servidor web con una aplicación PHP.

En esta entrada se verá como ejecutar multiples versiones de PHP en un mismo servidor usando PHP-FPM. La versión de PHP será configurada de forma individual para cada virtualhost.

Instalar HAProxy desde el código fuente

En esta entrada se verá como compilar e instalar HAProxy desde las fuentes.

Dependencias necesarias

En RedHat/CentOS se requieren los siguientes paquetes: make, gcc, pcre-devel, openssl-devel y zlib-devel. Se pueden instalar con:

1
yum install make gcc pcre-devel openssl-devel zlib-devel

Los errores que recibirá en caso de carecer de alguna de las dependencias son:

Error 'Cannot recover key' al configurar un conector SSL en Tomcat

Al configurar el conector Tomcat de Jira para que cifre las comunicaciones, tras reiniciar el servicio, Tomcat dió el siguiente error java.io.IOException: Cannot recover key y el conector no iniciaba.

A continuación el log del Tomcat:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
20-Feb-2017 08:56:48.994 SEVERE [main] org.apache.coyote.AbstractProtocol.init Failed to initialize end point associated with ProtocolHandler ["http-bio-8443"]
java.io.IOException: Cannot recover key
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:518)
... 14 more
Caused by: java.security.UnrecoverableKeyException: Cannot recover key
at sun.security.provider.KeyProtector.recover(KeyProtector.java:328)
... 31 more
20-Feb-2017 08:56:48.997 SEVERE [main] org.apache.catalina.core.StandardService.initInternal Failed to initialize connector [Connector[org.apache.coyote.http11.Http11Protocol-8443]]
org.apache.catalina.LifecycleException: Failed to initialize component [Connector[org.apache.coyote.http11.Http11Protocol-8443]]
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:106)
... 19 more
Caused by: org.apache.catalina.LifecycleException: Protocol handler initialization failed
at org.apache.catalina.connector.Connector.initInternal(Connector.java:962)
... 13 more
Caused by: java.io.IOException: Cannot recover key
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:518)
... 19 more
Caused by: java.security.UnrecoverableKeyException: Cannot recover key
at sun.security.provider.KeyProtector.recover(KeyProtector.java:328)
... 31 more

JKS: Java keyStore II

Como se vió en la entrada JKS: Java keyStore, al configurar un conector en el servidor de aplicaciones Tomcat, es posible indicar la ruta de dos keyStores:

  1. keyStore, para albergar claves privadas que serán usadas por Tomcat para cifrar mediante SSL o TTLS las comunicaciones.
  2. trustStore, para albergar las entidades de certificación raíz, intermedias o directamente certificados que deben ser reconocidos como válidos por las aplicaciones que corren dentro del servidor de aplicaciones Tomcat.

La entrada anterior estaba orientada a la gestión de una keyStore de tipo trustStore. Esta entrada estará orientada en la gestión de una keyStore como almacen de claves privadas para cifrar el tráfico

Listar máquinas inactivas del AD

Hoy en el trabajo a un compañero le interesó sacar un listado de máquinas que no contactaban con el AD desde hacia más de 30 días, me pregunto por el tema e hice una busqueda en Microsoft Script Center, donde encontré Get Inactive Computer in Domain based on Last Logon Time Stamp.

El siguiente script PowerShell genera un listado csv separado por comas con el nombre de máquina y la marca temporal :

1
2
3
4
5
6
import-module activedirectory
$domain = "my-company.com"
$DaysInactive = 30
$CreateFile = "C:\Users\antonio.guillen\List_old_computer.csv"
$time = (Get-Date).Adddays(-($DaysInactive))
Get-ADComputer -Filter {LastLogonTimeStamp -lt $time} -Properties LastLogonTimeStamp | select-object Name,@{Name="Stamp";Expression={[DateTime]::FromFileTime($_.lastLogonTimestamp)}} | export-csv $CreateFile

List Inactive Computer in Domain based on Last Logon Time Stamp

Usar Nginx como SSL/TLS Offloading de Jira

En esta entrada se verá como configurar Nginx como proxy SSL/TLS OffLoading de Atlassian JIRA Software, para ello solo es necesario:

  1. Configurar el conector de Tomcat.
  2. Configurar Nginx.

Configurar el conector de Tomcat

A continuación se detalla como configurar el conector para admitir conexiones HTTP, además de indicar el método, el host y el puerto que deben usar las aplicaciones que corren dentro del Tomcat al construir URL absolutas.

Cambiar el puerto de escucha de Oracle Application Express (APEX)

Esta semana el equipo de desarrollo solicitó un servidor Windows Server 2012 R2 con JBoss EAP y Oracle 11g XE.

  • JBoss Enterprise Application Platform (JBoos EAP) es un servidor de aplicaciones Java usado para desarrollar, implementar y alojar aplicaciones y servicios Java.
  • Oracle 11g XE es la versión gratuita de la BD de Oracle, que además incluye Oracle Application Express (APEX). APEX es un entorno de desarrollo web que permite generar prototipos de aplicaciones WEB con la lógica del negocio.

Instalé JBoss EAP 7 y lo configuré como Standalone corriendo en el puerto 8080 (la configuración por defecto), el problema surgió tras instalar Oracle 11g XE, donde me di cuenta que el puerto por defecto del XDB HTTP listener de APEX erá el 8080 por lo que solapaba con el puerto del JBoss. Por ello era necesario cambiar el puerto de una de estas dos aplicaciones, en mi caso me decanté por cambiar el puerto de APEX.