投稿日 2008年10月22日 水曜日 カテゴリ xen 投稿者 sugimotoコメント(0) » 

何もする必要はありませんでした。。

xenの仮想サーバーでDom-U(ゲスト)をインターネット向けのサーバーとして利用することになりました。

Dom-0(ホスト)用のハードウェアにはインターフェイスがeth0, eth1の2つあり、そのうち、eth1を内部LAN向けのインターフェイスとして使っています。

Dom-Uもネットワークインターフェイスを2つ作り、eth1を内部LAN向け、eth0をインターネット向けとして、それぞれ、Dom-0のブリッジとつなげました。

VMware では、ホストOSのインターフェイスを停止させると、そのインターフェイスを使っているゲストOSのインターフェイスも使えなくなってしまいます。

そのため、xenでもDom-0のeth0インターフェイスはあげておく必要があると思いましたが、落とした状態でもDom-Uの外向けインターフェイスは利用可能でした。

こんな状態と思っていましたが

INTERNET
  --+------------------------------
    |
    |
    |  +-------------------------------+
    |  | +---------------------------+ |
    |  | |       Dom-U (ゲスト)      | |
    |  | | +--------+     +--------+ | |
    |  | | |  eth0  |     |  eth1  | | |
    |  | | +--------+     +---+----+ | |
    |  | +-----|--------------|------+ |
    |  |       |              |        |
    |  |   +---+----+     +---+----+   |
    |  |   | vifbr0 |     | vifbr1 |   |
    |  |   +---+----+     +---+----+   |
    |  |       |              |        |
    |  |   +---+----+     +---+----+   |
    +------+  eth0  |     |  eth1  +------+ < < eth0 が停止状態だとDom-Uも外にいけない
       |   +--------+     +--------+   |  |
       |        Dom-0 (ホスト)         |  |
       +-------------------------------+  |
                                          |
LAN/INTRANET                              |
  ----------------------------------------+---

そういうわけではなく、virtual interfaceで外と通信している

INTERNET
  --+------------------------------
    |
    |
    |  +-------------------------------+
    |  | +---------------------------+ |
    |  | |       Dom-U (ゲスト)      | |
    |  | | +--------+     +--------+ | |
    |  | | |  eth0  |     |  eth1  | | |
    |  | | +--------+     +---+----+ | |
    |  | +-----|--------------|------+ |
    |  |       |              |        |
    |  |   +---+----+     +---+----+   |
    +------+ vifbr0 |     | vifbr1 +------+
       |   +---+----+     +---+----+   |  |
       |       |              |        |  |
       |   +---+----+     +---+----+   |  |
       |   |  eth0  |     |  eth1  |   |  | < < eth0 が停止状態でもDom-Uには関係なし
       |   +--------+     +--------+   |  |
       |        Dom-0 (ホスト)         |  |
       +-------------------------------+  |
                                          |
LAN/INTRANET                              |
  ----------------------------------------+---

状態のようでした。

投稿日 2008年10月16日 木曜日 カテゴリ vmware 投稿者 sugimotoコメント(0) » 

自分のPC (Wndows XP Pro)のVMware Server を1.0.7から2.0にしたら、vmware-hostd.exe がアプリケーションエラーとなってしまった。。

Googleで検索した、こんな方法や、サポートページを調べたが、解決しませんでした。

解決方法は、以下でした。

Documents and Settings/All Users/Application Data/VMware/VMware Server/vm-list

を見てみると、次のような感じ。

# This file is automatically generated. 
# Hand-editing this file is not recommended. 
config "C:\Virtual Machines\xxxxx-dev\Other Linux 2.6.x kernel.vmx"
config "C:\Virtual Machines\xxxxx-test\Other Linux 2.6.x kernel.vmx" < < これは削除したはず

前のバージョンで削除していたゲストOSのイメージがリストされていました。
この行を削除して、サービスから、VM Host Agent を再起動すると、うまくいきました。

投稿日 2008年10月15日 水曜日 カテゴリ pound, proxy 投稿者 sugimotoコメント(0) » 

とあるプロジェクトで、オープンソースのプロキシサーバ「pound」を使いました。

その中で、気になったことなどをメモしておきます。

設定は簡単

特にSSLの設定は非常に楽です。 設定ファイルの書き方も明快でわかりやすいのでメンテナンス上も良いです。

バックエンドのWebサーバーはクライアントIPアドレスが変わる

バックエンドではクライアントIPアドレスがプロキシサーバーのアドレスとなるため、バックエンドのウェブサーバー(今回はapache)でログのフォーマットを修正する必要がありました。 X-Forwarded-For にクライアントIPアドレスは渡されるため、Webサーバーではこの値をログするように変更しました。

ログの出力方法によってパフォーマンスに影響がある

Poundのログはdefaultでsyslogに出力することができます。ただ、この設定をするとパフォーマンスが目に見えて悪くなりました。 LogFacilityを - に設定するとログは標準出力なります。 1. ログ出力なし 2. 標準出力 3. syslogに出力 上記の3つの設定では3番の方法で極端にパフォーマンスの低下が見られました。

そのため、今回はPoundのログは標準出力にしました。

クライアントIPアドレスでのフィルタはできない

プロキシサーバーを使う前は、特定のIPアドレスに対してapacheでDenyの設定をしていましたが、この方法は使えなくなりました。 - iptables で設定 - アプリケーションで設定

と考えられましたが、今回はアプリケーションに実装する予定です。

設定ファイルのリロードはできない

設定ファイルを書き換えた場合、反映するためにはreload ではなく、 restartが必要となります。(reloadは無い) 今回のシステムでは瞬間的な停止は許容範囲のため、そのまま運用しています。

導入までの手間は非常に少なかったのですが、細かい設定ができないのでした。

投稿日 2008年7月18日 金曜日 カテゴリ O&M, capistrano 投稿者 sugimotoコメント(0) » 

ウェブサービスを運営していると必ず、「定期的にやるべきこと」ってありますよね。

  • 古くなったログの処理
  • 負荷のかかる処理をバックグラウンドで定期的に
  • 外部データの取得

たいていの場合、手動でやるわけにはいかないので、シェルスクリプトなんかをcronで実行するわけですが、サービスの拡大に伴って、サーバ数が増えた場合、どうするんでしょう?

全てのサーバーにcronを設定すると、全てのサーバーで同じ設定になっていることを確認しなければなりません。 cronの設定自体を自動化すれば、全てのサーバーで同じ設定になっていることが保証されますが。。。

そんなわけで、Ruby on Rails のdeplyツールとして使われているCapistranoを使って、cronをCapistranoサーバーから一括実行することにしてみました。

以下の手順では、ssh接続などの設定は省いています。
(実はこの設定でかなり苦労したところではありますが。。)

1. Capistranoのインストール

gemでインストールします。

> gem install capistrano
> cap --version
Capistrano v2.4.0

2. capfileの作成

capfile はCapistranoの「レシピ」と呼ばれていて、Capistranoが実行するタスクの内容を記述します。Rubyをベースにした独自言語ですが、Rubyを知っている人にとってはほとんど同じです。

role :app, "app-server1", "app-server2"

desc "テスト用のタスク"
task "test_for_cron", :roles => :app do
  run "sh /path/to/cron/script.sh"
end

3. cronの設定

cronの設定時には、-f オプションを使って、capfileの場所を明示的に示しましょう。

> crontab -e
0 12 * * * cap -f /path/to/capfile test_for_cron > /dev/null 2> /var/log/capistrano/error.log

12時になったら、2つのアプリケーションサーバー

  • app-server1
  • app-server2

でスクリプト /path/to/cron/script.sh が実行されるようになりました。

なお、/path/to/cron/script.sh は各サーバー内に存在する必要があります。 サーバーが増えたら、role に足すだけで、そのサーバーでも実行されることになります。

ただ実行するだけでは面白くないので、実行したらメールを送ります。

4. メール送信用タスクの作成

メールはlocalhost で送りますが、Capistranoっぽく、localhostにリモート接続してみます。 (というか、どこにも接続せずにtaskを実行する方法が分からんだけ?)

desc "cronを実行したらメールを送信"
task "send_email", :host => "localhost" do
  fn = "/tmp/filename.txt"
  addresses = "email@address.com"
  time = Time.now.strftime("%Y/%m/%d %H:%M:%S")
  put @result.join("\n"), fn, :mode => 400
  run "mail -s 'cron has done on #{time}' #{addresses} < #{fn}"
  run "rm -f #{fn}"
