Post Archive
WordPress, and the Pingback of Death
The journey to discover why I couldn't keep a website up.
I host a number of websites for clients, friends, and family. A solid number of those are running WordPress.
I rarely suffer problems with them... except for one site. This site has been going down, and staying down, to the point that I routinely SSH in to forceably restart the locked-up PHP processes.
I've tried to fix it in the past to not avail. Previously I've migrated the site to a new host with an updated OS, tweakes a great many configuration settings all over the system and site, and very recently I've changed the server setup to match that of other high-traffic WordPress sites I host.
But the lockups have been increasing with frequency to the point where, today, the site would not stay up for more than 30 minutes before refusing connections.
Finally fed up, this is my journey to fix it.
Pseudo suExec with PHP Behind Nginx
For those who don't want to run more than one php-cgi... for some reason.
I recently started transitioning all of the websites under my management from Apache to nginx (mainly to ease running my Python webapps via gunicorn, but that is another story).
Since nginx will not directly execute PHP (via either CGI or nginx-managed FastCGI), the first step was to get PHP running at all. I opted to run php-cgi
via daemontools; my initial run
script was fairly straight forward:
1 2 | #!/usr/bin/env bash exec php-cgi -b 127.0.0.1:9000 |
Couple this with a (relatively) straight forward nginx configuration and the sites will already start responding:
server { listen 80; server_name example.com root /var/www/example.com/httpdocs; index index.php index.html; fastcgi_index index.php; location ~ \.php { keepalive_timeout 0; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$uri; fastcgi_pass 127.0.0.1:9000; } }
The tricky part came when I wanted to run PHP under the user who owned the various sites. I could have (and perhaps should have) opted to spin up a copy of php-cgi
for each user, but I decided to try something a little sneakier; PHP will set its own UID on each request.
There are no more posts tagged "PHP".