У меня haproxy работает как мой балансировщик нагрузки, и из веб-интерфейса статистики, который поставляется с haproxy, я могу перевести веб-сервер в режим обслуживания (и вернуть его снова) - и это здорово!
Однако я также хочу иметь возможность выполнять то же действие из командной строки (для использования в некоторых рабочих процессах автоматического развертывания). Возможно ли это, и если да, то как?
Большое спасибо
Обновление (28 августа 2012 г.): Сейчас я использую haproxyctl в настоящее время, который использует методы, описанные ниже.
Я исправил это после небольшого дополнительного исследования для всех, у кого есть такая же проблема: -
Вы можете добавить сокет unix в свою конфигурацию, а затем взаимодействовать с ним (вот возможные команды).
Установить:
sudo nano /etc/haproxy/haproxy.cfg
В вашем «глобальном» разделе добавьте:
stats socket /etc/haproxy/haproxysock level admin
Перезапустите демон haproxy (например, sudo service haproxy restart
)
Теперь вам нужен сокат (если у вас его нет, просто apt-get install socat
в Ubuntu).
Теперь все, что вам нужно сделать, это запустить эту команду, чтобы отключить узел:
echo "disable server yourbackendname/yourservername" | socat stdio /etc/haproxy/haproxysock
Чтобы вернуть его обратно, замените disable на enable в приведенной выше команде.
В дополнение к методу эха beardwizzle, вы также можете сделать это в интерактивном режиме:
root@ny-lb01:/etc/haproxy# sudo socat readline /var/run/haproxy.stat
prompt
> set timeout cli 1d
> disable server foo/web01
> help
Unknown command. Please enter one of the following commands only :
clear counters : clear max statistics counters (add 'all' for all counters)
clear table : remove an entry from a table
help : this message
prompt : toggle interactive mode with prompt
quit : disconnect
show info : report information about the running process
show stat : report counters for each proxy and server
show errors : report last request and response errors for each proxy
show sess [id] : report the list of current sessions or dump this session
show table [id]: report table usage stats or dump this table's contents
get weight : report a server's current weight
set weight : change a server's weight
set timeout : change a timeout setting
disable server : set a server in maintenance mode
enable server : re-enable a server that was previously in maintenance mode
Если у вас есть доступ только к netcat (nc
) вы можете использовать его для взаимодействия с файлом сокета HAProxy аналогично socat
.
$ echo "show info" | nc -U /var/lib/haproxy/stats | head -10
Name: HAProxy
Version: 1.5.2
Release_date: 2014/07/12
Nbproc: 1
Process_num: 1
Pid: 29745
Uptime: 0d 0h14m35s
Uptime_sec: 875
Memmax_MB: 0
Ulimit-n: 8034
Чтобы отключить сервер:
$ echo "enable server bk_dservers/ds02" | nc -U /var/lib/haproxy/stats
Убедитесь, что файл сокета имеет соответствующий уровень доступа для выполнения вышеуказанного. В основном примерно так:
stats socket /var/lib/haproxy/stats level admin
В противном случае вы получите ошибку отказа в разрешении:
$ echo "disable server bk_dservers/ds02" | nc -U /var/lib/haproxy/stats
Permission denied
$
Самый простой способ:
1 - Настройте свой веб-сервер так, чтобы он возвращал код 503, если существует файл с именем maintenance.html (например). С помощью apache вы можете сделать это следующим образом:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} !=503
RewriteCond "/var/www/maintenance.html" -f
RewriteRule ^(.*)$ /$1 [R=503,L]
</IfModule>
2 - Настройте серверную часть haproxy для проверки URL-адреса, а не только для проверки порта, как показано ниже:
backend site
balance roundrobin
option httpchk GET /index.html
server myserver1.example.com 192.0.2.1:80 cookie S1 check inter 2000 fall 3
server myserver2.example.com 192.0.2.2:80 cookie S2 check inter 2000 fall 3
3 - Перезагрузите веб-сервер и балансировщик нагрузки.
4 - Переведите ваш веб-сервер в режим обслуживания.
touch /var/www/maintenance.html
5 - Выведите свой веб-сервер из режима обслуживания.
rm -f /var/www/maintenance.html
Вы также можете временно «удалить» страницу проверки работоспособности с одного сервера, чтобы отключить конечную точку, а затем опубликовать свое приложение.
Если у вас есть debian, readline не работает, netcat - лучший вариант для интерактивного:
user@server:/etc/haproxy$ sudo nc -U /etc/haproxy/haproxysock
prompt
> show info
Name: HAProxy
Version: 1.7.11-1ppa1~xenial
Release_date: 2018/04/30
Nbproc: 1
Process_num: 1
Pid: 12307
Uptime: 0d 10h33m22s
...
Не интерактивный:
echo "show info;show stat" | sudo nc -U /etc/haproxy/haproxysock