7

My Nginx reverse proxy works on the same machine as the webserver(apache) as follows

server {  server_name site.net;
    location / {
        proxy_pass http://localhost:82;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;

    }
}

Now instead of using TCP connections to the backend apache, how can I tune it to use unix sockets?

Edit:
Can someone help with the full flow, instructing apache to listen on unix sockets too

2
  • 3
    AFAIK Apache doesn't support listening on a socket ... its a web server. If performance is your reason for doing this, the difference between sockets/tcp is negligible for most web servers - as the bottleneck is whatever app is running anyway (PHP/Perl etc.) Commented Oct 2, 2012 at 21:04
  • I assume you have too many connections which stack up so you want to move proxy from tcp stack to socket. I would suggest you to try disable keepalive; also it might help to enable TCP_TW_REUSE (net.ipv4.tcp_tw_reuse) Commented Oct 8, 2012 at 11:16

2 Answers 2

11
+25

While you most likely could set Nginx to proxy redirect to a socket using unix:/path/to/socket syntax, Apache Listen directive only accepts IPv4 or IPv6, so as far as I know you can't get Apache to listen on an unix socket.

3
  • It would be trivial to script a proxy to map the unix socket to a network socket - but you lose any performance benefit. OTOH the lo interface doesn't have nearly the same performance constraints as a physical interface, even if it does slow start, as long as you've got big congestion windows then it should run at nearly the same speed as a unix socket.
    – symcbean
    Commented Oct 5, 2012 at 11:49
  • Socket will still have edge on small requests where latency is essential.
    – c2h5oh
    Commented Oct 8, 2012 at 16:38
  • 1
    The why route them via a proxy?
    – symcbean
    Commented Oct 22, 2012 at 10:05
6

You need to define an upstream like this:

upstream upstream_name {
        server unix:/path/to/socket fail_timeout=0;
}

And then set proxy_pass to reference that upstream by name, i.e.,

proxy_pass http://upstream_name
4
  • What about the webserver? Apache in this case. Commented Sep 28, 2012 at 19:10
  • Possible to give an answer with a full flow? Commented Sep 28, 2012 at 19:10
  • 1
    In a brief search, I couldn't find anything in the documentation that indicated that Apache is capable of listening on a unix domain socket. Commented Sep 28, 2012 at 19:58
  • 5
    There is no need to define upstream to proxy requests to a unix socket, proxy_pass http://unix:/path/to/socket:; would do the trick as well, see nginx.org/r/proxy_pass. Commented Oct 3, 2012 at 15:50

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .