ユーザ毎にバーチャルホストを設定する方法

//概要
普段、ユーザのpublic_htmlディレクトリはhttp://www.example.com/~foo/の形で公開される。
今回は、それをワンランクアップし、http://foo.example.com/でアクセスできるように設定する。


//mod_vhost_aliasを使用した方法
・Apache付属のモジュールの中に、mod_vhost_aliasと言うモジュールがある。
 これを使用すると、たった一行でバーチャルドメインが実現できる。以下に例を示す。


VirtualDocumentRoot /home/%1/public_html
↑http://foo.example.com/に対して/home/foo/public_htmlを割り当てる。

お分かりいただけるだろうか。見ての通り実に簡単である。
ただし問題点はある。それは各種ラッパーを一切使用できないことだ。
理由は、ラッパーの仕組みを思い出せば分かってくる。
数あるラッパー、例を挙げるとCGIWrapの場合ユーザとパスを判別するには環境変数の'PATH_INFO'か'QUERY_STRING'から情報を抜き取って判別している。
PATH_INFOの場合、/~foo/hoge.cgiの形式でないと認識できないし、
QUERY_STRINGの場合、/path-to-cgiwrap/cgiwrap/foo/hoge.cgiの形式でないと認識できない。
つまり、バーチャルホストにした際のパスでは/~foo/hoge.cgiにならないため認識できないのである。
対処方法としては、以下のようにmod_rewriteを使用した方法がある。


//mod_rewriteを使用した方法
1,/~fooへマッピングする
・すぐに思いつく方法としては、http://foo.example.com/へ向けられた要求を/~fooへ向けることである。
これにより、バーチャルホストのマッピングができるうえに、CGIWrapの認識できるパス通りにPATH_INFOを設定できる。
以下に例を示す。



ServerName www.example.com
ServerAlias *.example.com
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.example\.com$
RewriteCond %{REQUEST_URI} !^/cgiwrap/
RewriteCond %{REQUEST_URI} !^/icons/
RewriteCond %{REQUEST_URI} !^/~
↑www.example.com , /cgiwrap , /icons , /~ を含むアドレスにはマッピングしない
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+)\.example\.com/(.*) /~$1/$2 [PT]
RewriteRule ^([^.]+)\.example\.com$ /~$1/ [PT]
↑http://foo.example.com/に対して/~fooを割り当てる。

これで、/~fooに対してマッピングできる。しかし、これにも欠点がある。
それは、cgiなどで相対パス等を取り扱ったときにhttp://foo.example.com/~foo/と表示されてしまう点だ。
NotFoundなどのエラーメッセージにも同様の症状が発生する。http://foo.example.com/hoge.cgiでアクセスしたはずなのに、
いつの間にかhttp://foo.example.com/~foo/hoge.cgiになっていた、なんていうことも起こってしまう。
これは当然の挙動としか言いようが無い。http://foo.example.com/に対して

http://foo.example.com/~foo/をマッピングしているのだから。

対処法としては、以下の方法がある。
2,/home/foo/public_htmlへマッピングし、CGIScriptに対しては/cgi-bin/cgiwrap/foo/へマッピングする
・標準時は/home/foo/public_htmlへ直接マッピングをかけてあげて、
ラッパー対象ファイルに対しては/cgi-bin/cgiwrap/foo/へマッピングすれば、CGIWrapがQUERY_STRINGを使用して
認識できるので見事に実現できるはずである。以下に例を示す。


ServerName www.example.com
ServerAlias *.example.com
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.example\.com$
RewriteCond %{REQUEST_URI} !^/cgiwrap/
RewriteCond %{REQUEST_URI} !^/icons/
RewriteCond %{REQUEST_URI} !^/~
↑www.example.com , /cgiwrap , /icons , /~ を含むアドレスにはマッピングしない
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
# For CGI Files
RewriteRule ^([^.]+)\.example\.com/(.+)\.cgi(.*) /cgi-bin/cgiwrap/$1/$2\.cgi$3
[NS,T=application/x-http-cgi,PT,L]
↑http://foo.example.com/hoge.cgiに対して/cgi-bin/cgiwrap/foo/hoge.cgiを割り当てる。
# For Normal Files
RewriteRule ^([^.]+)\.example\.com/(.*) /home/$1/public_html/$2 [L]
RewriteRule ^([^.]+)\.example\.com$ /home/$1/public_html [L]
↑http://foo.example.com/に対して/home/foo/public_htmlを割り当てる。

これで、ユーザ毎にバーチャルドキュメントを実現でき、かつCGIWrapが有効になる。

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • Twitter
  • RSS

CGIWrapの設定とインストール

//概要
CGIWrapはSuexecの様な「ユーザ権限でCGIを実行できる」ラッパーである。
使い方次第でSuexecよりも使い勝手が良いため、導入する方も少なくない。
今回は、そのCGIWrapの仕組み/設定/インストールまでを行う。


//CGIをユーザ権限で実行する意味とは?
通常、CGIはサーバにあるhttpd(Apache等)で設定されたユーザ(デフォルトではapacheやnobody)
により実行される。その際、ログを読み書きする場合にはCGI実行ユーザとファイルの所持者が違うため
そのログファイルのパーミッションを+w(だれでも書き込める様)に設定しなければならない。
ここで少し考えてほしい。
「誰でも書き込むことができる」と言うことは、「同サーバ上の他ユーザでも書き込める」
と言うことになってしまう。これではログを書き換えられてしまう恐れがあり、セキュリティ上好ましくない。
そこで出てくるのがCGIWrapやSuexec等のラッパーである。ラッパーを通して実行することにより
CGIがその所持ユーザにより実行されるため、ログのパーミッションを誰でも書き込める様に設定する必要が無くなる。
これにより、他のユーザに不正にファイルを書き換えられるのを防ぐことができるわけだ。


