Necesitaba instalar el nuevo PHP7 en un servidor donde recientemente tenía instalado un servidor en producción en Debian 8. Este servidor cumple con los servicios web y para eso tiene el conjunto de programas de servidor Apache, MySQL y PHP. Como la instalación se ha hecho mediante el repositorio estable de debian la versión que trae de php es la 5.6.
Sin embargo la idea es añadirle también la versión de PHP 7 que ha salido hace poco a disposición general. A continuación muestro como lo he hecho para que puedan funcionar las dos versiones distintamente.
El servicio PHP 5 está configurado como un sistema standalone, es decir no funciona como un módulo de apache, eso me permite tener mayor control, puesto que hago que cada virtualhost de Apache tenga su propia instancia de PHP y controlar así qué virtualhosts requiere más recursos. También me permite tener más pistas a la hora de ver qué ha podido suceder cuando ha habido algún problema sin afectar a los demás.
Así pues, asumo en esta muestra que ya tienes instalado y configurado en tu servidor PHP 5 en modo FPM y todo ello conectado con apache mediante socket o puerto local.
Preparación
Nos situamos en el directorio de fuentes:
cd /usr/src
Instalamos los paquetes necesarios:
apt-get -y install build-essential autoconf insserv bison git
Instalamos las librerías:
apt-get -y install libgmp-dev libmysqlclient-dev libfcgi-dev libfcgi0ldbl libmcrypt-dev libreadline-dev
Ajustamos el fallo de la localización del fichero gmp.h para compilar.
ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h
Compilación
Clonamos el repositorio
git clone https://git.php.net/repository/php-src.git
cd php-src
Compilamos
./buildconf
./configure --prefix=/usr/local/php7 --localstatedir=/usr/local/var --sysconfdir=/usr/local/etc/php7 --with-config-file-path=/usr/local/etc/php7 --with-config-file-scan-dir=/usr/local/etc/php7/conf.d --mandir=/usr/local/php7/share/man --enable-mbstring --enable-zip --enable-bcmath --enable-pcntl --enable-ftp --enable-exif --enable-calendar --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-wddx --with-curl --with-mcrypt --with-iconv --with-gmp --with-pspell --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --with-zlib-dir=/usr --with-xpm-dir=/usr --with-freetype-dir=/usr --enable-gd-native-ttf --enable-gd-jis-conv --with-openssl --with-pdo-mysql=/usr --with-gettext=/usr --with-zlib=/usr --with-bz2=/usr --with-mysqli=/usr/bin/mysql_config --with-fpm-user=www-data --with-fpm-group=www-data --enable-fpm --enable-sockets --enable-intl --enable-mysqlnd --with-mysqli=shared,mysqlnd --enable-bcmath --enable-dba --with-gmp --with-imap --with-imap-ssl --with-mhash --with-readline --enable-shmop --enable-soap --with-xmlrpc --with-xsl=/usr --enable-opcache --with-kerberos
Nota: el paquete recode se ha quitado porque no es compatible con imap:
--with-recode=/usr
make
make install
Configuración
php.ini
cp /usr/src/php-src/php.ini-production /usr/local/etc/php7/php.ini
php-fpm.conf
cp /usr/local/etc/php7/php-fpm.conf.default /usr/local/etc/php7/php-fpm.conf
Editamos: /usr/local/etc/php7/php-fpm.conf
pid = run/php7-fpm.pid
www.conf
cp /usr/local/etc/php7/php-fpm.d/www.conf.default /usr/local/etc/php7/php-fpm.d/www.conf
Editamos: /usr/local/etc/php7/php-fpm.d/www.conf
Lo que hacemos es comentar el puerto 9000 y activar la conexión por socket.
;listen = 127.0.0.1:9000
listen = /var/run/php7-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
Servicio FPM
php7-fpm
Creamos el siguiente fichero: /etc/init.d/php7-fpm
if init_is_upstart; then
exit 1
fi
#
# Function to check the correctness of the config file
#
do_check()
{
# Run php-fpm with -t option to check the configuration file syntax
errors=$($DAEMON –fpm-config $CONFFILE -t 2>&1 | grep "\[ERROR\]" || true);
if [ -n "$errors" ]; then
echo "Please fix your configuration file…"
echo $errors
return 1
fi
return 0
}
#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon –start –quiet –pidfile $PIDFILE –exec $DAEMON –test > /dev/null \
|| return 1
start-stop-daemon –start –quiet –pidfile $PIDFILE –exec $DAEMON — \
$DAEMON_ARGS 2>/dev/null \
|| return 2
# Add code here, if necessary, that waits for the process to be ready
# to handle requests from services started subsequently which depend
# on this one. As a last resort, sleep for some time.
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon –stop –quiet –retry=QUIT/$TIMEOUT/TERM/5/KILL/5 –pidfile $PIDFILE –name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon –stop –quiet –oknodo –retry=0/30/TERM/5/KILL/5 –exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don’
2) [ "$VERBOSE""$VERBOSE""$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME""$?""$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE""$DAEMON" "$NAME""Reloading $DESC" "$NAME""Reopening $DESC logs""Restarting $DESC" "$NAME""$?""$?""Usage: $SCRIPTNAME {start|stop|status|restart|reload|force-reload}"
Ajustamos los permisos del fichero
chmod 755 /etc/init.d/php7-fpm
Incluímos el servicio php7-fpm
/usr/lib/insserv/insserv php7-fpm
Creamos el fichero /lib/systemd/system/php7-fpm.service
Arrancamos el servicio php7-fpm
Si tu sistema soporta systemctl entonces debes activar lo siguiente:
systemctl enable php7-fpm.service
systemctl daemon-reload
service php7-fpm start
En caso que no, puedes hacer lo siguiente:
/etc/init.d/php7-fpm start
Con estos pasos ya puedes tener funcionado dos servicios de php, cada uno con su versión. A partir de ahí en cada virtualhost definimos mediante el módulo FastCGI a que socket debe conectarse y por consiguiente a que versión de PHP.
En este post solo hablo de la instalación de PHP7 para que pueda convivir con PHP5, no se explica como instalar y configurar PHP mediante FPM, en caso que pida es posible que haga otro post sobre la instalación de PHP-FPM, FastCGI y Apache.
Ver comentarios (2)
El script php7-fpm me da un error que no acabo de entender:
sed: -e expression #1, char 1: unknown command: `▒'
Gracias!
Hola!, cuando te sale este error? cuando intentas arrancar el servicio?