Forum Discussion

david_wang_2073's avatar
david_wang_2073
Historic F5 Account
Aug 05, 2006

http::redirect based on [LB::server addr]

Hi, All,

 

 

We are trying to do rtsp load balancing with redirect method, but the rtsp servers were located in different data center and not belong to the same subnet with BIG-IP.

 

 

The rtsp server will be chosen by BIG-IP with dynamic ratio method.

 

 

Now my question is that, after a rtsp server was selected, how can BIG-IP rediect the rtsp request.

 

 

I did a very simple test with irule as below:

 

 

when HTTP_REQUEST {

 

log local0. "in HTTP_REQUEST [HTTP::uri]"

 

 

}

 

 

when LB_SELECTED {

 

log "Selected server is [LB::server addr]"

 

HTTP::redirect "rtsp://www.yxsx.com/vod/shipin1_isdn.rm"

 

 

}

 

 

But I got following error message:

 

 

01070151:3: Rule [http_redirect] error: line 8: [command is not valid in current event context LB_SELECTED] [HTTP::redirect rtsp://www.yxsx.com/vod/shipin1_isdn.rm ]

 

 

It seem that http_redirect can not be used in LB_SELECTED.

 

 

Anybody has idea how to solve this problem?

 

 

Thanks,

 

 

David Wang

 

 

  • david_wang_2073's avatar
    david_wang_2073
    Historic F5 Account
    I change the irule to below

     

     

    when HTTP_REQUEST {

     

    log local0. "in HTTP_REQUEST [HTTP::uri]"

     

     

    }

     

     

    when LB_SELECTED {

     

    set server_addr [LB::server addr]

     

    log "Selected server is [LB::server addr]"

     

    node 192.168.20.3 80

     

    clientside {TCP::respond "HTTP/1.1 302 Found\r\nLocation: rtsp://www.yxsx.com/vod/shipin1_isdn.rm\r\nConnection: close\r\nContent-Length: 0\r\n\r\n"}

     

    LB::detach

     

     

    }

     

     

    now redirect can be done in LB_SELECTED event. But the request from client side was still sent to the pool membber, but I hope all the requests from client side can be sent to 192.168.20.3.

     

     

    The node 192.168.20.3 is not a server in the pool to be selected.

     

     

    I used tcpdump to capture packet in internal vlan and found the request from client side were still sent to the server in the pool instead of 192.168.20.3.

     

     

    How should I change my rule to do it?

     

  • david_wang_2073's avatar
    david_wang_2073
    Historic F5 Account
    sorry, it turns out that the irule I just post can not work. Anybody has idea how to implement it, I would highly appreciate.

     

  • david_wang_2073's avatar
    david_wang_2073
    Historic F5 Account
    I still have not found a way to do redirect in LB_SELECT, so I have to do it in SERVER_CONNECTED, which means that client have to setup a connection with a real server before the a redirect packet is returned.

     

     

    when SERVER_CONNECTED {

     

    log "server connected event"

     

    log "Selected server is [LB::server addr]"

     

    TCP::collect

     

    TCP::payload replace 0 [TCP::payload length] "RTSP/1.0 302 Found\r\nLocation: rtsp://www.yxsx.com/vod/shipin1_isdn.rm\r\nConnection: close\r\nContent-Length: 0\r\n\r\n"

     

    }
  • Deb_Allen_18's avatar
    Deb_Allen_18
    Historic F5 Account
    Hi David -

    If you simply want to redirect all traffic to a different data center by URI, you can issue the redirect in HTTP_REQUEST::
    when HTTP_REQUEST {
      log local0. "in HTTP_REQUEST [HTTP::uri]"
      HTTP::redirect "rtsp://www.yxsx.com/vod/shipin1_isdn.rm"
    }
    If instead you want to proxy the request to pool members that are in different data centers from the BIG-IP, there are a couple of ways to accomplish that, depending on your architecture... Post back if that's what you're after.

    /deb