Re: mod_proxy doesn't persist connections to php-fpm

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Nov 14, 2013 at 4:12 PM, Chandler, Dean A <dean.a.chandler@xxxxxxxxx> wrote:

Hi,

                I am trying to run Apache 2.4 web server using mod_proxy and proxy_fcgi to proxy php requests to the PHP-FPM running on same machine.  I am pretty much using default setup for php-fpm.ini with port at 9000.  My problem is that mod_proxy is closing the connection after every request is complete so I end up with 1000’s of sockets in TIME_WAIT and eventually apache quits creating sockets. I am using the following proxy statement to send requests to the php-fpm process.


Funny...  I sent this long explanation to somebody recently with a suggestion on what to try:

mod_proxy_fcgi should share mod_proxy's general ability to pool connections to a backend, but there has always been line of code in mod_proxy_fcgi that marks all connections for closure at the end of the request.  I just found the commit from 7 years ago that does it:

http://svn.apache.org/viewvc?view=revision&revision=383278

That line has subsequently moved around a little and the field changed; it looks like this now:

    /* XXX Setting close to 0 is a great way to end up with
     *     timeouts at this point, since we lack good ways to manage the
     *     back end fastcgi processes.  This should be revisited when we
     *     have a better story on that part of things. */
    backend->close = 1;

I think the point of the commit message is that:

* typically you have small connection capacity in the FastCGI application
* typically your Apache configuration has a number of Apache child processes handling client requests

In this typical scenario you can easily have a number of connections to the FastCGI application which are ready to be reused but they are owned by specific Apache child processes and the Apache child handling a request may not be the one that already has the connection, and the FastCGI app may not accept more connections until some of the other ones are closed.  (I.e., the new request waits for some timeout in the app which allows it to close an existing connection and accept a new one).

If you have configured Apache with a very small number of child processes and YOUR-BACKEND has good connection capacity (i.e., will accept many concurrent connections), you could try commenting out that line "backend->close = 1" in the bit of code shown above and see how it works for you.  (Don't comment out every occurrence of "backend->close = 1", since the backend connection should be closed after certain types of errors.)

Assuming that it works fine, check with netstat to see if the typical number of connections to YOUR-BACKEND decreased any. 

Reusing the same connections is only effective with a relatively small number of Apache child processes.  (I guess you are using Event or Worker MPM?)

 

 

<LocationMatch ^/(.*\.php(/.*)?)$ >

       ProxyPass fcgi://127.0.0.1:9000/home/httpbld/htdocs/$1 ttl=300000 keepalive=On connectiontimeout=300 ttl=300 max=128

</LocationMatch>

 

Below is log file showing connections

 

 

[Wed Nov 13 11:42:56.176124 2013] [proxy:debug] [pid 225428:tid 139934623480576] proxy_util.c(2194): [client 220.6.6.158:34023] AH00947: connected /home/httpbld/htdocs/status.html/status to 127.0.0.1:9000

[Wed Nov 13 11:42:56.176159 2013] [proxy:trace2] [pid 225428:tid 139934623480576] proxy_util.c(2446): FCGI: fam 2 socket created to connect to 127.0.0.1

[Wed Nov 13 11:42:56.176985 2013] [proxy_fcgi:trace4] [pid 225428:tid 139934623480576] util_script.c(521): [client 220.6.6.158:34023] Headers from script 'status':

[Wed Nov 13 11:42:56.177038 2013] [proxy_fcgi:trace4] [pid 225428:tid 139934623480576] util_script.c(522): [client 220.6.6.158:34023]   X-Powered-By: PHP/5.5.5

[Wed Nov 13 11:42:56.177060 2013] [proxy_fcgi:trace4] [pid 225428:tid 139934623480576] util_script.c(522): [client 220.6.6.158:34023]   Expires: Thu, 01 Jan 1970 00:00:00 GMT

[Wed Nov 13 11:42:56.177071 2013] [proxy_fcgi:trace4] [pid 225428:tid 139934623480576] util_script.c(522): [client 220.6.6.158:34023]   Cache-Control: no-cache, no-store, must-revalidate, max-age=0

[Wed Nov 13 11:42:56.177082 2013] [proxy_fcgi:trace4] [pid 225428:tid 139934623480576] util_script.c(522): [client 220.6.6.158:34023]   Content-Type: text/plain

[Wed Nov 13 11:42:56.177196 2013] [proxy:debug] [pid 225428:tid 139934623480576] proxy_util.c(2035): AH00943: FCGI: has released connection for (127.0.0.1)

 

Please let me know if there is any way to enable reuse of connection to the php-fpm process.

 

                Thanks,

                                Dean..




--
Born in Roswell... married an alien...
http://emptyhammock.com/

[Index of Archives]     [Open SSH Users]     [Linux ACPI]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Squid]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux