Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

I'm using HAProxy to load balance the incoming requests on my two tomcat backend servers. In the config file when I specify HAProxy to listen to the same machine on which the HAProxy is installed, everything is fine and it starts to work like a charm. I need HAProxy to listen to a virtual IP on another machine (so that I can install another LB as failover), but when I config HAProxy to do so, I get this error on starting HAProxy:

cannot bind socket for proxy http_proxy. Aborting.

here is my config file:

global
    maxconn 4096 # Total Max Connections. This is dependent on ulimit
    daemon
    nbproc 4 
defaults
    mode http
    clitimeout 60000
    srvtimeout 30000
    contimeout 4000
    option httpclose # Disable Keepalive

listen http_proxy 10.0.5.99:80 #the virtual IP I want to listen to
    mode http
    stats enable
    stats auth xxx:xxx
    balance source # Load Balancing algorithm
    option httpchk
    option forwardfor # This sets X-Forwarded-For
    ## Define your servers to balance
    server web1 10.0.5.102:8080 weight 1 maxconn 512 check
    server web2 10.0.5.103:8080 weight 1 maxconn 512 check

I'm using CentOS 5.1 installed on some virtual machines. It's necessary to say that I completely stopped the iptables service on the remote machine and the problem is still there. I suppose something is interfering with haproxy in the remote machine. Any Ideas?

share|improve this question

3 Answers 3

You can also allow a process to bind to a non-local (i.e., non-existent IP) by adding net.ipv4.ip_nonlocal_bind=1 to /etc/sysctl.conf and running sysctl -p. But what sysadmin1138 is valid: you may want to look at how you've architected your failover.

share|improve this answer
    
Non-local bind! THAT'S What I was trying to remember. –  sysadmin1138 Apr 7 '12 at 13:35
    
@cjc: I see what you're saying buddy. I gave it a shot and it didn't work because the IP I'm trying to listen to does exist, but HAProxy can't listen to it. Something is blocking the process I suppose. –  SJ.Jafari Apr 9 '12 at 9:55

When doing a failover config like you say you want, I've found that it's better to let the clustering mechanism handle the moving of IP addresses rather than somehow doing it in HAProxy. You configure the virtual IP address to move between nodes, and then configure it to have a service (HAproxy) follow that virtual IP. You then configure HAProxy to only listen on the virtual IP. This works because it's the clustering software that starts and stops the HAproxy process as it moves around, you don't do it from the normal services.

share|improve this answer
    
Thanks for the answer, I see your point and I'm kinda confused! I thought something like heartbeat would just make sure about high availability of my LBs and my plan was to install it when I needed to add another LB. But it seems there is more about these clustering softwares, could u guide me more on this? What specific tool should I use? What steps should I take? (Sorry I'm sort of a noob to the technology) –  SJ.Jafari Apr 7 '12 at 13:06
    
@SJ.Jafari You'd use Heartbeat to make the LB highly available. If you need more than one load-balancer running at the same time, things get a lot more complicated. –  sysadmin1138 Apr 7 '12 at 13:38
    
Well, that's what I thought. But the problem isn't that right now, the problem is HAProxy won't listen to another IP. It's kinda an OS ish difficulty I think. –  SJ.Jafari Apr 8 '12 at 9:28
1  
@SJ.Jafari look at my Answer about the kernel setting to do a non-local bind. –  cjc Apr 8 '12 at 12:11

You are getting the error because haproxy tries to listen on non-existing IP address. It seems that you are starting haproxy process before VIP get assigned to the machine.

One solution is to listen on all interfaces 0.0.0.0. You can then restrict access to the VIP using iptables if needed.

Another option is to listen on the VIP, but you need to make sure the VIP exists when starting haproxy. This can be done by letting the clustering software (such as keepalived) start haproxy for you when it acquires the VIP.

share|improve this answer
    
I'm afraid to disagree with your scenario, because that IP IS assigned to a machine in the network and I can ping to that machine from the LB before starting HAProxy. –  SJ.Jafari Apr 7 '12 at 12:47

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.