//設定・インストール
・ここでは、当サーバの設定を例に一連の流れを説明する。

○ファイルのダウンロード・展開
http://cgiwrap.unixtools.org/よりCGIWrapの最新版をダウンロードして、展開する

[root@www ~]# wget http://jaist.dl.sourceforge.net/sourceforge/cgiwrap/cgiwrap-3.9.tar.gz
=> `cgiwrap-3.9.tar.gz.1′
jaist.dl.sourceforge.net をDNSに問いあわせています… 150.65.7.130
jaist.dl.sourceforge.net[150.65.7.130]:80 に接続しています… 接続しました。
HTTP による接続要求を送信しました、応答を待っています… 200 OK
長さ: 138,875 [application/x-gzip]
100%[====================================>] 138,875 541.00K/s
19:57:25 (539.90 KB/s) – `cgiwrap-3.9.tar.gz’ saved [138,875/138,875]
[root@www ~]#tar zxvf cgiwrap-3.9.tar.gz
cgiwrap-3.9/
cgiwrap-3.9/COPYING
    ・
    ・
    ・
cgiwrap-3.9/util.c
cgiwrap-3.9/util.h
[root@www ~]#cd cgiwrap-3.9
[root@www cgiwrap-3.9]#

○CGIWrapの設定/インストール
./configure の後に続くオプションでCGIWrapを設定していく。主なオプションはこちらのConfiguration Optionsに掲載してある(英語)
なお、最小限'--with-install-dir'と'--with-httpd-user' は必要となっている。

[root@www cgiwrap-3.9]#./configure --with-perl=/usr/bin/perl \ ←perlの位置
> --with-local-contact-email=webmaster@dabits.net \ ←管理者メールアドレス
> --with-install-dir=/var/www/cgi-bin \ ←インストールディレクトリを設定(CGIWrapの推奨設定)
> --with-cgi-dir=html \ ←ユーザディレクトリをhtml
> --with-httpd-user=apache \ ←httpd実行ユーザをapache
> --with-check-shell \ ←シェルユーザによる実行禁止
> --without-logging-file ←ログの記録をしない
checking build system type... i686-pc-linux-gnu
    ・
    ・
    ・
config.status: creating config.h
config.status: config.h is unchanged
[root@www cgiwrap-3.9]# make ←コンパイル
gcc -c -g -O2 -I. -I. cgiwrap.c
gcc -c -g -O2 -I. -I. debug.c
gcc -c -g -O2 -I. -I. util.c
gcc -c -g -O2 -I. -I. fetch.c
gcc -c -g -O2 -I. -I. stdutil.c
gcc -c -g -O2 -I. -I. msgs.c
gcc -o cgiwrap cgiwrap.o debug.o util.o fetch.o stdutil.o msgs.o
[root@www cgiwrap-3.9]# make install ←インストール
rm -f /var/www/cgi-bin/cgiwrap
rm -f /var/www/cgi-bin/cgiwrapd
rm -f /var/www/cgi-bin/nph-cgiwrap
rm -f /var/www/cgi-bin/nph-cgiwrapd
# rm -f /var/www/cgi-bin/php-cgiwrap
# rm -f /var/www/cgi-bin/php-cgiwrapd
cp cgiwrap /var/www/cgi-bin/cgiwrap
chown root /var/www/cgi-bin/cgiwrap
chgrp root /var/www/cgi-bin/cgiwrap
chmod 4755 /var/www/cgi-bin/cgiwrap
ln /var/www/cgi-bin/cgiwrap /var/www/cgi-bin/cgiwrapd
ln /var/www/cgi-bin/cgiwrap /var/www/cgi-bin/nph-cgiwrap
ln /var/www/cgi-bin/cgiwrap /var/www/cgi-bin/nph-cgiwrapd
# ln /var/www/cgi-bin/cgiwrap /var/www/cgi-bin/php-cgiwrap
# ln /var/www/cgi-bin/cgiwrap /var/www/cgi-bin/php-cgiwrapd
[root@www cgiwrap-3.9]#cd ..
[root@www ~]# rm -rf cgiwrap-3.9 ←解凍したディレクトリを削除
[root@www ~]# rm -f cgiwrap-3.9.tar.gz ←ダウンロードしたファイルを削除

○Apache再設定
CGIWrapを適用するためApacheを再設定する。

[root@www ~]# vi /etc/httpd/conf/httpd.conf

Action cgi-wrapper /cgi-bin/cgiwrap/apache
↑追加(ドキュメントルートにあるスクリプトをapache権限で動作させるため。)

# ScriptAlias /cgi-bin/ /var/www/cgi-bin/ ←コメントをはずす

ScriptAlias /cgi-bin/ /var/www/cgi-bin/
AddHandler cgi-script .cgi .pl ←変更(CGIの実行をCGIWrap経由にさせる。)

AddHandler cgi-wrapper .cgi .pl
Action cgi-wrapper /cgi-bin/cgiwrap ←追加(〃)
[root@www ~]# /etc/init.d/httpd restart ←Apache再起動

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • Twitter
  • RSS
 Page 7 of 7  « First  ... « 3  4  5  6  7