ようこそゲストさん

Magical Diary, beta version

[Apache] mod_perl用Apacheを分離

2007/07/22 15:11 HIRATA Yasuyuki

Perlを高速に動かすためにはApache HTTPDにmod_perlを組み込むが、mod_perlを読み込んだApacheはメモリを大量に消費する。このため、本格的なサービスを行う場合にはバックエンドでmod_perl用の専用サーバを動作させるが、そこまで用意しなくてもmod_perlだけは分離したいという要求は多い。ここでは、1つのサーバ内でApacheを複数動作させ、mod_perlを分離する方法を以下に解説する。

設計

  • 通常 (mod_perlなし) のApache (a) は *:80 で待ち受け。
  • Apache + mod_perl のApache (b) は 127.0.0.1:8000 で待ち受け。
  • 共通する設定は別ファイルに書いておいて、それぞれの設定ファイルから Include する。
  • アクセスは一度 (a) で受け取って、特定のパスに対しては (b) に逆プロクシする。
   the net
     | ^
     v |
+-----------+
| *:80      |
| Apache(a) |
+-----------+
     | ^  reverse
     v |  proxy
+-----------+
| L:8000    |
| Apache(b) |
+-----------+

設定

  1. 現在利用している httpd.conf を共通設定ファイルとしてファイル名を変更する。
    # cd /usr/local/etc/apache
    # mv httpd.conf httpd.common.conf
    
  2. /usr/local/etc/apache/httpd.conf を下記内容で作成する。これは /myapp/ 以下を mod_perl を組み込んだ Apache に対するプロクシアクセスとする例である。
    Include /usr/local/etc/apache/httpd.common.conf
    ProxyRequests Off
    ProxyPass /myapp/ http://localhost:8000/myapp/
    ProxyPassReverse /myapp/ http://localhost:8000/myapp/
    
  3. /usr/local/etc/apache/httpd.mod_perl.conf を下記内容で作成する。この例では、/myapp/ 以下で Catalyst の MyApp を動作させている。
    Include /usr/local/etc/apache/httpd.common.conf
    Listen 127.0.0.1:8000
    PidFile /var/run/httpd.mod_perl.pid
    ScoreBoardFile /var/run/httpd.mod_perl.scoreboard
    ErrorLog /var/log/httpd/mod_perl/error.log
    CustomLog /var/log/httpd/mod_perl/access.log combined
    AddModule mod_perl.c
    <Location /myapp/>
      <Perl>
        use lib qw[/www/app/MyApp/lib];
      </Perl>
      SetHandler perl-script
      PerlHandler MyApp
    </Location>
    
  4. サーバ (a) は今までどおり起動されるが、サーバ (b) は別途起動スクリプトを用意する必要があるので、/usr/local/etc/rc.d/apache.mod_perl.sh を作成する。
    # cd /usr/local/etc/rc.d
    # sed 's/apache/apache_mod_perl/g' apache.sh > apache.mod_perl.sh 
    # vi apache.mod_perl.sh
    # chmod 555 apache.mod_perl.sh
    
    viでは以下を書き換える。
    apache_mod_perl_flags="-f /usr/local/etc/apache/httpd.mod_perl.conf"
    apache_mod_perl_pidfile="/var/run/httpd.mod_perl.pid"
    
  5. /etc/rc.conf に下記内容を追加する。
    apache_enable="YES"
    apache_mod_perl_enable="YES"
    
  6. Apache (a) を再起動、Apache (b) を起動する。
    # /usr/local/etc/rc.d/apache.sh restart
    # mkdir /var/log/httpd/mod_perl/
    # /usr/local/etc/rc.d/apache.mod_perl.sh start
    

以上の設定により、http://server/myapp/ 以下へのアクセスが、mod_perl 側サーバへのプロクシアクセスとなる。

問題点

  • 1つのサーバ内で複数のApacheを起動するため混乱しやすい。
  • Apache (b) では常に REMOTE_ADDR が 127.0.0.1 となる。このため、HTTP_X_FORWARDED_FOR を参照するか、Apache (a) 側で処理を行う必要がある。

mod_rewrite

mod_rewriteを使用して逆プロクシを設定する場合には、下記のように設定する。これは、/moe/*.cgi についてのみ Apache (b) へのプロクシを実施する。ディレクトリ単位で設定すると、プログラム以外の画像ファイルまで Apache (b) で処理されることもあるため、mod_rewrite で処理するほうが望ましいと言える。

RewriteEngine on
RewriteLog /var/log/httpd/rewrite.log
RewriteLogLevel 9
RewriteRule ^/moe/([^/]+\.cgi)$ http://localhost:8000/moe/$1 [P]

[文具] 名入れ封筒・便箋・封蝋印

2007/07/22 14:05 HIRATA Yasuyuki

便箋・封筒のセットで、名前に加えてリターンアドレスも入れるという条件で調査。安い紙ならいくらでも見つかるが、それなりのものだと限定される。ここぞ、という時にはこのようなものを使いたいものだ。

イニシャル・既成のモチーフの封蝋印は沢山売られているが、自分でデザインできるところは少ない。

[Postfix] PostfixとAMaViSでウイルススキャン

2007/07/22 8:04 HIRATA Yasuyuki

方針

  1. *:25で待ち受けているPostfixはプロクシとして動作して、受け取ったメールを 127.0.0.1:10024 で待ち受けている AMaViS へ引き渡す。
  2. 127.0.0.1:24 で待ち受けている AMaViS は、ClamAVやSpamAssassinで処理を行い、問題が無ければ 127.0.0.1:10025 で待ち受けている Postfix へ引き渡す。(ウイルスが含まれていれば、接続元 (Postfix) に対してエラーを返す。
  3. 127.0.0.1:10025 で待ち受けているPostfixは、受け取ったメールを適切に配送する。(127.0.0.1 から受け取る以外、通常の動作と変わりが無い。)

これを図に表したものを以下に示す:

 the net
    |
    v
+---------+        +----------+     +---------+
| *:25    | -----> | L:10024  | --> | L:10025 | --> (deliver)
| Postfix | proxy  | AMaViS   |     | Postfix |
+---------+        +----------+     +---------+
                     ^      ^
                     |      |
                     v      v
             +---------+  +--------------+
             | L:3310  |  | perl module  |
             | ClamAV  |  | SpamAssassin |
             +---------+  +--------------+
* "L" は 127.0.0.1 を表す

導入するべきパッケージ (ports)

  • mail/postfix
  • security/amavisd-new
  • security/clamav

設定手順

  1. 正常に Postfix が動作するように設定する。
  2. /usr/local/etc/amavisd.conf に下記の設定を行う。これにより、127.0.0.1:10024 で AMaViS が動作する。
    $inet_socket_port = 10024;
    $final_virus_destiny = D_REJECT;
    
  3. AMaViSを再起動する。
    # /usr/local/etc/rc.d/amavisd restart
    
  4. master.cf中、smtpの項目を下記の通り修正:
    smtp      inet  n       -       y       -       -       smtpd
      -o smtpd_proxy_filter=127.0.0.1:10024
      -o smtpd_client_connection_count_limit=10
    
  5. master.cfに下記内容を追加:
    127.0.0.1:10025 inet n - y - - smtpd
      -o content_filter=
      -o local_recipient_maps=
      -o relay_recipient_maps=
      -o smtpd_restriction_classes=
      -o smtpd_client_restrictions=
      -o smtpd_helo_restrictions=
      -o smtpd_sender_restrictions=
      -o smtpd_recipient_restrictions=permit_mynetworks,reject
      -o mynetworks=127.0.0.0/8
      -o strict_rfc821_envelopes=yes
    
  6. Postfixを再起動する。
    # /usr/local/etc/rc.d/postfix reload
    
  7. テストする。ここで本文で送っている文字列は試験用のウイルスであり、実害は無い。
    % telnet localhost smtp
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    220 pluto.ansi.co.jp ESMTP Postfix
    HELO pluto.ansi.co.jp
    250 pluto.ansi.co.jp
    MAIL FROM:<postmaster@asuka.net>
    250 2.1.0 Ok
    RCPT TO:<postmaster@asuka.net>
    250 2.1.5 Ok
    DATA
    354 End data with .
    To: postmaster
    From: postmaster
    Subject: test
    Date: Date: Sun, 22 Jul 2007 11:22:33 +0900 (JST)
    X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
    .
    554 5.7.0 Reject, id=18885-14 - VIRUS: Eicar-Test-Signature
    QUIT
    221 2.0.0 Bye
    Connection closed by foreign host.
    

注意点

content_filter を利用して AmaViSを呼び出すことは推奨しない。これは、一度Postfixがメールを受け取りキューに入った時点で呼び出されるため、送信者 (多くの場合、無関係な第三者) へのエラーメールを発生させるためである。

[Windows] ログオン時に昇格した権限で任意のプログラムを実行

2007/07/22 1:54 HIRATA Yasuyuki

Windows VistaにはUACと呼ばれる機構があり、"管理者" の権限を持っているユーザも特権的なアクセスについては承認を求められる。具体的にはソフトウェアのインストール時や、システム設定の変更の際には暗転してポップアップが表示される。

また、XP以前で "管理者として実行" することが求められるソフトウェアについては、右クリックから "管理者として実行(A)..." を選択する必要がある。(一部のセットアッププログラムは自動的に管理者として実行されるが、UACが有効になっていれば当然にポップアップが表示される。) ファイルのプロパティから "互換性" → "管理者としてこのプログラムを実行する" をチェックすれば、わざわざ右クリックから選ぶ必要は無いが、ポップアップにより承認を求められることには変わりが無い。

通常利用している限りでは少々面倒なだけで済むが、このままではスタートメニューの "スタートアップ" のプログラムを管理者として実行することが出来ない。その代替手段としてタスクスケジューラを利用する方法を以下に解説する。

  1. タスクスケジューラを起動 ("Start" → "すべてのプログラム" → "アクセサリ" → "システムツール" → "タスクスケジューラ")
  2. "タスクの作成…" をクリックするとウインドウが開くので以下を設定
    1. "全般" タブの "最上位の特権で実行する" をチェック
    2. "トリガ" タブで "新規(N)..." をクリック
      1. "タスクの開始" を "ログオン時"
      2. "設定" で "特定のユーザー/グループ" を選択 (全ユーザに対して設定したい場合は "任意のユーザー(Y)" のまま。
      3. "OK" をクリック
    3. "操作" タブで "新規(N)..." をクリック
      1. "操作" を "プログラムの開始"
      2. "プログラム/スクリプト(P)" に起動したいプログラムを指定
      3. "引数の追加 (オプション)(A)" を必要に応じて指定
  3. "OK" をクリック

以上の設定を行うことで、ログオン時にダイアログが出ることなく管理者権限で任意のプログラムを動作させることが可能。

© 2007 HIRATA Yasuyuki <yasu@asuka.net>, all rights reserved