end

5. cron用のタスクで結果を取得するよう変更

先ほど作成したタスクを修正して、実行結果をメール送信用タスクに渡せるようにします。

複数のサーバーで実行されることを想定して、結果は配列で渡します。

desc "テスト用のタスク"
task "test_for_cron", :roles => :app do
  @result = []
  @result.push capture("sh /path/to/cron/script.sh")
end

6. タスク実行後にメール送信タスクをhookする

Capistranoには start, finish, before, after などのtriggerがあり、task実行の前後などに特定のタスクを実行することができます。 capflieのtaskの前に以下の設定を追加します。

on :finish, :send_email, :except => [:send_email]

これで、タスクの実行後に標準出力をメールで送信してくれます。

参考

投稿日 2008年6月2日 月曜日 カテゴリ kickstart, virt-install, xen 投稿者 sugimotoコメント(0) » 

CentOS 5.1にインストールしたxenでDomUをkickstartを使って自動的に作成する設定をしていたら、その問題が起きました。

>sudo /usr/sbin/virt-install
    --extra-args='ks=http://ks-server/kickstart.php?host=myhost&ip=192.168.1.151&mac=00:00:00:00:01:51'

What is the name of your virtual machine? myhost
 How much RAM should be allocated (in megabytes)? 512
 What would you like to use as the disk (path)? /var/xen/myhost.img
 How large would you like the disk (/var/xen/myhost.img) to be (in gigabytes)? 8
 Would you like to enable graphics support? (yes or no) no
 What is the install location? ftp://ftp.riken.jp/Linux/centos/4/os/i386/


Starting install...
Retrieving CentOS...                                             310 B 00:00
Retrieving vmlinuz...     100% |=========================| 1.0 MB    00:00
Retrieving initrd.img...  100% |=========================| 853 kB    00:00
Creating storage file...  100% |=========================| 8.0 GB    00:00
libvir: XML error : line 10: EntityRef: expecting ';'
libvir: XML error : line 10: EntityRef: expecting ';'
libvir: Xen Daemon error : XML description for domain is not well formed or invalid
Traceback (most recent call last):
  File "/usr/sbin/virt-install", line 633, in ?
    main()
  File "/usr/sbin/virt-install", line 578, in main
    dom = guest.start_install(conscb,progresscb)
  File "/usr/lib/python2.4/site-packages/virtinst/Guest.py", line 649, in start_install
    return self._do_install(consolecb, meter)
  File "/usr/lib/python2.4/site-packages/virtinst/Guest.py", line 666, in _do_install
    self.domain = self.conn.createLinux(install_xml, 0)
  File "/usr/lib/python2.4/site-packages/libvirt.py", line 503, in createLinux
    if ret is None:raise libvirtError('virDomainCreateLinux() failed', conn=self)
libvirt.libvirtError: virDomainCreateLinux() failed XML description for domain is not well formed or invalid

virt-install では、extra-argsに”ks=”を設定して、kickstartの設定ファイルを読み込むことができます。 このとき、リモートの設定ファイルを変更することなく設定ファイルを読み込むために、設定ファイルをPHPにして、Query Stringで設定ファイルのパラメータを変更できるようにしていました。

この場合、host/ip/macを引数として渡しています。

Googleに聞いたところ、CentOS 5.1のlibvirtに問題があるようでした。

ここでは、install locationにシングルクォートが入っている場合を指摘していますが、設定全体でXMLのspecial characterのエスケープがされていないため、今回のようにextra-argsにアンパサンド(&)が入っている場合も同様の問題が起こりました。

問題を回避するため、kickstartの設定をおいているサーバーのapacheの設定を修正し、kickstartの設定ファイルのURIを変更しました。

http://ks-server/kickstart/myhost/192.168.1.151/00:00:00:00:01:51 でkickstartの設定ファイルを取得する

    RewriteLogLevel 9
    RewriteLog "/var/log/apache2/www-local-rewrite.log"
    RewriteRule ^/kickstart/(.*?)/(.*?)/(.*)$ /kickstart.php?host=$1&ip=$2&mac=$3 [L]

これで自動インストールすることができました。

このバグはCentOS 5.2のlibvirtでは修正されているらしく、修正もすでに公開されています。

参考

Next Page »