Configure LfPHP with Production Settings

ATTENTION! Please note that this code example does NOT cover security issues and how to harden your server installation!

Download code as text file

In order to configure LfPHP with the most common production settings and extensions, please run an LfPHP base image with the PHP source code (asclinux/linuxforphp-8.1:src) with the following command :

docker run --rm -it -p 8181:80 asclinux/linuxforphp-8.1:src /bin/bash -c "cd ; wget -O tmp http://bit.ly/2jheBrr ; /bin/bash ./tmp 7.2.5 nts ; echo '<?php phpinfo();' > /srv/www/index.php ; /bin/bash"

Of course, alternatively, you could enter the following commands manually on the container's CLI in order to accomplish the same thing :

cd /root/php-src
git fetch --all --tags
git pull origin master
git checkout tags/php-7.2.5
./buildconf --force
./configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--datadir=/usr/share/php \
--mandir=/usr/share/man \
--enable-fpm \
--with-fpm-user=apache \
--with-fpm-group=apache \
--with-config-file-path=/etc \
--with-zlib \
--enable-bcmath \
--with-bz2 \
--enable-calendar \
--enable-dba=shared \
--with-gdbm \
--with-gmp \
--enable-ftp \
--with-gettext=/usr \
--enable-mbstring \
--with-readline \
--with-mysql-sock=/run/mysqld/mysqld.sock \
--with-curl \
--with-openssl \
--with-openssl-dir=/usr \
--with-mhash \
--enable-intl \
--with-sodium=/usr \
--enable-zip \
--with-libxml-dir=/usr \
--with-libdir=/lib64 \
--enable-sockets \
--enable-libxml \
--enable-soap \
--with-gd \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--with-zlib-dir=/usr \
--with-freetype-dir=/usr \
--enable-exif \
--with-xsl \
--with-xmlrpc \
--with-pgsql \
--with-pdo-mysql=/usr \
--with-pdo-pgsql \
--with-mysqli \
--with-ldap \
--with-ldap-sasl \
--enable-opcache
make
make install
install -v -m644 php.ini-production /etc/php.ini &&
mv -v /etc/php-fpm.conf{.default,} &&
install -v -m755 -d /usr/share/doc/php-7.2.5 &&
install -v -m644 CODING_STANDARDS EXTENSIONS INSTALL NEWS README* UPGRADING* php.gif \
/usr/share/doc/php-7.2.5 &&
ln -v -sfn /usr/lib/php/doc/Archive_Tar/docs/Archive_Tar.txt \
/usr/share/doc/php-7.2.5 &&
ln -v -sfn /usr/lib/php/doc/Structures_Graph/docs &&
/usr/share/doc/php-7.2.5
cp -v /etc/php-fpm.d/www.conf.default /etc/php-fpm.d/www.conf
sed -i 's@php/includes"@&\ninclude_path = ".:/usr/lib/php"@' \
/etc/php.ini
sed -i -e '/proxy_module/s/^#//' \
-e '/proxy_fcgi_module/s/^#//' \
/etc/httpd/httpd.conf
echo \
'#ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/srv/www/$1' >> \
/etc/httpd/httpd.conf
cat >>/etc/php.ini << EOF
[OpCache]
zend_extension = $( php -i | grep extensions | awk '{print $3}' )/opcache.so
EOF
sed -i -e '/proxy_module/s/^#//' -e '/proxy_fcgi_module/s/^#//' /etc/httpd/httpd.conf
cat >>/etc/httpd/httpd.conf << 'EOF'
<Proxy "unix:/run/php-fpm.sock|fcgi://localhost/">
    ProxySet min=0
    ProxySet timeout=1800
</Proxy>

<FilesMatch \.php$>
    # 2.4.10+ can proxy to unix socket
    SetHandler "proxy:unix:/run/php-fpm.sock|fcgi://localhost/"

    # Else we can just use a tcp socket:
    # SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
