Separate PHP Error Logs for Multiple Domains with Plesk
[UPDATE: Added instructions for Plesk 11 for (dv) 4.0 servers]
I’ve put a few additional domains on my Media Temple (dv) 3.5, and it’s been great. One thing that was bugging me was not having an easy way to tell which domains were generating which scripting errors. When it was just my site, things were easy to follow, but with the addition of a BBS and a couple other WordPress installations, it was getting difficult to tell who was complaining about what.
Solution for Plesk 8
You can configure PHP to have a separate error log file for each VirtualHost definition. The trick is knowing exactly how to set it up, because you can’t touch the configuration directly without breaking Plesk.
Every domain name on your (dv) has its own directory in
/var/www/vhosts. A typical directory has the following top level directories:
cgi-bin/ conf/ error_docs/ httpdocs/ httpsdocs/ ...and so on
You’ll want to create a
vhost.conf file in the domain directory’s
conf/ folder with the following lines:
php_value error_log /path/to/error_log php_flag display_errors off php_value error_reporting 6143 php_flag log_errors on
Change the first value to match your actual installation. After you’re done editing the
vhost.conf file, test the configuration from the console with:
…or if you don’t have
apachectl (as Plesk 8.6 doesn’t seem to)…
And finally tell Plesk that you’ve made this change.
You MAY have to tell Apache to restart afterwards. If you see a server connection error, it’s possible that your path-to-error log passed syntax check, but wasn’t writable. Restart it with
apachectl restart or
Solution for Plesk 11
In 2012 I had to move from (dv) 3.5 to (dv) 4.0, which has a new version of Plesk and a different default PHP setup. Instead of using mod_php, it uses a FASTCGI version of php. The difference is that FastCGI PHP is persistent and therefore theoretically faster (though using more memory because of this) and PHP scripts run under the account user instead of the apache user. That’s great! However, it means that the vhost.conf approach for Plesk 8 doesn’t work, because FastCGI PHP uses a different configuration file.
Thankfully, Plesk 11 provides a control-panel way of doing what I once did manually, obliviating the need to create a vhost.conf file. Go to your domain in Plesk, which will take you to the subscription page where you can edit stuff. Click the Websites & Domains tab and then Show Advanced Settings, followed by Website Scripting and Security.
Next, look at the top of the screen and choose the PHP Settings tab. At the very bottom, there’s a place where you can enter additional directives. I entered the following (modify “yourdomain.com” for your needs):
error_log = /var/www/vhosts/yourdomain.com/httpdocs/error_log/php_error.log display_errors = Off error_reporting = E_COMPILE_ERROR | E_ERROR | E_CORE_ERROR log_errors = On
Save, and then make sure that the directory (here, ‘error_log’) is writable by yourself, and it should work. I should note that I’m duplicating some of the options in the form (display_errors, log_errors, error_reporting); the only custom directive you need if you use the controls is
error_log if you choose to be more considered in your approach.
Web-Based PHP Error Log Browsing
On my old host, FutureQuest, they had a nice built-in PHP Error Log viewer in the control panel. I thought it would be neat to make something similar, so I created a portable PHP script to help me monitor each domain separately.
To try it out, first download the script, unzip it, and then copy the entire folder to some place on your webserver. Then, point your browser to the folder and follow the directions. You can also read the
README.TXT file for directions. The script does some tests to make sure things are set up correctly, going so far as to insist that you password protect your directory. You can disable this check in the script directly, but you should probably do this to at least keep casual visitors from nosing around the sensitive parts of your server.
» Download error_log.zip