Habilitar comunicación por tubería (pipe) entre PHP y el motor JasperReports¶
Este procedimiento habilita la comunicación por tubería (pipe) entre PHP y el motor JasperReports en SIU-Guaraní, garantizando que Apache (que ejecuta PHP)
y el servicio Java de Jasper puedan intercambiar datos a través de un directorio temporal compartido, incluso cuando Apache opera bajo la directiva de seguridad PrivateTmp de systemd.
Problema que resuelve¶
En distribuciones Linux modernas, Apache suele ejecutarse con PrivateTmp=true, lo que aísla su /tmp del resto del sistema. El puente PHP-Java que usa SIU-Guaraní (JavaBridge)
para generar reportes necesita crear archivos de tubería (pipes) en una ubicación accesible por ambos procesos. Si Apache está aislado, Jasper no puede leer esos archivos
y la generación de PDF falla.
Acciones que realiza el script¶
Crea el directorio compartido de pipes (
/var/tmp/jasper_pipe) con propietariowww-data:www-datay permisos0750, usandoinstall -dpara que la operación sea atómica e idempotente.Configura PHP añadiendo la directiva
java.pipe_diren un archivo dentro deconf.d/(99-jasper.ini), de modo que el puente PHP-Java sepa dónde crear los archivos de comunicación sin modificar elphp.iniglobal y facilitando el rollback.Desactiva el aislamiento de
/tmppara Apache mediante un drop-in de systemd (jasper-pipes.confconPrivateTmp=false), permitiendo que el servidor web y el proceso Java externo compartan el mismo espacio de archivos temporales.Recarga systemd y reinicia Apache para aplicar los cambios.
Resultado en el entorno Guaraní¶
Con esta configuración, las operaciones que generan documentos PDF (certificados, actas, reportes personalizados) se completan correctamente, porque el flujo de datos entre la aplicación PHP (Guaraní) y el motor JasperReports deja de estar bloqueado por el aislamiento de systemd. El sistema queda además preparado para futuras reinstalaciones o migraciones, ya que la configuración es reproducible mediante un único script idempotente.
#!/usr/bin/env bash
set -euo pipefail
# 1. Directorio compartido para los pipes de Jasper
PIPE_DIR=/var/tmp/jasper_pipe
install -d -o www-data -g www-data -m 0750 "$PIPE_DIR"
# 2. Configuración de PHP (java.pipe_dir)
PHP_CONF_DIR=/etc/php/7.4/apache2/conf.d
PHP_CONF_FILE=$PHP_CONF_DIR/99-jasper.ini
install -d -m 0755 "$PHP_CONF_DIR"
printf 'java.pipe_dir = %s\n' "$PIPE_DIR" > "$PHP_CONF_FILE"
# 3. Override de systemd para Apache (PrivateTmp=false)
OVERRIDE_DIR=/etc/systemd/system/apache2.service.d
OVERRIDE_FILE=$OVERRIDE_DIR/jasper-pipes.conf
install -d -m 0755 "$OVERRIDE_DIR"
printf '[Service]\nPrivateTmp=false\n' > "$OVERRIDE_FILE"
# 4. Recargar systemd y reiniciar Apache
systemctl daemon-reload
systemctl restart apache2