Linux 設定日記

設定したことを忘れないように書いてあります。

2005.05.09
Poundを更新

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ファイルにかいても良いのではあるが、そこまでしない方が便利かなとも思うところ。
2005.04.02
PoundでVirtual Host

せっかくなので、ダイナミック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を記述することで、そっちにアクセスが行くはず。

なんの意味があるかって?。 たしかにあまり意味はないかも。 ディスクリソースを使わないだけか。
2004.07.02
Apacheのベーシック認証を、テキストファイル形式からデータベース認証に変更する

まず、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でもよいが、それ以降はすべて半角空白以外で区切ると、グループを正しく判定しないので、注意が必要。 テキスト認証のときは問題なかった?ので理由がわからず大変苦労した。