VirtualDocumentRoot使い方

自分用メモ。

VirtualDocumentRootの使い方

test.localhostを例に出して、

・前準備
自前のDNSに*.test.localhostワイルドカード使ってIPを登録。

Apacheの設定

LogFormat "%{Host}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vcombined
NameVirtualHost 192.168.3.11:80

<VirtualHost 192.168.3.11:80>
    ServerName          hontai.test.localhost
    ServerAlias         *.test.localhost
    VirtualDocumentRoot /home/%0/htdocs
    CustomLog           /var/log/httpd/access_log vcombined

    <Directory /home/*/htdocs>
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

って感じで設定して、

# mkdir -p /home/hoge.test.localhost/htdocs

って感じで設定すれば、

http://hoge.test.localhost/でアクセスできるようになる、と。

増やしたい時は、

# mkdir -p /home/hage.test.localhost/htdocs
# mkdir -p /home/huge.test.localhost/htdocs

って作れば、
http://hage.test.localhost/
http://huge.test.localhost/
でアクセスできる、と。

ログは1つに集約されてしまうけど、後でgrepしてわけてあげればいいかなと。

ちなみに%0にはFQDNが入ります。
それ以降の変数には分解されたドメインが入る感じ。

%0 … hoge.test.localhost
%1 … hoge
%2 … test
%3 … localhost

が入る。
最後に、このディレクティブを使いたい時は、コンパイルオプションに--enable-vhost-aliasをつけること。

Math::Pari

Net::SSH:Perlを入れる時にはまったのでメモ

Math::PariはPari-GPライブラリを使うわけですが、インストール時にPari-GPの2.1.*系のソースディレクトリを指定しないといけなかった。

CentOS 5.2
Perl 5.8.8

# cd /usr/loccal/src
# wget http://pari.math.u-bordeaux.fr/pub/pari/unix/OLD/pari-2.1.7.tgz
# tar zxf pari-2.1.7.tgz
# wget http://search.cpan.org/CPAN/authors/id/I/IL/ILYAZ/modules/Math-Pari-2.010800.tar.gz
# tar zxf Math-Pari-2.010800.tar.gz
# cd Math-Pari-2.010800
# perl Makefile.PL paridir=/usr/local/src/pari-2.1.7
# make
# make install

で完了

なんちゃってアイ○ンポート2

Postfixネタが多い今日このごろ…

っというわけで、現在仕事でPostfix使ってメルマガ配信周りのチューニングを(まだ)やっているわけですが、ボトルネックとなりうる箇所をすっこりして極力速く送信できるようにいろいろいじってみました。

以前やった設定をふまえつつ、

1.メールログ出力とキューイングをRAMディスク上で処理させる
 これはtmpfsという特殊なファイルシステムを使って実現。

 mountコマンド使わずに/etc/fstabに下記設定を追加しました。

/dev/shm  /ram  tmpfs  defaults  0 0

 /ram/をtmpfsでマウントしてます。

 RAM(メモリ)領域にディレクトリをマウントして普通のファイルのごとく操作できるようになります。速度はメモリなので速い速い。
 気をつけないといけないのはメモリ領域には限りがあるということ。
 今動かしてるサーバーは3GB積んでるので1.5GBくらい確保してみた(っというか確保されてた)。

 あと、サーバー落ちたりして再起動するとRAM領域は当然のことながら、すっからかんになりますので、定期的なHDDへのバックアップが必要になりますね。

2.syslogをやめてsyslog-ngを導入してみる
 syslogはどうも遅い(っと言われていたり)、安全面でもいろいろ言われているところもあったりで、syslog-ngを入れてみようと思った次第。
 
 http:/d.hatena.ne.jp/ragtarou/20080505

 を参考にしつつRPMでさくっとインストールしまして、

 # vi /etc/syslog-ng/syslog-ng.conf
  destination d_mail { file("/ram/postfix_log.$YEAR$MONTH$DAY$HOUR\0000" sync(0) perm(0644)); };

 こんな感じで設定変更し、
 syslog止めて、syslog-ngを起動。
 
3.ちょこっとPostfixチューニング
 
 master.cfとtransportファイルに宛て先ドメインごとの配信制御設定を追加。
 
 # vi /etc/postfix/transport

  〜
  docomo.ne.jp   docomo-smtp:n  .docomo.ne.jp  docomo-smtp:n  yahoo.co.jp   yahoo-smtp:n  ybb.ne.jp     yahoo-smtp:n  〜
 # postmap /etc/postfix/transport

 # vi /etc/postfix/master.cf
  〜
  docomo-smtp unix -      -       n       -       1       smtp
        -o smtp_destination_concurrency_limit=1 -o smtp_destination_recipient_limit=1
  yahoo-smtp unix -      -       n       -       10       smtp
        -o smtp_destination_concurrency_limit=1 -o smtp_destination_recipient_limit=4
  〜

 # postfix reload

…以上のような感じで設定してみて、いざ配信。
結果は…、2000通/分でした。

まーだ速くなる可能性も残しつつって感じですがひとまず30分で6万通送れりゃ、今のサービスなら十分かなーっと思った次第。

あ、あと、最後に言い忘れてたこと、

4.エラーメールのクリーニング処理
 実は、これが一番重要だったりして。
 エラーメールが多発するとキャリアのメールサーバブロッキングしちゃいます。
 なので、一定時間送れなくなるわけですね。
 
 定期的なクリーニング処理(3回失敗したら削除的な)を施してあげて極力バウンスメールは失くす努力が必要です(できればエラー率5%前後)。
 
 そうすれば、ある程度の規模ならたっかいアプライアンス製品買わなくても何とかOSSでまかなえるはず、っと思った次第。
 いや、アプライアンス製品の方がやっぱり素晴らしいんですけどね。

ApacheLBをやってみる

○ やること

Web2台、NFS構成で、入り口のロードバランサーをApache2.2系のmod_proxy_balancerを使って構築してみる。

そのとき、ApacheLBにもNFSからコンテンツ領域をマウントしておき、静的コンテンツはバックエンドのWebには振らずに、LB上で返すようにする。

○ 構成

|----| LB |---+---| Web01 |
       |
       +---| Web02 |
       |
       +---|  NFS  |

○ ApacheLB用のコンパイルオプション

"./configure" \
"--prefix=/usr/local/apache2_worker" \
"--with-mpm=worker" \
"--enable-cache" \
"--enable-deflate" \
"--enable-disk-cache" \
"--enable-headers" \
"--enable-mem-cache" \
"--enable-proxy" \
"--enable-proxy-balancer" \
"--enable-rewrite" \
"--enable-so" \
"--enable-ssl" \
"--enable-substitute" \
"--disable-asis" \
"--disable-auth-digest" \
"--disable-authn-anon" \
"--disable-authn-dbd" \
"--disable-authn-dbm" \
"--disable-authn-default" \
"--disable-authz-dbm" \
"--disable-authz-default" \
"--disable-authz-owner" \
"--disable-cgid" \
"--disable-dav" \
"--disable-dav-fs" \
"--disable-dbd" \
"--disable-dumpio" \
"--disable-expires" \
"--disable-ext-filter" \
"--disable-ident" \
"--disable-imagemap" \
"--disable-include" \
"--disable-info" \
"--disable-negotiation" \
"--disable-speling" \
"--disable-userdir" 

なげぇ。
不要なモジュールは省き、必要なモジュールは静的に組み込んでみる。
静的コンテンツのみ扱うので、ついでにMPMはworkerに。

○ 各種設定

まず、/etc/hostsにバックエンドWebの適当なホスト名と、IPアドレスを関連付けしておく。

# vi /etc/hosts
exms.web01 192.168.0.11
exms.web02 192.168.0.12

つづいてー、Apacheの設定ファイルにLB設定書きます。

<VirtualHost ***.***.***.***:80>
    ServerName   example.com

    DocumentRoot /home/example/htdocs
    CustomLog    /var/log/httpd/example/access_log combined
    ErrorLog     /var/log/httpd/example/error_log

    ProxyRequests Off
    ProxyPassMatch !\.(png|jpe?g|gif|css|js|ico) balancer://exms/ timeout=2

    ProxyPreserveHost On
    RequestHeader set X-SSL-FLAG %{HTTPS}s

    ProxyPassReverse / http://exms.web01:80/
    ProxyPassReverse / http://exms.web02:80/

    <Proxy balancer://exms/>
        BalancerMember http://exms.web01:80 loadfactor=10
        BalancerMember http://exms.web02:80 loadfactor=10
    </Proxy>

    RewriteEngine on
    RewriteCond %{REQUEST_URI} !\.(png|jpe?g|gif|css|js|ico)
    RewriteRule ^/(.*)$ balancer://exms/$1 [P,L]

    AddOutputFilterByType SUBSTITUTE text/html
    Substitute "s|mogemoge.com|hogehoge.jp|i"

    CacheRoot /usr/local/apache2_worker/cache
    CacheIgnoreCacheControl On
    CacheIgnoreHeaders Set-Cookie
    CacheEnable disk /
    CacheDefaultExpire 600
    CacheDirLevels 3
    CacheDirLength 3

    ErrorDocument 503 /sorry/503.html
    Alias /sorry/ /usr/local/apache2_worker/htdocs/

    <Directory /home/example/htdocs>
        Order deny,allow
        Deny  from all
        Allow from ***.***.***.***
   </Directory>
</VirtualHost>

一応、いろいろ意味があったりします。
ProxyRequests … フォワードプロキシとしては利用しないので、Offで。

ProxyPassMatch … 拡張子が.png .jpeg .jpg .gif .css .js .ico以外だったらバックエンドのWebにぶっ飛ばし。

ProxyPreserveHost … バックエンドのWebにHostヘッダ情報を渡す( $ENV{HTTP_HOST}がユーザからのリクエスト時のホスト名になる)。Offにしたら、$ENV{HTTP_HOST}はexms.web01とかになりますので、ご注意を。

RequestHeader set X-SSL-FLAG %{HTTPS}s リクエストスキームがhttp://だったら0、https://だったら1がセット。

Rewriteで指定拡張子以外だったらリバーーースプロキシィイイイ。

AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|mogemoge.com|hogehoge.jp|i"
 これ、実はLBとしては必要ないけれど、結構便利なのでテストで導入。
 レスポンスボディ内の指定文字列を置換してくれます。
 
 上記の例だと、mogemoge.com を hogehoge.jp に置換してくれてます。
 これはリンク先を別ホストに変更したいけど、ページいじりたくねぇって時にパゲ便利。
 
Cache〜系はディスクキャッシュを使ってます。
NFSからいちいち画像をとりにいかんでも、いっかいとったらキャッシュできるようにすれば環境に優しい、ド・エコLBになること間違い無し。

…と、言いたいところですが、まだまだ実験段階。
キャッシュ系はサービスにも影響するので、本導入はまだまだ検証が必要ですなぁ。

最後に、バックエンド側のWebが全て落ちた場合、Apacheステータスコード503を返します。なので503だったら、Sorryページ(混んでます、すんません的な)を見せるために、ErrorDocumentでそれ用のページを指定しています。
AliasはHTMLをドキュメントルート外に置きたかっただけなので、設定しただけで。
必要ないっちゃぁ必要なし。

っということで。