ウェブサーバの設定見直しと検索機能付加

私のメモです。参考になればいいですが、間違っていたらごめんなさい。

戯れ言

--------------------------------------------------------

Thanks to  Hyper-Estraier




























さて、そろそろ2年になるのだが・・・

サーバを立ててそろそろ2年になるが、設定を終えてからは停電後の復旧やセキュリティアップデートくらいしか メンテナンスをしてこなかった気がする。今回、検索機能を付けようと思い立ったので、それを機会に ファイルのパーミッション、httpd.confなどの設定を見直すことにした。

パーミッションの再設定

woodyでウェブサーバでは、ディレクトリを311、ファイルを440にしていた。 しかし、管理者やユーザは自分しかいないからグループに許可を与える必要はない。 そのため、ディレクトリは100、ファイルは400で十分である。そこで、次のコマンドで変更した。 但し、以下で”ユーザ”とはapacheを実行しているwww-dataユーザのことである。

# cd /var/www
# chown -R www-data *
# chgrp -R www-data *
# find html -type f | xargs chmod 400
# find html -type d | xargs chmod 100
# find html -iname *.pl | xargs chmod 500
# find html -iname *.dat | xargs chmod 600
# cd html
# chown www-data ..
# chgrp www-data ..
# chmod 100 ..
 # ウェブサーバのルートへ移動
 # 全てのファイル、ディレクトリをwww-dataにする

 # ファイルをユーザのみ読み取りにする
 # ディレクトリをユーザのみ実行可にする
 # Perlスクリプトファイルはユーザのみ読み取り/実行可能にする
 # データ記憶ファイルはユーザのみ読み取り/書き込み可にする
 # なぜか上の操作で変更されないhtml直下の”..”を変更



上は、findの typeオプションにファイル(f)やディレクトリ(d)を指定し、 パイプを使ってxargs に渡すことでchmodを実行している。xargsは、引数に渡されたコマンド(ex. chmod)に対し、パイプで渡された文字を ”引数のコマンド パイプで渡された文列字"(ex. chmod パイプで渡された文字列)というコマンドを生成&実行する便利な コマンドである。

僕のウェブページでは、Perlスクリプトでカウンターを作っている。 Perlスクリプトは実行だけ、カウンタ保持用データファイルは書き込みだけしか行わないが、 共に読み取り属性を付けないとファイルをオープンできない。そのため、Perlスクリプトファイル、 データファイルにはそれぞれ実行、書き込みの他に読み取り属性も付加した。

Back to MENU

httpd.confの設定

これまでファイルのアクセス制御を.htaccessファイルで行っていたが、.htaccessファイルを使った アクセス制御は apacheのパフォーマンスを低下させる ようだ。そこで、.htaccessで行っていたアクセス制御をhttpd.confに書き換えることにした。

ユーザ認証に関しては、.htaccessファイルの記述がhttpd.confファイルの記述とほぼ等しい。 その違いは、httpd.confでは<Directory>と</Directory>ディレクティブ(指令)で .htaccessの記述を括るところである。
 一方、ファイルのアクセス制御は、FilesやFilesMatchディレクティブを用いる。 但し、ファイル名や拡張子の指定は、<Files>の<>内で行い、ディレクティブ間には 制御順序などを記述する。 例えば、plスクリプトファイル(*.pl)やデータファイル(*.dat)をhttpでアクセス できないようにするには次のように記述する。

<FilesMatch "\.(pl|dat)$">
  Order allow,deny
  Deny from all
</FilesMatch>

正規表現でのピリオドは”何か1文字”を指すワイルドカードになるため、拡張子の区切り文字としての ピリオドの前にはエスケープシークケンス\を記述する。また()内で文字を|で区切ることにより ”又は”の意味を持つ。その際、()を使った後には$を記述するらしい (理由を探しましたが見つからない。無くてもちゃんと機能するようですが・・・)。

 上の記述ではワイルドカード*が記述されてないが、””内の文字の前後に自動的に適用される。 そのため、例えばtest.datとtest.dataというファイルがあると、共に*.dat*にマッチするのでtest.dataまで アクセス拒否されるので注意を要する。

 <FilesMatch>〜</FilesMatch>ディレクティブ間に記述されたOrderは許可(allow)と拒否(deny)の 順序を示す。上の設定では、先にallowが評価され、allow fromでの限定が無いため全てを許可するが、 次に評価されるdenyでは全てを拒絶しているので、結果として全てのアクセスが拒否される。 ここに特定のIPアドレス(例えば192.168.0.など)を記述することで、細かい制御が可能である。

 上と同じ設定を<Files>〜</Files>ディレクティブでも行うことが可能である。 その違いは、FilesMatchディレクティブは、正規表現で記述するのに対し、 Filesディレクティブで正義表現を使用する際はそれを記す記号が必要があることだけである。 具体的には次のように記述する。

<Files ~ "\.(pl|dat)$">
  Order allow,deny
  Deny from all
</Files>

~が正規表現の使用を表す文字である。これが無いと、構文エラーとなって <Files>〜</Files>ディレクティブは無視されてしまう。また、ウェブを 検索すると、"^\.(pl|dat)$"と記述しているのを見かけるが、 ^を入れるのは間違いのようである(^を入れると設定が有効にならない。 構文エラーとみなされているようだ)。

Filesディレクティブ、FilesMatchディレクティブとも、Directoryディレクティブの中に入れて 使うことも可能である。Directoryディレクティブで適用するディレクトリを限定すれば、 そのディレクトリ以下にだけファイルのアクセス制限を設けることができる。 例えば、/var/www/html/friendにユーザ認証を掛け、そのディレクトリにある Perlスクリプトファイル(count.pl)を隠したい場合は下のようになる。

<Directory /var/www/html/friend>
 AuthUserFile /etc/apache/.htpasswd
 AuthName "My Friend Room"
 AuthType Basic
 require valid-user
 order deny,allow
 deny from all
 allow from .bbtec.net
 <FilesMatch "\.pl">
  Order allow,deny
  Deny from all
 </FilesMatch>
</Directory>

Back to MENU

Hyper-Estraierで検索機能付加定

検索機能はCGIで行うため、Hyper-Estraierを設定するだけでなく、httpd.confでCGIを 使えるようにしなくてはならない。 そこで、まずhttpd.confを編集する。とは言え、普通は以下の行が コメントアウトされているので、#を外すだけで済む。

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

<Directory /var/www/cgi-bin>
 AllowOverride None
 Options ExecCGI
 Order deny,allow
 Allow from all
</Directory>

AddHandler cgi-script .cgi

LoadModule cgi_module /usr/lib/apache/1.3/mod_cgi.so
 # CGIを実行するディレクトリ。これ以下にhtmlファイルを置いても見ることができない。

 # CGIを実行するディレクトリの設定
 # .htaccessファイルの上書き設定。Noneは無効
 # ExecCGIでCGIを実行するようになる。SSIの場合、Includesになる。
 # このディレクトリのアクセス制限順序
 # 全て許可(誰でも見れる)


 # CGIの実行ファイルの拡張子(ピリオドは無くても良い)

 # CGIを実行するためのモジュールを有効にする

次にHyper-Estraierをインストールして設定する。 その方法はHyper-Estraierの イントロダクションのページに記述されたやり方そのものである。 僕の環境では、Hyper-Estraierの他に、 QDBmZlibも 必要であった。以下、それらのtarballをダウンロードした後の手順を示す。

# tar zxvf hyperestraier-1.0.1.tar.gz
# cd hyperestraier-1.0.1
# ./configure
# make
# make check
# make install
# cp /usr/local/libexec/estseek.cgi /var/www/cgi-bin
# cp /usr/local/share/hyperestraier/locale/ja/*.* /var/www/cgi-bin
 tarballを展開
 展開したディレクトリへ
 設定、依存関係の確認
 実行ファイル、ライブラリ作成
 実行ファイル、ライブラリのコピー
 CGIを動かすディレクトリにHyper-Estraierをコピー
 日本語版テンプレート、コンフィグファイルなどをコピー

以上でインストールは終了である。もしHyper-Estraierをアンインストールしたいならば、 tarballを展開したディレクトリでmake uninstallを行えば良い。

次にコンフィグファイルを編集し、検索用インデックスを作成する。 コンフィグファイル(estseek.conf)をエディタで開き、次の箇所を修正する。

indexname: /var/www/cgi-bin/casket
lprefix: file:///var/www/html/
gprefix: http://fishers.homeunix.net/
 # 検索用インデックスのディレクトリ
 # ウェブサーバのドキュメントルート
 # ウェブサーバのドメイン

上の編集を終えたら、好みでテンプレート(estseek.tmpl)やトップページ(estseek.top)も編集する。 もちろん、estseek.confでtmplfileとtopファイルに自前のものを用いても良い。 編集が終えたら、estseek.cgiのパーミッションを100に、テンプレートなどは400に変更し、 ユーザ、グループをwww-dataに変更する。

# cd /var/www/cgi-bin/
# chmod 400 estseek.*
# chmod 100 estseek.cgi
# chown www-data estseek.*
# chgrp www-data estseek.*

最後に、検索用インデックスを下のコマンドで作成する。 その際、estseek.confのindexnameに指定したディレクトリに検索用インデックスを作成しなくてはならない。

# cd /var/www/cgi-bin
# estcmd gather -il ja -sd casket /var/www/html
# chown -R www-data casket
# chgrp -R www-data casket
# chmod 400 casket
# find casket -type d | xargs chmod 100
 検索用インデックスを作成するディレクトリへ移動
 /var/www/html以下を日本語でインデックスにする
 ユーザやパーミッションの変更



面倒なことに、estcmdには指定したディレクトリ以下を除外するオプションが無い(ファイル単位ならばある)。 そのため、例えば/var/www/html/friendがユーザ認証を要するページの場合は、後から逐一friend配下のファイルを 除外することになってしまう。 これが面倒なので、僕はシェルスクリプトにインデックスに加えるディレクトリだけを指定して estcmdコマンドを羅列して対処している。はやくディレクトリを指定して除外できるオプションが付かないものか・・・。

Back to MENU

トップページに検索機能を付ける

トップページのHTMLファイルに以下の行を追加することで検索機能が使えるようになる。 これは、estseek.tmplに記述されてる検索文字列入力部を抜き取りって修正を加えたもので、 太字部を自分の環境に合わせたものである。 (サイズも適宜変更したが、これを直さなくても検索可能なので説明は割愛)

<div class="right">
<form action="http://fishers.homeunix.net/cgi-bin/estseek.cgi" method="get">
<input type="hidden" name="enc" value="Shift_JIS" />
<input type="text" name="phrase" value="" size="50" id="phrase" class="text" tabindex="1" accesskey="0" />
<input type="submit" value="K's Pageの検索" id="search" class="submit" tabindex="2" accesskey="1" />
</div>

この記述で重要なのは、3行目のhidden属性のinputである。トップページの文字コードを前述のvalueで 指定することによって、estseek.cgiに引数として渡される。この行が無いと、estseek.cgiに渡される 文字はUTF-8とみなされ、トップページをUTF-8以外で記述している場合は文字化けして検索できない。 3行目の1文を入れておくことで、送られる文字列にenc=Shift_JISも送られ、 Shift_JISで書かれたトップページからも正しく検索できるようになる。

Back to MENU