2013年7月9日火曜日

ドメインごとに実サーバーを振り分ける(複数ドメイン、パーチャルドメイン対応)

squidサーバーは一つで、キャッシュ対象となる実サーバーまたはドメインを複数利用したい場合についてになります。

現状は、squidサーバーが1台で、キャッシュ対象となる実サーバーA(192.168.0.1)に対してドメイン名test1.domain.comが割り当てられて運用しています。

そこに新しく実サーバーB(192.168.0.2)を追加しtest1.domain.comという名前を割り当て、
このドメインもsquidのキャッシュ対象としたい場合に、

squidサーバーにリクエストされたURLを見て、どっちの実サーバーに取りに行くか設定をしてあげる必要があります(゚д゚)(。_。)(゚д゚)(。_。) ウンウン

squidサーバーへのリクエストが次の場合に、下記のように振り分ける。
test1.domain.comのリクエストは実サーバーA(192.168.0.1)に問い合わせる。
test2.domain.comのリクエストは実サーバーB(192.168.0.2)に問い合わせる。

この場合には、acl、cache_peer、cache_peer_accessなどのアクセスコントロールの設定が必要になります。

バーチャルドメインのリクエストを受け付けるために、
http_portにvhostオプションを設定します。
この設定が無いと、キャッシュが無かった場合にdefaultsiteで定義したドメインを利用して、
実サーバーへ問い合わせを行う?っぽいです。

なので、このvhostの設定をせずにアクセスコントロールしたとしても、
正しく振り分けられないので注意が必要です!
#プロキシーサーバーがクライアントからのリクエストを待ち受けるポート番号を指定。
http_port 80 accel defaultsite=test1.domain.com vhost
■手順1)aclの設定になります。
####################
#アクセスコントロールに関する設定
####################

#クライアントからのリクエストURLがtest1.domain.comだった場合に、
#エイリアス名を「domain_1」として定義する。
acl domain_1 dstdomain test1.domain.com

#クライアントからのリクエストURLがtest2.domain.comだった場合に、
#エイリアス名を「domain_2」として定義する。
acl domain_2 dstdomain test2.domain.com
サブドメイン全てを対象にした場合には、次のように記述する。
acl domain_1 dstdomain .domain.com
※エイリアス名は最大31文字までみたいです。 31文字を超えると次のようなエラーが発生していました。
2013/06/01 16:55:10| aclParseAclLine: ACL name '**************' too long. Max 31 characters allowed
■手順2)実サーバーの設定
####################
#実サーバーの設定
####################
#squidにキャッシュが無かった場合に、実サーバーの「test1.domain.com」に取りにいく。この設定を「server_web10」とする。
cache_peer squid.test1.domain.com parent 80 0 no-query originserver name=server_test1

#squidにキャッシュが無かった場合に、実サーバーの「test2.domain.com」に取りにいく。この設定を「server_web11」とする。
cache_peer squid.test2.domain.com parent 80 0 no-query originserver name=server_test2
実サーバー指定時にドメイン利用時の注意点として、
squidで受け付けるドメイン(cache_peerの実サーバーの指定)と、
実サーバーへの振り分け時のドメイン名(cache_peer_accessの指定がドメインだった場合)が同じだと正しく動作しないっぽいです。


たとえば、squidの受付ドメイン名が「test1.domain.com」で
「test1.domain.com」でsquidが受け取った後に、実サーバーへ転送する際の指定が
同じ「test1.domain.com」だとダメ。

普通に考えて、受け付けたドメインと転送先が同じだと
無限にループする的な感じがするできっとダメだと思います((((;゚Д゚))))ガクガクブルブル
というか、これが原因で恐らくサーバーが落ちた気がします(´;ω;`)ウッ…

なので、可能であればcache_peer_accessで指定する転送先の指定にはIPアドレスを使った方が良いかも?
ローカルIPでサーバーを指定するとか!1台のサーバーで複数個ドメインを設定したい場合には、
ポート番号で振り分けるとかすればいける気がします(゚д゚)(。_。)(゚д゚)(。_。) ウンウン

どうしても転送先の指定にもドメイン名でやりたい場合には、
squidからの参照用のドメイン名と、実際に使われるドメイン名を実サーバーに設定してあげて、
squidの設定では、cache_peerの実サーバーの指定時には参照用のドメインを使い、
cache_peer_accessの設定では、別々のドメインになるようにする。

■手順3)リクエストされたURLと実サーバーへの振り分け&許可設定
###################
#リクエストされたURLと実サーバーへの振り分け&許可設定
####################
#リクエストがaclで定義したdomain_1と一致した場合に、server_test1(192.168.0.1)への問い合わせを許可する。
cache_peer_access server_test1 allow domain_1

#リクエストがaclで定義したdomain_2と一致した場合に、server_test1(192.168.0.2)への問い合わせを許可する。
cache_peer_access server_test2 allow domain_2
次のような書き方も可能です。
#リクエストがaclで定義したdomain_1と一致しなかった場合に、server_test1(192.168.0.1)への問い合わせを許可する。
cache_peer_access server_test1 allow !domain_1
cache_peer_accessの定義はcache_peerに書かないといけない。 もし前に書いていると次のようなエラーが発生していました。
$ squid -k parse
2013/06/01 17:37:55| squid.conf, line 1231: No cache_peer 'server_test1'
2013/06/01 17:37:55| squid.conf, line 1234: No cache_peer 'server_test2'
以上で、アクセスコントロールの設定は完了になります。

後は、設定を反映させて完了ですド━━━━m9(゚∀゚)━━━━ン!!
#設定ファイルのチェック
squid -k parse

#設定の再読み込み
sudo /etc/init.d/squid reconfigure

or

#設定の再読み込み
squid -k reconfigure

アクセスコントロールの設定としては次のような記述が可能みたいです。
アクセスコントロールに関する設定
acl aclname acltype string1 ...
acl aclname acltype filename
aclname には任意の名前を指定できます。filename を指定する場合は、string1 の部分を指定したファイル内に 1 行ずつ記述します。

acltype に指定できる代表的なものとしては、以下のタイプが存在します。また、指定した acltype により、string1 へ記述する内容は異なります。

acl aclname src ipaddress/netmask ...
ipaddress/netmask で指定した送信元の IP アドレスに対して acl 名(aclname)を設定します。また、IP アドレスを -(ハイフン)で区切ることにより、IP アドレスの範囲を指定することも可能です。

acl aclname dst ipaddress/netmask ...
ipaddress/netmask で指定した送信先の IP アドレスに対して acl 名(aclname)を設定します。

acl aclname srcdomain domainname ...
送信元の IP アドレスの逆引きを行い,その結果のドメイン名(domainname)に対して acl 名(aclname)を設定します。

acl aclname dstdomain domainname ...
送信先のドメイン名(URL から得たドメイン名が domainname)に対して acl 名(aclname)を設定します。

acl aclname url_regex URL ...
URL で指定した URL に対して acl 名(aclname)を設定します。

acl aclname URL urlpath_regex URL ...
URL に指定した文字列を含む URL に対して acl 名(aclname)を設定します。

acl aclname time day-abbrevs h1:m1-h2:m2
曜日や時刻に対して acl 名(aclname)を設定します。day-addrevs には、S(日曜日)、M(月曜日)、T(火曜日)、W(水曜日)、H(木曜日)、F(金曜日)、A(土曜日)の指定が可能です。h1:m1-h2:m2 には時刻の指定をします。h1:m1 は必ず h2:m2 より前の時刻でなければなりません。

acl aclname port port ...
port で指定したポート番号に対して acl 名(aclname)を設定します。

acl aclname proto protocol ...
protocol で指定したプロトコル名に対して acl 名(aclname)を設定します。

acl aclname method HTTP_method ...
HTTP_method で指定した HTTP のメソッドに対して acl 名(aclname)を設定します。

acl aclname browser browser
browser で指定したブラウザ名に対して acl 名(aclname)を設定します。
以上です(`・ω・´)ゞビシッ!!

参考URL

0 件のコメント:

コメントを投稿