php-fpm on Cpanel

After experimenting with mod_ruid2 and mod_fcgi in cpanel i found that the php speed just wasn’t as good as it should be.

I was really missing an opcode system. I prefer to use APC as it is actively developed by the php team themselves.

With mod_ruid2 APC works quite well but you are restricted to use apache prefork which uses lot of resources.

With mod_fcgi APC doesn’t work as well as it quickly eats up all your ram as the opcode isn’t shared. You can use mpm_worker though so this is an upside.

With php-fpm and mod_fastcgi being the ultimate solution but unfortunately cPanel still haven’t included php-fpm within their nice easyapache install system.

Someone on the cpanel forums has managed to get php-fpm up and running and you can find the instructions here.

http://forums.cpanel.net/f189/php-fpm-fastcgi-apc-293802.html

I have modified it so that it uses a socket and fixed the users for the current apache 2.2.24

I got it working.

Code:

/var/cpanel/easy/apache/rawopts/all_php5

contains
Code:

–enable-fastcgi
–enable-fpm

Then you recompile php and apache using easyapache with the mpm worker selected.

Then you have to set up your
Code:

/etc/init.d/php-fpm

script which you copy from
Code:

/home/cpeasyapache/src/php-5.3.16/sapi/fpm/init.d.php-fpm.in

Then you have to fill in your variables at the top of the file:
Code:

#! /bin/sh

### BEGIN INIT INFO
# Provides: php-fpm
# Required-Start: $remote_fs $network
# Required-Stop: $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts php-fpm
# Description: starts the PHP FastCGI Process Manager daemon
### END INIT INFO

prefix=
exec_prefix=

php_fpm_BIN=/usr/local/sbin/php-fpm
php_fpm_CONF=/usr/etc/php-fpm.conf
php_fpm_PID=/var/run/php-fpm.pid

php_fpm_BIN
you might have to locate or create each of these files. php-fpm was in the path for me.
Code:

type php-fpm

gave me that.

php_fpm_CONF
i copied
Code:

/home/cpeasyapache/src/php-5.3.16/sapi/fpm/php-fpm.conf.in

to
Code:

/usr/etc/php-fpm.conf

I had to edit it too for my user and group that apache runs under, this will vary server to server so you’ll have to see what permissions your apache server needs
Code:

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user’s group
; will be used.
user = nobody
group = nobody

and comment out the ip and change it to a socket.

;listen = 127.0.0.1:9000
listen = /tmp/php-fpm.sock

php_fpm_PID=/var/run/php-fpm.pid

You will have to create this file it won’t have permissions to create it itself even ran as root for some reason:
Code:

touch /var/run/php-fpm.pid

Having fun yet? K now you need to make apache use it for php.
Code:

vim /usr/local/apache/conf/includes/post_virtualhost_global.conf

you’re going to need to add this to the end of the file:

Code:

LoadModule fastcgi_module modules/mod_fastcgi.so


FastCGIExternalServer /usr/sbin/php-fpm -socket /tmp/php-fpm.sock
AddHandler php-fastcgi .php

#
# SetHandler php-fastcgi-virt
# Action php-fastcgi-virt /usr/sbin/php-fpm.fcgi virtual
#

Action php-fastcgi /usr/sbin/php-fpm.fcgi
ScriptAlias /usr/sbin/php-fpm.fcgi /usr/sbin/php-fpm


Options ExecCGI FollowSymLinks
SetHandler fastcgi-script
Order allow,deny
Allow from all

Don’t get ahead of yourself yet, we still haven’t compiled mod_fastcgi from source:
For which I followed this guide:
FastCGI for Apache2

Obviously ignore the bit about installing apache, as we already did that start with the part you download fastcgi.

You’ll have to change the source a bit differently than he lists tho here was my makefile:
Code:

#
# Makefile for Apache2
#

builddir = .

top_dir = /home/cpeasyapache/src/httpd-2.2.24

top_srcdir = ${top_dir}
top_builddir = ${top_dir}

include ${top_builddir}/build/special.mk

APXS = /usr/local/apache/bin/apxs
APACHECTL = /usr/local/apache/bin/apachectl

#DEFS=-Dmy_define=my_value
#INCLUDES=-Imy/include/dir
#LIBS=-Lmy/lib/dir -lmylib
INCLUDES=-I /home/cpeasyapache/src/httpd-2.2.24

all: local-shared-build

clean:
-rm -f *.o *.lo *.slo *.la

Then I ran into a problem with it not being able to create/read the log which would make nothing work:

Code:

touch /usr/var/log/php-fpm.log
chmod 777 /usr/var/log/php-fpm.log

chmod 777 is taboo and I’ll fix it soon but it got it able to read it when nothing else seemed to.

Lastly restart/start both of them:
Code:

/etc/init.d/php-fpm restart
/etc/init.d/httpd restart

Result: Well I’ve been optimizing our server for 2 weeks and this was the last thing. I’d already gotten the server response/page load time for our ecommerce php store to 500 to 600ms per product detail page according to firebug from times over 1.5 seconds. Now it’s down to no larger than 437ms. You can blink and miss it seriously. It’s well worth the effort I’ve never seen an ecommerce site this fast that runs off a php cart. It took me about 6 or 7 hours of researching around looking up info. Hopefully this will let someone else do it in far less time (my prior post was made a while after I’d started).

Server load problems. Varnish vs Nginx vs Apache vs PHP DSO vs FCGI vs suPHP vs APC vs eAccelerator vs memcached

After noticing one of my servers was down i needed a solution to the server load problems i was having.

My sites on the server usually handle the loads that are on them but i was getting a huge spike in traffic that was causing the server to start swapping in and out of the swap….. which snowballed and caused the server to go from a load average of about 1 to well over 100!!!

What was to be done?

I already use supercache on all my sites along with widget cache.  This helps greatly but the problem is i am running multiple sites on these servers and i really need to prevent the servers from becoming overloaded.

 

I was using Apache + mod_fcgi and nginx on cpanel.  It worked well until i went over a certain amount of traffic at the same time.

I quickly replaced nginx with the varnish cpanel plugin which helped a little and caused the load to drop.

I also noticed that FCGI was running away with processes and helping cause the swapping.  Exchaning this for suPHP did help but i found the performance wan’t anywhere near as good.

As i am the only person on the server i have since moved to DSO which dropped my load average down to around 1 which is perfect for me.

The only problem being that dso runs as the apache user nobody:nobody.   as i wanted to change from super cache to w3 (as i’ve seen some stats indicating that w3 total cache can handle a higher load) i have had to go through sorting file permissions of each site so that the W3 plugin can write the cache.

playing around with APC , eAccelerator and memcached  i have found the best results are in using enhanced disk for my page cache and APC for the database, object and minify.  MY sites are now ready for any spike in traffic that can be thrown at them!