Report to New Relic APM on cPanel/CloudLinux with CageFS
I finally found out how to get PHP apps hosted on a cPanel server with CloudLinux and CageFS enabled to report to New Relic APM.
Since I spent days searching and trying, with giving up on several occasions, I figured this definitely deserves a post on my blog.
So, how did I manage to have apps report to new relic for ALL enabled cagefs users, and them being able to use their own new relic license/account?
Well, the problem was the default settings for the socket. The socket was simply not available for cagefs users being in the /tmp folder.
Login via ssh and check /tmp as root and as a user, and you will see that .newrelic.socket is missing for the users (~$ ll /tmp)
AFAIK this is due to cagefs creating "fake" /tmp directories for each user, for example you will see all the sessions of a user only in the /tmp of the user, but not in the physical /tmp of the server's fileystem.
To get around this, I did the following:
1. I created the folder /var/run/newrelic-global/ (not sure if it was necessary)
2. I added the following lines in /etc/newrelic/newrelic.cfg:
port = "/var/run/newrelic-global/.newrelic.sock"
3. I added the following line in /etc/cagefs/cagefs.mp:
After that I ran these commands:
~$ /etc/init.d/newrelic-daemon restart
~$ cagefsctl --remount-all
Now, users can either define the php flags via .htaccess (if possible), or configure their own php.ini (if available), depending on how the server has been configured and/or what their preferences are. Below the example of what to do in the .htaccess file.
php_value newrelic.daemon.port "/var/run/newrelic-global/.newrelic.sock"
php_value newrelic.daemon.pidfile "/var/run/newrelic-global/newrelic-daemon.pid"
php_value newrelic.license "MyNewRelicLicense"
php_value newrelic.appname "MyAppName"
</IfModule>
To check, if it is working, have a look at the log file (Default location is: /var/log/newrelic/newrelic-daemon.log). You should see something like this:
…info: [‘MyAppName'] ‘Reporting to:…
…
Before all this, you should of course install the php agent:
https://docs.newrelic.com/docs/agents/php-agent/installation/php-agent-installation-redhat-centos
It will ask to update the php.ini during the installation of the agent. Select the one located in /usr/local/lib.
Once the installation is completed, run ~$ cagefsctl --force-update (those are 2 dashes infront of force-update).
Also, you may want to have a look at this page, if you are using the newrelic-sysmond daemon to monitor your server.
https://www.lucasrolff.com/cpanel/new-relic-and-cloudlinux/
Enjoy
1727
I think this just gave me the solution for how to use a memcached socket for php sessions of CageFS enabled accounts… I have a feeling I’ll create a post on that soon, too.
Hello there :-)
You get errors in Apache if you put in the “=” sign.
php_value newrelic.daemon.port = “/var/run/newrelic-global/.newrelic.sock”
php_value newrelic.daemon.pidfile = “/var/run/newrelic/newrelic-daemon.pid”
php_value newrelic.license = “MyNewRelicLicense”
Also the value in this line does not include the folder “newrelic-global”
php_value newrelic.daemon.pidfile = “/var/run/newrelic/newrelic-daemon.pid”
It should be ?
php_value newrelic.daemon.pidfile “/var/run/newrelic-global/newrelic-daemon.pid”
Hi,
good catch about the php_value and missing -global, I have corrected it, thanks.
I did not use the .htaccess to do this, so I wasn’t paying as much attention to the details as I should have.