Figuring out the possibilities for Apache and PHP reminds me of a Dr. Seuss book, “Fox in Sox”. It’s a favorite of mine. I love reading it to the kids. In it, Mr. Fox tries to get Mr. Knox to say all kinds of ridiculous (in meaning and hard to say) tongue twisters. At one point Mr. Knox exclaims:
“I can’t blab such blibber blubber!
My tongue isn’t make of rubber.”
That’s what my brain felt like after trying to figure all of the options for Apache and PHP. To combat my rubber brain, I created this flow-chart to help me keep track of the options, the pros and cons for each, and the path I finally chose.
First off, a list of requirements and goals:
- Chroot each vhost to it’s own directory, and have Apache and PHP run on that vhost’s server account
- Speed, run Apache and PHP at their most effective and efficient levels
- Utilize an opcode cache, APC, to speed up PHP pages
- Use trusted repositories to make installation and upgrading easier
Here’s what I eventually figured out about Apache and PHP:
These sites were helpful for the initial set up of PHP as CGI with mod_fcgi and Apache in chroot (mod_fcgi sends one request to each PHP process regardless if PHP children are available to handle more, and no sharing of APC opcode cache across PHP processes):
This site was helpful for setting up PHP as CGI with mod_fastcgi and Apache in chroot (mod_fastcgi sends multiple requests to a PHP process, so the process can send them to children processes, and having one PHP process for each site allows for APC opcode cache to be usable.)
These sites helped me learn about php-fpm and how it is not quite ready for what I have in mind:
I ended up going with Apache’s mod_fastcgi for using PHP as a CGI, and NOT using PHP-FPM, while running Apache in threaded mode with apache.worker enabled.
To get this set up is pretty easy. I already had Apache and PHP installed and running (with PHP as CGI using mod_fcgi), so here are the steps I used to convert it to run mod_fastcgi and apache.worker. I’m running CentOS 6.3.
Install the RPMForge repo for installing mod_fastcgi.
- Get latest from http://repoforge.org/use/ :
rpm -Uvh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
yum --enablerepo=rpmforge install mod_fastcgi
- Edit the worker section. I still need to do some testing to figure out the best configuration
- If there, make sure to comment out, or delete the lines for mod_php:
LoadModule php5_module modules/libphp5.so
- this line also:
AddType application/x-httpd-php .php
- The last line should be:
Each virtual host needs to have an entry similar to this in the httpd.conf file, or I like to create a separate virtual_host.conf and include that in the main httpd.conf.
Things to note:
- The line with
SuexecUserGroupshould have the user/group for the project.
Create the php-fastcgi file
/var/www/cgi-bin/projectname/php-fastcgi file for each project. This allows php to run as FastCGI, and use suEXEC. The php-fastcgi file needs to be under suexec’s default directory path
Things to note:
- The directory and file created above must be have user/group of the project (the same as the user/group of the /var/projectname/ directory)
- The directory and file must be executable and writable by the owner ONLY.
- If you get Apache Internal Server errors, check
- For each site, you can specify how much RAM the APC module can use. For large, busy sites, you set this higher. Not setting this defaults to 64MB, which is a bit more than needed for the average WP site. Change the last line in the
exec /usr/bin/php-cgi -d apc.shm_size=128M
Comment out everything in the
/etc/httpd/conf.d/php.conf file so php is not loaded as a module when Apache starts.
/etc/sysconfig/httpd file to allow Apache to use multi-threaded mode (httpd.worker) which handles basic HTML files much nicer (less RAM). Uncomment the line with
Check the Apache configuration files to see if there are any errors.
service httpd configtest
If all good, restart Apache
service httpd restartThis will stop the running httpd service, and then start it again. Use this command after installing or removing a dynamically loaded module such as PHP. OR
service httpd reloadThis will cause the running httpd service to reload the configuration file. Note that any requests being currently processed will be interrupted, which may cause a client browser to display an error message or render a partial page. OR
service httpd gracefulThis will cause the running httpd service to reload the configuration file. Note that any requests being currently processed will use the old configuration.
pecl install apc
Set up log rotation for Apache
- Add a file