ロードバランサーとしてhaproxyを実行しており、haproxyに付属の統計Webインターフェイスから、Webサーバーをメンテナンスモードに切り替えることができます(そして再び戻すことができます)。これはすばらしいことです。
ただし、コマンドラインから同じアクションを実行できるようにしたい(一部の自動展開ワークフローで使用するため)。これは可能ですか?可能な場合、どのようにですか?
どうもありがとう
更新(2012年8月28日):私は現在haproxyctl最近では、以下で説明する方法を利用しています。
同じ問題を抱えている他の人のために、もう少し調査した後で修正しました:-
設定にUNIXソケットを追加し、それと対話することができます( 可能なコマンドはここにあります )。
設定する:
Sudo nano /etc/haproxy/haproxy.cfg
「グローバル」セクションに以下を追加します。
stats socket /etc/haproxy/haproxysock level admin
Haproxyデーモンを再起動します(例:Sudo service haproxy restart
)
Socatが必要です(それがない場合は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
)にしかアクセスできない場合は、それを使用してsocat
と同様の方法でHAProxyのソケットファイルを操作できます。
$ 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-(たとえば)maintenance.htmlという名前のファイルが存在する場合に503コードを返すようにWebサーバーを構成します。 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-次のようにポートをチェックするだけでなく、URLをチェックするようにhaproxyバックエンドを構成します。
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-Webサーバーをメンテナンスモードにします。
touch /var/www/maintenance.html
5-メンテナンスモードからWebサーバーを削除します。
rm -f /var/www/maintenance.html
また、1つのサーバーからヘルスチェックページを一時的に「削除」して、エンドポイントを停止し、アプリケーションを公開することもできます。
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