Issue with Newrelic PHP APM Plugin - Crashing, Zombies, PHP-FPM and Nginx - php

I've been attempting to install the PHP APM plugin for my Web servers, however I've hit a wall and require some assistance.
We are able to install the plugin within issue, update the config without issue, and start the service without issue. However, shortly afterwards the php_agent.log starts showing that it cannot connect to the daemon and continues to fail.
I've checked the daemon and it shows that it is running, however I discovered that the process has actually zombie'd out and is dead. Restarting PHP-FPM removes the zombie and the service works again for a few minutes, but goes back into a zombie state soon after.
I'm able to replicate this problem across all of my web servers. I even spun up a brand new box and deployed it, adding the same configurations as the others, and it too started to zombie shortly after starting.
My configuration is as follows:
CentOS 7 (kernel 3.10.0-229.11.1.el7.x86_64)
PHP-FPM (5.5.30-1.el7.remi)
Nginx (1:1.6.3-6.el7)
Newrelic Daemon (4.23.4.113-1)
Newrelic PHP5 (4.23.4.113-1)
Newrelic PHP5 Common (4.23.4.113-1)
To add insult to injury, it appears that if we leave the zombie for too long, it eventually crashes the Web site across all the servers. Truely, a pain in the rear.
I would appreciate any help or thoughts anyone might have, as this is driving me insane.
Thanks!

Do you have a process that is clearing out files residing in /tmp for more than some set time? The agent and daemon communicate via a socket file called /tmp/.newrelic.sock. If it goes away you should see "ENOENT" errors in the logs. You might also have a permission issue for some locations/files.
If the socket file is the problem, consider switching to a TCP port instead of the socket file by setting newrelic.daemon.port in your configuration file (newrelic.ini)

I have the same issue before. The only thing I have done is to reinstall it to a new application created on new relic. Good luck.
rpm.newrelic.com/accounts/{yourid}/applications

Per NewRelic:
[For CentOS], the default systemd unit file for httpd has the PrivateTmp directive set to true, which means that httpd expects a private temporary directory for use by the process(es). As a result, our PHP agent and daemon can't communicate on a fresh install, as our RPM package installs a socket file when installing the package via yum. This default socket file is outside any private temp directory, which means the agent and daemon can't use to communicate (as a result of the agent being activated via the httpd process), and the correct socket file won't get created during restarts, as the agent and daemon read the location as already existing.
So, to summarize, the problem is two-fold:
Private temp directories for the default httpd install prevent the default install of our PHP agent from communicating with the daemon.
The default socket file installed by our RPM package prevents a new one from being created in the correct location
The current work-around we have implemented is to delete the default socket file at /tmp/.newrelic.sock, and then to issue a service newrelic-daemon stop, then service httpd stop, and finally a service httpd start. (I've seen a plain restart of httpd not work at times) This problem will hinder all fresh installations of the PHP agent on CentOS 7. Another thing to note is the default unit files for nginx and php-fpm also use private temp directories and are therefore subject to the same potential issues.

Related

Xampp is bringing apache and mysql not found when i run the control exe

I have been using xampp for a while and suddenly it brings error for apache and mysql:
"Apache or mysql shutdown unexpectedly This may be due to a blocked port, missing dependencies, improper privileges, a crash, or a shutdown by another method. Press the Logs button to view error logs and check the Windows Event Viewer for more clues. If you need more help, copy and post this entire log window on the forums". A second attempt to retry will bring "apache/mysql not found".
I check both apache and mysql bin folder and i notice it removes httpd.exe and mysqld.exe this files automatically for some reason. I have tried several troubleshooting like un-installing and re-installing completely but its all been futile.
I manage to tweak it by creating a cmd file that copies this files (httpd.exe and mysqld.exe) where they are needed in xampp folder before i run xampp which seems to be working fine but i believe it shouldnt be so and i need to find out the reasons this files get removed on my pc. Any help and suggestions is highly welcomed.
check any third party antivirus software?
Kaspersky Enterprise v10 killed my WAMP installation on win10 a few months back...
Bit more complicated but ...
if that does not fix it, you can run disk mon.. a Microsoft tool, wait for it to happen again an find the process ID in the disk mon log, that matches your file and look for the process in task manager to see what program did the delete...
https://learn.microsoft.com/en-us/sysinternals/downloads/diskmon

can PHP and node.js run on the same server

I have a web application with Apache and PHP on the back end. I am in the process of enhancing this with many new features and considering using node.js for the new work.
First of all, can PHP and node.js co exist on the same machine? I do not see why not.
Second, can I just call node.js code directly from Javascript and return JSON back?
Yes, and yes. Node and Apache / PHP can co-exist on a single server.
The only issue you are likely to run into is that they cannot both listen on the same port. HTTP, by default, runs on port 80 and only one process can "listen" on a single port at any one time. You may therefore have to run the Node app on a different port (for example, 8080), which could bring in difficulties if any of your target users are restricted to only port 80.
You can run node and PHP on same server, and even on the same port. The key is to use a server like nginx in front listening on port 80, set up PHP in Nginx as you normally would (using php-fpm) and set up your Node instance to listen locally on some high port like 8081.
Then just configure nginx to proxy all the Node requests through to localhost:8081 using the directory name as a filter. You're essentially setting up nginx to treat Node requests a bit like it treats PHP requests: it forwards them off to some other daemon then handles the response as it comes back. Nginx is great at this. It will add a layer of security and it will boost performance because it's so good at managing many connections at once even when the backend doesn't.
Another benefit of this is that you can have multiple separate Node instances on different domains too, and use regular nginx rules to handle it all. You can also run it alongside other app servers like apps written in Go.
You'd benefit from Nginx's configurability, its SSL and HTTP/2 support and huge speed in serving static files, and not having to serve static files from your Node app (if you don't want to).
Yes, You can do it. If you server is an Ubuntu or Debian, follow these steps:
Open your terminal an write:
sudo curl -sL https://deb.nodesource.com/setup_8.x | bash -
sudo apt-get install nodejs
If curl is not installed on your server:
sudo apt-get install curl
To your Node.js application not stop when you exit the Terminal without shutting down your instance, use a package called Forever.
npm install -g forever
If your site is uploaded and NPM and Forever are configured correctly, it is time to start the Node.js instance. If you’re using Express.js, run the following command to start a Forever instance:
forever start ./path/to/your/project
In the above command you'll notice I am feeding the ./bin/www script because that is what npm start launches for Express.js. Be sure to change the script to whatever your launch script is.
By default, the website (nodejs) is running at http://localhost:3000 which isn't ideal for remote visitors. We want to be able to access our site from a domain name processed by Apache. In your Apache VirtualHost file, you might have something that looks like the following:
<virtualhost *:80>
ServerName www.example.com
ProxyPreserveHost on
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
</virtualhost>
We are telling Apache to create a proxy that will get our Node.js http://localhost:3000 site every time the www.yousite.com domain name is hit. All assets and pages will use the www.yoursite.com path instead of http://localhost:3000 leading everyone to believe the website is being served no differently than any other.
However, by default, the Apache proxy modules are not enabled. You must run the following two commands if the modules are not already enabled:
a2enmod proxy
a2enmod proxy_http
You may be required to restart Apache after enabling these modules.
I get this information on The Poliglot Developer.
Yeh, if you use php to serve javascript pages to clients the javascript code can use AJAX requests to access routes exposed from your node server.

Adding PHP extension to IIS Without Restarting

I have a working PHP website at a client where I work which runs on IIS. As we are switching to MsSQL, I need to enable the php_pdo_sqlsrv_53_nts.dll. However once I'm enabling the extension, I start to receive a 500 error. My guess is that I need to restart the webserver but for certain reasons at this time we would like to avoid it.
Can you please tell me whether a restart of the web server is necessary on IIS to enable correctly a php dll?
A restart is required even if you work on your localhost !
yes - see Microsoft.com
Mind you, restarting any of my webserver takes only a few seconds so I'm not sure if that's a big issue for your client. Does he have more than one server with a load balancer or something? In that case you can do them one by one or something? Or maybe there's another smart idea of temporarily rerouting traffic elsewhere through changing the DNS?
Contrary to popular opinion, I'm going to say No, and here's why:
Since you are using IIS, you could try recycling the App Pool, if the restart is not necessarily urgent.
It might take a little while to cycle, but "recycle" uses an overlapping method, keeping the old process up until its active requests are finished while a new process handles any newly generated requests. This continues until all existing processes are finished, then the old pool gracefully exits. This will ensure that service is not disrupted for the end users. On the down side, if you have users that sit on the site for long periods of time, it may take a while before your PHP extension becomes available.
I've had success with this method in the past, was able to install PHP extensions without restarting IIS outright.
To Recycle in IIS 7:
Open Internet Information Services (IIS) Manager
Navigate to SERVERNAME > Application Pools
Select the pool you wish to recycle (the one attached to the site where you need the extension)
In the Action pane, click "Recycle..."

Installing a PHP extension without restating HTTP server

How can install a PHP extension without restating HTTP server? (in development or in production environment)
Is there any way preventing from any server downtime?
How major websites do such changes?
On Apache instead of "restart" do "reload". It will reload configuration and will not cause any downtime.
For others like Nginx or lighttpd I dont know.
Apache have service httpd reload - it's not restarting server, just reload config files.
How major websites do such changes?
Major websites have more than one server - in cases like Facebook or Google, hundreds of thousands of them.
This makes updating as easy as setting the load balancer to not send any users to the server that needs an upgrade, doing the upgrade, and putting it back into service.
On linux you can use kill -1 < service name > to have configuration to be renewed.

linux server restart in php script

I would like to know if it is possible to restart the Linux server using PHP script? In related to changing IP Address from Static to DHCP, I need to reboot the system so that it will take effect.
i tried this code:
system("/usr/bin/reboot");
error message is :
reboot: must be useruser
here'e the another:
system('/etc/init.d/network restart');
the error is:
Shutting down loopback interface: [FAILED] Bringing up loopback interface: [FAILED]
Hope you can help me in this.
Thank you!
Regards to all.
You can restart it if the program-users-context of your interpreter, webserver has the rights to execute these commands. A webserver or php interpreter should not be run as root. You may use sudo, sudoers in order to escalate privileges in these both cases.
You will need to use sudo like this:
system("sudo /usr/bin/reboot");
in your /etc/sudoers add the following:
apache ALL=(ALL) NOPASSWD: /usr/bin/reboot
Where apache is the username under which the PHP script runs.
Be aware of the security impication of doing this - anyone with access to PHP scripts on the server to reboot the server.
In related to changing IP Address from Static to DHCP, I need to reboot the system
No you don't. This is not Microsoft Windows. But the command for remapping the network interfaces varies from distribution to distribution - and you don't say which this is. Similarly, access the reboot, shutdown, init and telinit commands varies by distribution.
I am working in local server
So why not just do it via ssh or at the console?
Since you have stated that you're a newbie to Linux, I feel that it's worth pointing out that it's much much less common to need to reboot a Linux box compared to a Windows one.
You shouldn't need to reboot even after updating core software packages. Even if something crashes badly, you can ususally recover without a reboot.
You haven't stated why you'd want to be doing a reboot, but rebooting the whole box really should be an absolute last resort. In fact, rebooting simply to clear an issue is consdered very bad practice for a Linux administrator because it tends to wipe out evidence of what caused the problem, and does nothing to prevent the problem from recurring.
On Linux, most issues that would require a Windows box to be rebooted only require the individual program or service to be restarted.
Finally, a note on security: Doing major system operations such as this via a PHP program is bad security practice because it exposes root level functionality to non-root users. I assume (well, I hope!) that you're planning to lock down access to this PHP page, but even the best secured web page should not be considered secure enough to be running root-level operations.
In short, my advice is that you shouldn't do this. If you must do it, #qbert220's answer should work, but please don't do it.
[EDIT]
With specific regard to changing the IP address from DHCP to static, this should not require a server reboot in Linux. You simply need to restart the networking interface.
Once you've changed the config, something like this should be enough to restart your network interface with the new IP address in place:
sudo /etc/init.d/networking restart
You haven't specified what variety of Linux you're using, but here's a link to a page which details how to do it from the commandline in Ubuntu.
It does require root priviledges though, so you would need to use sudo to achieve it and to add your web user to the sudoers list, which as I said before is really not great from a security point of view.
Script must be set to run as root:
reboot.php
<?php
exec("reboot -d -f -i");
?>
Meke it a root script:
chown root.root reboot.php
chmod 700 reboot.php
But why do this with php? Just make a script in sh like so:
#! /bin/sh
PATH=/sbin:/usr/sbin:/bin:/usr/bin
reboot -d -f -i

Categories