2013-09-27 3 views
1

Я хотел бы настроить nginx как балансировщик нагрузки. Но я хочу настроить его таким образом, чтобы определенные запросы (с определенным параметром) переходили только к определенным узлам. В основном идея состоит в том, чтобы использовать любой хост на исходном запросе, затем, если пользователь задает определенный параметр, например. bla0, а затем перенаправить запросы на проведение 0, в то время как для bla1 пройдет 1. Так вот конфигурация, которую я придумал:nginx load balancer/location puzzle

# load balancing server 
server { 
    listen 8000; 
    server_name example.com www.example.com; 

    # requests to bla0 server 
    location ~ ^(/request).*bla0$ { 
     proxy_pass http://localhost:8081; 
    } 

    # requests to bla1 server 
    location ~ ^(/request).*bla1$ { 
     proxy_pass http://localhost:8082; 
    } 
    # for default location use balancer 
    location/{ 
     proxy_pass http://cluster; 
    } 

} 

upstream cluster { 
    server localhost:8081; 
    server localhost:8082; 
} 

Но, к сожалению, эта конфигурация не работает. Я всегда получаю круговые запросы, т. Е./Запрос? Q = bla0 переходит на любой из хостов. Что мне не хватает.

ответ

1

Местоположение не соответствует параметрам. От http://wiki.nginx.org/HttpCoreModule#location

Расположение директива только пытается соответствовать от первого/после имени хоста, просто перед первым? или #. (В пределах этого диапазона, он соответствует неэкранированный URL.)

Похоже, вам нужно использовать директиву arg_* внутри if(), но я не уверен в этом. Ах здесь мы идем, this выглядит так, как вы хотите.

+0

Отличный совет, это то, что я искал. Таким образом, правила местоположения становятся такими: location/{proxy_pass http: // cluster; if ($ args ~ pattern1) {proxy_pass http: // host1} if ($ args ~ pattern2) {proxy_pass http: // host2}} – Valentin