So I'm tasked with making httpd hold its own weight better against nginx
as a reverse proxy to a local service. Unfortunately, nginx supports UDS
and we don't quite yet. I've come across a bug that seems easy enough to
fix, but I am wondering if there's a better way. Thoughts are welcome.

With the currently proposed UDS support in mod_proxy, first requests
always seem fine but subsequent requests for the worker fail (attempted
DNS lookup when none should be done). I wouldn't have +1'ed had I
realized this at the time, but I have a proposed fix...

--- httpd-2.4.6-UDS/modules/proxy/proxy_util.c  2013-08-09
15:12:23.000000000 -0500
+++ httpd-2.4.6/modules/proxy/proxy_util.c      2013-08-09
15:15:33.000000000 -0500
@@ -2127,7 +2127,7 @@
      */

     if (!conn->hostname || !worker->s->is_address_reusable ||
-        worker->s->disablereuse || strncmp(conn->hostname, "socket=",
7) == 0) {
+        worker->s->disablereuse) {
         if (proxyname) {
             conn->hostname = apr_pstrdup(conn->pool, proxyname);
             conn->port = proxyport;

I haven't spent a ton of time on this so I'm wondering... This seems
simple enough, but isn't there a place we could do this once to avoid
having to execute the same logic (substring and path decode) on all
subsequent requests? I'd also much rather not have to do a string
comparison on all subsequent hits...

If I don't hear anything otherwise, I'll just commit this and add it to
the backport proposal next week or so


P.S.
My simple tests with 100 concurrent users for a total of 1,000,000
requests yielded the following numbers (with the above patch applied).
The backend supports about 20k requests/sec. This seems to be a mighty
compelling case for UDS...

nginx UDS: 16001.28
nginx UDS: 18138.94
nginx UDS: 15499.64

Apache UDS: 16348.70
Apache UDS: 14580.92
Apache UDS: 15211.97

Apache TCP: 11859.46
(only got one in)

-- 
Daniel Ruggeri

Reply via email to