Re: php-fpm unable to connect to active socket - solution
| From: | John | Date: | Tue, 11 Sep 2018 03:48:17 +0000 |
| Subject: | Re: php-fpm unable to connect to active socket - solution | ||
| References: | 1 2 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-326556@lists.php.net to get a copy of this message | ||
On Mon, 2018-09-10 at 14:31 -0400, John wrote:
> From: John <john.iliffe@iliffe.ca>
> Reply-to: john.iliffe@iliffe.ca
> To: PHP List <php-general@lists.php.net>
> Subject: php-fpm unable to connect to active socket - update
> Date: Sun, 09 Sep 2018 00:07:14 -0400
>
> > I changed from PHP 5.6.30 to PHP 7.2.9 and now I am unable to run scripts
> > that
> > access pgsql using socket 5432. The old PHP 5.6.30 works as expected.
> >
> > The configuration is apache using php-fpm to execute the PHP
> > scripts. scripts
> > that use PHP but do not connect to the database seem to work OK but haven't
> > been
> > fully tested yet.
> >
> > php-fpm is started using the systemd script included with the download.
> > Formerly PHP 5.6.30 was started as an init.d script.
> >
> > Error message is:
> >
> > ---------------
> > Warning: pg_connect(): Unable to connect to PostgreSQL server: could not
> > connect
> > to server: No such file or directory Is the server running locally and
> > accepting
> > connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
> > ---------------
> >
> > ls -a /tmp/.s.*
> > /tmp/.s.PGSQL.5432
> >
> > ss -a | grep 5432
> > u_str LISTEN 0 128 /tmp/.s.PGSQL.5432 29050 *
> > 0
> >
> > Restarting PHP 5.6.30 immediately reconnects to socket 5432 as always and
> > all
> > scripts calling the database work as expected. I have stopped and started
> > both
> > versions of PHP multiple times, and also pgsql, so it doesn't appear to be a
> > lock on the socket from PHP 5.6.30 causing the problem.
> >
> > The configure parameters to make are (taken from php_info):
> >
> > './configure' '--prefix=/usr/php-7.2.9'
> > '--with-apxs2=/usr/apache-
> > 2.4.25/bin/apxs' '--enable-fpm' '--with-fpm-user=phpfpm'
> > '--with-fpm-
> > group=phpfpm' '--with-fpm-systemd' '--disable-short-tags'
> > '--with-
> > openssl=/usr/openssl-1.1.0i' '--with-zlib'
> > '--with-pgsql=/usr/postgres-
> > 9.6.2'
> > '-
> > -with-pear' '--with-libxml-dir=/usr/lib64'
> >
> > Can anyone see anything that might be causing this? Or suggest some way to
> > try
> > and debug it?
> >
> > Thanks in advance.
> >
> > John
>
> =====================================
> I have been trying to resolve this issue and I have some addition information
> now:
>
> 1. CLI invocation of these scripts works as expected; only php-fpm
> fails
>
> 2. php-fpm is issuing an error message about not being able to reach
> the
> Unix domain socket on 5432; I think this should be a TCP socket 5432.
>
> [10-Sep-2018 13:48:46] WARNING: [pool xxxx] child 15848 said into stderr:
> "NOTICE: PHP message: PHP Warning: pg_connect():
> Unable to connect to PostgreSQL server: could not connect to server: No such
> file or directory"
> [10-Sep-2018 13:48:46] WARNING: [pool xxxx] child 15848 said into stderr:
> " Is the server running locally and accepting"
> [10-Sep-2018 13:48:46] WARNING: [pool xxxx] child 15848 said into stderr:
> " connections on Unix domain socket
> "/tmp/.s.PGSQL.5432"? in /httpd/xxxx/dm0002.php on line 202"
>
> Here is line 202 of that script:
>
> $db_handle = pg_connect('dbname=xxxxxxx user=uuuuuu password=yyyyyyyy');
>
> I'm not at all sure why pg_connect() would be trying to reach a Unix domain
> socket from php-fpm and a TCP socket from php CLI.
>
> For completeness, here is another line from ss -a that may apply:
>
> tcp LISTEN 0 128 127.0.0.1:postgres *:*
>
> I checked the PHP-5 to PHP-7 migration information and there is nothing
> regarding socket type changes between them in the documentation. I also
> checked
> the online manual and while I can see how to force a domain socket I can't see
> anything about going the other way.
>
> This looks like a configuration error but I can't find any parameter in either
> php.ini or php-fpm.conf that applies.
>
> Any suggestions?
>
> John
> ============================================
I finally got this resolved, not where I would have expected!
The problem was in the systemd service file provided with php-fpm. The
parameter PrivateTmp is set to true. Unfortunately, that masks the real /tmp
directory which is where the socket file for pgsql is located. Since I can't
change that location without breaking everything else that uses pgsql, a lot of
things on this server, I set PrivateTmp to false and everything works as it
should.
This may be a security issue, although if so it has existed for a long time, but
even so it would be nice if the documentation mentioned it somewhere. At least
one would know where to begin to search for an answer.
John
========================================================