Versiones diferentes de php con Apache en Slackware 14.2

Necesitaba tener  php7.2 en mi maquina para un proyecto nuevo que estoy empezando, pero adicionalmente necesitaba mantener php5.6 de proyectos actuales y viejos que sigo manteniendo.

Instalar mod_fcgid-2.3.9-x86_64-2_SBo

Fui a https://mirrors.slackware.com/slackware/slackware64-current/slackware64/n/ para ver si ya estaba php7 en la versión current de slackware y vi que así era, por lo que caso lo instalo, pero esto iba a crearme problemas con la versión actual que tengo.

Entonces decido ir a los sources de slackware para modificar un poco el slackbuild y recompilar para que sea menos traumático para mi sistema operativo y pueda desinstalarlo de ser necesario.

Entonces me aboco a cambiar un poco el slackbuild y queda con este diff: (colorización del código gracias a https://tohtml.com/ )

28c28
< PKGNAM=php7.2
---
> PKGNAM=php
51c51
< NUMJOBS=${NUMJOBS:-" -j4 "}
---
> NUMJOBS=${NUMJOBS:-" -j7 "}
54c54
< PKG=$TMP/package-php7.2/
---
> PKG=$TMP/package-php/
79,93c79,93
< #IMAPLIBDIR=/usr/local/lib${LIBDIRSUFFIX}/c-client
< #if [ -r $IMAPLIBDIR/lib${LIBDIRSUFFIX}/c-client.a ]; then
< #  echo "Using IMAP library:"
< #  ls -l $IMAPLIBDIR/lib${LIBDIRSUFFIX}/c-client.a
< #  sleep 5
< #else
< #  ( cd $CWD/../alpine ; VERSION=${ALPINE} ; ./alpine.SlackBuild || exit 1 ) || exit 1
< #  ( cd $TMP/alpine-${ALPINE}/imap/c-client
< #    strip -g c-client.a
< #    mkdir -p $IMAPLIBDIR/lib${LIBDIRSUFFIX}
< #    cp c-client.a $IMAPLIBDIR/lib${LIBDIRSUFFIX}
< #    mkdir -p $IMAPLIBDIR/include
< #    cp *.h $IMAPLIBDIR/include
< #  )
< #fi
---
> IMAPLIBDIR=/usr/local/lib${LIBDIRSUFFIX}/c-client
> if [ -r $IMAPLIBDIR/lib${LIBDIRSUFFIX}/c-client.a ]; then
>   echo "Using IMAP library:"
>   ls -l $IMAPLIBDIR/lib${LIBDIRSUFFIX}/c-client.a
>   sleep 5
> else
>   ( cd $CWD/../alpine ; VERSION=${ALPINE} ; ./alpine.SlackBuild || exit 1 ) || exit 1
>   ( cd $TMP/alpine-${ALPINE}/imap/c-client
>     strip -g c-client.a
>     mkdir -p $IMAPLIBDIR/lib${LIBDIRSUFFIX}
>     cp c-client.a $IMAPLIBDIR/lib${LIBDIRSUFFIX}
>     mkdir -p $IMAPLIBDIR/include
>     cp *.h $IMAPLIBDIR/include
>   )
> fi
96c96
< mkdir -p $PKG/etc/php7.2.d
---
> mkdir -p $PKG/etc/php.d
154c154
< EXTENSION_DIR=/usr/lib${LIBDIRSUFFIX}/php7.2/extensions \
---
> EXTENSION_DIR=/usr/lib${LIBDIRSUFFIX}/php/extensions \
158c158
<   --prefix=/opt/php7.2 \
---
>   --prefix=/usr \
162c162
<   --sysconfdir=/etc/php7.2.d \
---
>   --sysconfdir=/etc \
175,176c175,176
<   --with-config-file-scan-dir=/etc/php7.2.d \
<   --with-config-file-path=/etc/php7.2.d \
---
>   --with-config-file-scan-dir=/etc/php.d \
>   --with-config-file-path=/etc \
209a210
>   --with-imap=$IMAPLIBDIR \
288c289
<   > $PKG/etc/httpd/mod_php7.2.conf.new
---
>   > $PKG/etc/httpd/mod_php.conf.new
292,293c293,294
< cp -a php.ini-development php.ini-production $PKG/etc/php7.2.d/
< chmod 755 $PKG/etc/php.7.2.d $PKG/etc/php-fpm.d $PKG/etc/httpd
---
> cp -a php.ini-development php.ini-production $PKG/etc
> chmod 755 $PKG/etc/php.d $PKG/etc/php-fpm.d $PKG/etc/httpd

Como se puede ver, modifique algunos path, para que instale dentro de /opt en lugar de hacerlo en el /usr/bin,

ademas comente la parte de ALPINE porque no necesitaba para esto que estoy haciendo  y esto requería un poco más de esfuerzo

original.php.SlackBuild

Archivo modificado php.SlackBuild

con eso se genero el archivo de instalación de slackware  php-7.2.6-x86_64-1.txz que instalo con el comando #installpkg php-7.2.6-x86_64-1.txz

y listo, ya tengo en el sistema, por último hay que mover el archivo que se instaló en el /etc con el nombre de php.ini.new al directorio /etc/php7.2.d/ para que sea encontrado por el php que acabamos de compilar así se pueden tener 2 php.ini diferentes para cada versión del php

Luego queda decirle al apache, que para un virtualhost quiero php7 y para el otro php5.6

Primer que nada, modifiquen el archivo httpd.conf ( /etc/httpd.conf )

agreguen la entrada
Include /etc/httpd/mod_fcgid.conf

antes de la linea donde dice
Include /etc/httpd/extra/httpd-vhosts.conf

Si lo dejan al final, no les va a funcionar, lo sé porque estuve probando por 1 hora varias combinaciones de cosas y ninguno funcionaba por que eso estaba al final y no antes.

y dejen para el final del archivo el
Include /etc/httpd/mod_php.conf

En el archivo mod_php.conf comenten todo, salvo esta linea:
lib64/httpd/modules/libphp5.so

para que el modulo de php5 este disponible

y lo mismo para el archivo mod_fcgid.conf
solo dejen la linea que dice:
LoadModule fcgid_module lib64/httpd/modules/mod_fcgid.s

dentro del archivo httpd-vhosts.conf (donde normalmente se configuran los virtualhost)

y tienen una configuracion similar a esta

<VirtualHost *:80>
  ServerAdmin admin@server.example.com
  DocumentRoot "/var/www/html/sitio1"
  ServerName sitio1.local
  ErrorLog "/var/log/httpd/sitio1-error_log"
  CustomLog "/var/log/httpd/sitio1-access_log" common
  <Directory /var/www/html/sitio1>
    Options Indexes FollowSymLinks ExecCGI
    AllowOverride All
    Require all granted
  </Directory>
  Include /etc/httpd/extra/php7fcgid.conf
</VirtualHost>

Agregan eso que marco en rojo, para la configuración de php7

y para el sitio que tiene que tener php5.6

<VirtualHost *:80>
   ServerAdminadmin@server.example.com
   DocumentRoot "/var/www/html/sitio2"
   ServerName sitio2.local
   ErrorLog "/var/log/httpd/sitio2-error_log"
   CustomLog "/var/log/httpd/sitio2-access_log" common
   <Directory /var/www/html/sitio2>
     Options Indexes FollowSymLinks ExecCGI
     AllowOverride All
     Require all granted
   </Directory>
   Include /etc/httpd/extra/php5fcgid.conf
</VirtualHost>

Luego creamos esos archivos que marqué en rojo:

para el archivo php5fcgid.conf:

<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>

y para el archivo php7fcgid.conf

#para php7
<IfModule fcgid_module>
  AddHandler fcgid-script .fcgi .php
# Where to look for the php.ini file?
  DefaultInitEnv PHPRC "/etc/php7.2.d"
# Maximum requests a process handles before it is terminated
  MaxRequestsPerProcess 100
# Number of seconds of idle time before a process is terminated
  IPCCommTimeout 240
  IdleTimeout 240
#Or use this if you use the file above
  FCGIWrapper /opt/php7.2/bin/php-cgi .php
</IfModule>

Visite varios sitios para llegar a esto, no creo que esta configuración sea válida para ambientes de producción, es netamente para un entorno de desarrollo en el que la vida diaria exige tener uno u otro, un compañero luego de mostrar esto, me dijo por que no usar docker que es una alternativa, y así, para que hacerla facil si podemos hacerla dificil 😉

Probablemente varios de los sitios  que visité primero ya me dieron la solución, pero eso que mencione antes, de cargar el archivo del mod_fcgid.conf antes, creo que impidió que logre hacerlo funcionar correctamente
Esta es una breve lista de los que leí:
https://bbs.archlinux.org/viewtopic.php?pid=901050#p901050
https://medium.com/@sbuckpesch/run-multiple-php-version-on-the-same-server-using-php-fpm-and-xdebug-on-ubuntu-16-04-6a84f5b7d7ce
https://www.apachelounge.com/viewtopic.php?t=3430
https://2bits.com/articles/apache-fcgid-acceptable-performance-and-better-resource-utilization.html
https://www.apachelounge.com/viewtopic.php?t=5773

source slackware para php7.2 en current (al 14 de junio de 2018)
https://mirrors.slackware.com/slackware/slackware64-current/source/n/php/

Slackbuild de fastcgid http://slackbuilds.org/repository/14.2/network/mod_fcgid/

 

 

 

 

 

 

Bueno, eso es todo creo, con eso logré hacer funcionar ambas versiones en mi máquina,

hasta la próxima.