Я использую прямой прокси-сервер, где я хочу пересылать определенные запросы на разные прокси-серверы с помощью ProxyRemote. Какой запрос отправляется на какой сервер, зависит от многих факторов (время, нагрузка, URL, хост, пользователь, ...) и должен быть рассчитан внешней программой.
В настоящее время процесс работает путем добавления суффикса к хосту URL-адреса запроса, который затем соответствует директивам ProxyRemoteMatch. это делается путем передачи URL-адреса на карту перезаписи.
Это хорошо работает, но имеет дело с тем, что я должен определить КАЖДЫЙ сервер в конфигурации и DNS.
Вот рабочий пример:
RewriteEngine on
// define an external program that contains the logic where which request should be routed to
RewriteMap balancemap prg:/home/mysite/balancemap.php
<ProxyMatch "http://.*">
RewriteEngine on
// if the route has not yet been set by suffix proxy pattern, pass the request uri and user to the mapping program and store it in an environment variable
// for example http://google.com will be rewritten to something like http://google.com.5.server.mysite.com - which means it should be routed over server number 5
RewriteCond %{HTTP_HOST} !\.([0-9]+)\.server\.mysite\.com$
RewriteCond ${balancemap:%{REQUEST_URI}#%{REMOTE_USER}} .*
RewriteRule .* - [E=BALANCEDURL:%0]
// if a new url has been calculated, rewrite to it
RewriteCond %{ENV:BALANCEDURL} .+
RewriteRule .* %{ENV:BALANCEDURL} [P]
</ProxyMatch>
// now comes the long ist of servers....
// every subdomain is mapped to the correct ip address in internal dns system
ProxyRemoteMatch .*\.1\.server\.mysite\.com.* http://1.server.mysite.com:80
ProxyRemoteMatch .*\.2\.server\.mysite\.com.* http://2.server.mysite.com:80
ProxyRemoteMatch .*\.3\.server\.mysite\.com.* http://3.server.mysite.com:80
ProxyRemoteMatch .*\.4\.server\.mysite\.com.* http://4.server.mysite.com:80
... and so on
По сути, я хотел бы ProxyRemoteDirective, который поддерживает такие обратные ссылки:
ProxyRemoteMatch .*\.(\d+)\.server\.mysite\.com.* http://$1.server.mysite.com:80
Или я мог бы даже дать весь IP вот так:
ProxyRemoteMatch .*\.(\d+)\.(\d+)\.(\d+)\.(\d+)/.* http://$1.$2.$3.$4:80
Для вашей информации: настраиваемая часть имени хоста снова удаляется из URL-адреса на прокси-серверах. Я также хотел бы избавиться от этого, передав URL-адрес как есть!
Итак, если второй аргумент директивы ProxyRemoteMatch будет интерполировать переменную окружения, это будет выглядеть так:
// now our map just returns the ip of the correct remote server
RewriteCond ${balancemap:%{REQUEST_URI}#%{REMOTE_USER}} .*
RewriteRule .* - [E=REMOVESERVER:%0]
ProxyRemoteMatch .* http://%{ENV:REMOVESERVER}:80
Это было бы здорово.
Но, к сожалению, ничего из вышеперечисленного не работает.
Мне потребовалось время, чтобы разобраться в текущей системе, и теперь у меня есть около 200 строк директив ProxyRemoteMatch (200 удаленных серверов). Но поддерживать все в актуальном состоянии 2 даты с DNS и все остальное - заноза в заднице.
Маби, можно еще альтернативу порекомендовать? Возможно, такое же поведение может быть легко выполнено с другим программным обеспечением прокси-сервера? Наверное, Nginx? Кальмар?
Так что любые Идеи приветствуются!
FYI это является коммерческий проект, которым, однако, управляю сам, и в настоящий момент он не приносит заметной прибыли. Я планирую сделать его с открытым исходным кодом, но запустить с ним свой собственный сервис, когда он станет стабильным.
Я думаю, что я также назначу награду за этот вопрос как можно скорее.
Учитывая, что следующий цикл (perl, но язык yyyyy подойдет)
foreach my $i (1..200) {
print "ProxyRemoteMatch .*\\.$i\\.server\\.mysite\\.com.* http://$1.server.mysite.com:80\n";
}
печатает всю длинную и повторяющуюся часть конфигурации, зачем беспокоиться? Таким однострочником можно поддерживать весь шебанг. Вы даже можете использовать Include, чтобы полностью удалить его из файла конфигурации. Вероятно, добавление "make" на картинку позволит вам запускать его автоматически каждый раз, когда вы добавляете / удаляете сервер.