EOF
make install-php
sed -i 's/#LoadModule rewrite_module/LoadModule rewrite_module/' /etc/httpd/httpd.conf
sed -i 's/AllowOverride None/AllowOverride All/' /etc/httpd/httpd.conf
sed -i 's/DirectoryIndex index.html/DirectoryIndex index.php index.html/' /etc/httpd/httpd.conf
sed -i 's/listen = 127.0.0.1:9000/; listen = 127.0.0.1:9000\nlisten = \/run\/php-fpm.sock/' /etc/php-fpm.d/www.conf
cat >/etc/init.d/php-fpm << 'EOF'
#! /bin/sh
#######################################################################
# Begin /etc/init.d/php-fpm
#
# Description : Start the PHP fastCGI Proces Manager
#
# Author      : P Labastie - [email protected]
#               from a file shipped with the PHP pacakge
#
# Version     : LFS 7.5
#
########################################################################

### BEGIN INIT INFO
# Provides:          php-fpm
# Required-Start:    $syslog $local_fs $network
# Should-Start:      $remote_fs
# Required-Stop:     $network
# Should-Stop:       $remote_fs
# Default-Start:     3 4 5
# Default-Stop:      0 1 2 6
# Short-Description: starts php-fpm
# Description:       starts the PHP FastCGI Process Manager daemon
# X-LFS-Provided-By: BLFS / LFS 7.5
### END INIT INFO

. /lib/lsb/init-functions

#$LastChangedBy: pierre $
#$Date: 2014-03-29 04:48:53 -0500 (Sat, 29 Mar 2014) $

prefix=/usr
exec_prefix=${prefix}

php_fpm_BIN=${exec_prefix}/sbin/php-fpm
php_fpm_CONF=/etc/php-fpm.conf
php_fpm_PID=/var/run/php-fpm.pid


php_opts="--fpm-config $php_fpm_CONF --pid $php_fpm_PID"


wait_for_pid () {
	try=0

	while test $try -lt 35 ; do

		case "$1" in
			'created')
			if [ -f "$2" ] ; then
				try=''
				break
			fi
			;;

			'removed')
			if [ ! -f "$2" ] ; then
				try=''
				break
			fi
			;;
		esac

		echo -n .
		try=`expr $try + 1`
		sleep 1

	done

}

case "$1" in
	start)
		log_info_msg "Starting PHP fastCGI Process Manager..."

		start_daemon $php_fpm_BIN --daemonize $php_opts

		if [ "$?" != 0 ] ; then
			log_failure_msg2
			exit
		fi

		wait_for_pid created $php_fpm_PID

		if [ -n "$try" ] ; then
			log_failure_msg2
		else
			log_success_msg2
		fi
	;;

	stop)
		log_info_msg "Stopping PHP fastCGI Process Manager..."

		if [ ! -r $php_fpm_PID ] ; then
			log_warning_msg "php-fpm not running?"
			exit
		fi

		killproc -p $php_fpm_PID $php_fpm_BIN -QUIT

		wait_for_pid removed $php_fpm_PID

		if [ -n "$try" ] ; then
			log_failure_msg2
		else
			log_success_msg2
		fi
	;;

	status)
		statusproc $php_fpm_BIN
	;;

	restart)
		$0 stop
		$0 start
	;;

	reload)

		log_info_msg "Reload service php-fpm..."
		killproc -p $php_fpm_PID $php_fpm_BIN -USR2
		log_success_msg2
	;;

	*)
		echo "Usage: $0 {start|stop|restart|reload|status}"
		exit 1
	;;

esac
EOF
chmod +x /etc/init.d/php-fpm
ln -sf  ../init.d/php-fpm /etc/rc.d/rc0.d/K28php-fpm
ln -sf  ../init.d/php-fpm /etc/rc.d/rc1.d/K28php-fpm
ln -sf  ../init.d/php-fpm /etc/rc.d/rc2.d/K28php-fpm
ln -sf  ../init.d/php-fpm /etc/rc.d/rc3.d/S32php-fpm
ln -sf  ../init.d/php-fpm /etc/rc.d/rc4.d/S32php-fpm
ln -sf  ../init.d/php-fpm /etc/rc.d/rc5.d/S32php-fpm
ln -sf  ../init.d/php-fpm /etc/rc.d/rc6.d/K28php-fpm
/etc/init.d/mysql start
/etc/init.d/php-fpm start
chown apache:apache /run/php-fpm.sock
/etc/init.d/httpd start

Once done, you will be able to run any PHP script from the CLI or the Web server with the most common production settings.

Have a lot of fun!