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
View story at Medium.com
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.

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *