設定したことを忘れないように書いてあります。
poundは、Apacheに対しては全てpoundからのアクセス(うちのサーバーの場合は自サーバーからのアクセス)となってしまい、AccessLogが残らない。 また、poundのlogは、標準設定で利用していると貧弱であり、アクセス解析には十分ではない。Log Levelを3にすれば(defaultは1)、apache likeなログが、Vertual Host名つきでとれるようなので、設定を変えることにする。
また、facilityがdaemonとなっているため、他のlogと紛れてしまう。これも他のfacilityを定したい。 /etc/syslog.confを眺めると、local5が空いているようなので、local5を設定することにした。 facilityを設定するためには、comfigureのオプションに--with-log=LOG_LOCAL5を設定すればよい。
パッケージをつくるために、poundのWebページを確認すると、前回よりもリリースバージョンが2つ程上がっていた。 これを使って、再度パッケージを作成することとした。
参考までに、SPECファイル(SPECSに保管)、スクリプト(SOURCESに保管)、 pound.cfg(SOURCESに保管)を置いておく。
パッケージをインストール後、/etc/syslog.confに
# Save pound messages to pound.log local5.* /var/log/pound.log
を追加して、touch /var/log/pound.logによりログファイルを作成、/etc/inid.d/syslog restartを実行してログを分離した。
さらに/etc/logrotate.dにpoundを作成する。内容は以下の通り
/var/log/pound.log {
nocompress
missingok
weekly
postrotate
/usr/bin/killall -HUP syslogd
endscript
}
この辺、specファイルにかいても良いのではあるが、そこまでしない方が便利かなとも思うところ。
せっかくなので、ダイナミックDNSを利用して、バーチャルサーバーを運営してみる。
利用したのは、ここ。
でも、自分のサーバーのリソースはあまり使いたくないので、ISPのWebサーバーにおいたコンテンツをリバースプロキシで見せるようにしたい。 これを実現するためにPoundとApache2の多段リバースプロキシ構成としてみた。
Apache2だけでも実現は可能ですが、なるべくフロントのアクセスは機能の少ないものに閉じておきたいために多段になっています。
まずはPoundの設定
ListenHTTP 192.168.0.1,8080 # ← HTTPをListenするポートを記述
ListenHTTP 192.168.0.1,8081 # (portでバーチャルサーバをわけるため
ListenHTTP 192.168.0.1,80 # 標準のHTTPポート
ListenHTTPS 192.168.0.1,8443 /etc/pound/server.pem # ← HTTPSをListenするポートを記述
RootJail /var/pound
UrlGroup ".*" # ← URLでは識別しない(全URLにマッチ)。
HeadRequire Host ".*{VirtualHostName1}:8080.*" # ← HOSTに対して、VirtualHostName1とポート8080でアクセスしてきた場合。
BackEnd 192.168.0.1,8080,1 # ← バックエンドのサーバー1のポート8080に飛ばす。
EndGroup
UrlGroup ".*"
HeadRequire Host ".*{VirtualHostName1}:8081.*" # ← HOSTに対して、VirtualHostName1とポート8081でアクセスしてきた場合。
BackEnd 192.168.0.1,8880,1 # ← バックエンドのサーバー1のポート8880飛ばす。実態はApache2のリバースプロキシ。
EndGroup
UrlGroup ".*"
HeadRequire Host ".*{VirtualHostName1}.*" # ← HOSTに対して、VirtualHostName1にHTTPアクセスしてきた場合。上から順に比較するので、一番条件が緩いものは最後に記述。
BackEnd 192.168.0.1,80,1 # ← バックエンドのサーバー1に飛ばす。
EndGroup
UrlGroup ".*"
HeadRequire Host ".*{VirtualHostName2}:8443.*" # ← VirtualHostName2へのアクセスは、SSLのみ。Default Portを使うと、Host Headderにポーと番号が含まない(場合が多い)。
BackEnd 192.168.0.2,80 # ← バックエンドは、80でお話しします。
EndGroup
UrlGroup ".*" # ← 上記に一致しないアクセスは、404.not.foundというサーバーに送る。
BackEnd 404.not.found,80 ,1 # 記述しなければ、単にリジェクトされるが、飛ばさないとアクセスログが残らない。
EndGroup
次に、Apacheの設定。Apache2でないとうまく動かなかった。
/etc/apache2/conf/httpd.confを編集。
Listen 8080 # ← Viertual Serverをポートで区別するので、Listenするポートを追加。
Listen 8880 # ← Viertual Serverをポートで区別するので、Listenするポートを追加。
AddDefaultCharset off # ← 添付のhttpd.confはISO-8859-1となっているが、文字化けするためoffにしておく。
# 以下はコメントアウトされいたらコメントを外す。
LoadModule proxy_modudle modules/mod_proxy.so
LoadModule proxy_ftp_modudle modules/mod_proxy_ftp.so
LoadModule proxy_http_modudle modules/mod_proxy_http.so
LoadModule proxy_connect_modudle modules/mod_proxy_connect.so
/etc/apache2/conf.d/にproxy.confとvirtual1.confを作成・編集。標準添付のhttpd.confは、このディレクトリにおかれた.confで終わるファイルをインクルードする仕様になっている。
# virtual.conf
NameVirtualHost *:8080
<VirtualHost *:8080>
ServerAdmin webmaster@example.com
#↓ バーチャルホストのドキュメントルート
DocumentRoot /var/www/virtaul/dummy-host.example.com
Servername www.example.com:8080
# logs
CustomLog logs/dummy-host.example.com-access_log combined
ErrorLog logs/dummy-host.example.com-error_log
</VirtualHost>
# proxy.conf
NameVirtualHost *:8880
<VirtualHost *:8880>
ServerAdmin webmaster@example.com
#↓ ドキュメントルート。ISP上のデータを使うので実態は空
DocumentRoot /var/www/reverse-proxy/dummy-host.example.com
Servername www.reverse-proxy.com:8880
# logs
CustomLog logs/reverse-proxy.example.com-access_log combined
ErrorLog logs/reverse-proxy.example.com-error_log
# Proxy Settings
#↓ フォワードプロキシとしての動作を停止する。これがonだとオープンプロキシとなる危険がある。
ProxyRequests Off
#↓ ISPのページを、ディレクトリのルートとする。
ProxyPass / http://this.is.isp.page/mypage/
#↓ フォワードとリバースで同じように設定する。
ProxyPassReverse / http://this.is.isp.page/mypage/
</VirtualHost>
で、ISPのリバースにしたので、静的コンテンツ(というか重い画像など)は、imgタグにFQDN付きのURLを記述することで、そっちにアクセスが行くはず。
なんの意味があるかって?。 たしかにあまり意味はないかも。 ディスクリソースを使わないだけか。
まず、sourceforgeからmod_auth_mysqlをダウンロードする。
このファイルをコンパイルするためには、apxsとmysql.h,libmysqlclient.soが必要なため、以下のパッケージを追加インストールする。
apt-get install apache-devel # apxs apt-get install MySQL-devel # mysql.h apt-get install MySQL-shared # libmysqlclient.so
その後、コンバイルおよびインストールを実施する。これはREADMEにかいてある通り。
apxs -c -D APACHE1 -lmysqlclient -lm -lz mod_auth_mysql.c apxs -i mod_auth_mysql.so
http.confを編集。Vine Linuxでは、/etc/httpd/confにある。 以下二行を追加。
LoadModule mysql_auth_module modules/mod_auth_mysql.so AddModule mod_auth_mysql.c
mysqlの方でデータベーステーブルを作成。 複数グループに入るユーザがいる場合は、グループとユーザのテーブルは分けておく方がよい。 グループのテーブルは、グループ名とユーザ名で一意するため、両方を含めてprimary keyを作っておく。 su_levelのfieldは、認証のためには不要だが、あとでユーザ管理のために追加した。
create table users(
username varchar(30) primary key not null,
passwd varchar(30) not null);
create table groups(
username varchar(30) not null,
usergroup varchar(30) not null,
su_level tinyint
primary key(username,usrgroup));
で以下、ユーザとグループを作ってゆく。 パスワードは、perl -e 'print crypt("password", "aB");といった感じで criptパスワードを作成する。"aB"は、saltで、暗号化パスワード生成のシードと なる(先頭2文字となる)。英数字、記号の一部が使えるので、これは適当な組み合わ せで生成する。
insert into users(username,passwd) values('guest','IQzj4nCAnN1xA');
insert into groups(username,usergroup,su_level) values('guest','guest',500);
で、以上で準備は完了。認証をApacheから使用するためには、httpd.confを変更してデータベースを利用して認証するように設定する。 当然ながら.htaccessでオーバーライトすることも可能(そう設定してあれば)。
具体的には、認証したいディレクトリの記載を以下のようにする。
<Directory "/usr/share/doc/">
AllowOverride None
Options Indexes
Order allow,deny
Allow from all
Require group wheel
AuthType Basic
AuthName "Please Enter Your password."
AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthMySQLHost localhost
AuthMySQLUser Mysql's Uername hear
AuthMySQLPassword Mysql's password hear
AuthMySQLDB apache
AuthMySQLUserTable users
AuthMySQLNameField username
AuthMySQLPasswordField passwd
AuthMySQLGroupTable groups
AuthMySQLGroupField usergroup
AuthMySQLCryptedPasswords On
</Directory>
Requireを記述するとき、アクセス権限者(ユーザ・グループ)の列挙にtab(^I)が使えない。 Requeieの後はtabでもよいが、それ以降はすべて半角空白以外で区切ると、グループを正しく判定しないので、注意が必要。 テキスト認証のときは問題なかった?ので理由がわからず大変苦労した。