coLinux日記

coLinuxはフリーソフトを種として、よろずのシステムとぞなれりける。

apache httpd 2.4.2 mod_cgid のソケットについて

2012-07-13 23:10:42 | Apache httpd
前回、apache httpd 2.4.2 を利用していて、mod_cgi が mod_cgid に変更になっていた(2.2.4では、Makefile を作成する configure のデフォルトが --enable-cgi で、 --enable-cgid がオプションでした。)ことに気が付いたので、古い 2.2.4 とちょっと比較しました。

インストールした /usr/local/httpd242 ディレクトリの下は、APRが独立したので lib ディレクトリが無くなった他にはディレクトリ構成は変わりませんが、ほとんどの機能がモジュール化(Apache で 動的共有オブジェクト Dynamic Shared Objeect (DSO) サポートと httpd.conf の中でコメントされています。)されて、modules ディレクトリの下に多数置かれるようになりました。httpd.conf の中で、 LoadModule ディレクティブによってこれらのモジュールを使うか使わないかを指定するので、これらを示すリストのようになっています。

さて、mod_cgid に戻って、それが使うソケット(logs/cgisock.*)に関して気が付いた点を示します。

まず、ソケットの作成権限が無い場合のエラーです。

$ ls /usr/local/httpd242/logs
access_log error_log
$
$ /usr/local/httpd242/bin/apachectl start
(13)Permission denied: AH00072: make_sock: could not bind to address [::]:80
(13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
AH00015: Unable to open logs
$

これは、ソケット作成権限を持つ、例えば root で行えば以下のように解決します。

# ls /usr/local/httpd242/logs
access_log error_log
#
# /usr/local/httpd242/bin/apachectl start
#
# ls /usr/local/httpd242/logs
access_log cgisock.1715 error_log httpd.pid
#

このように新しいソケットが作成されます。ここでリスタートしてみます。
(ps コマンドの出力は少し縮めてあります。)
# ps -ef |grep httpd
root   1715     1  0 xx:08 ?     00:00:00 /usr/local/httpd242/bin/httpd -k start
daemon 1896  1715  0 xx:12 ?     00:00:00 /usr/local/httpd242/bin/httpd -k start
daemon 1897  1715  0 xx:12 ?     00:00:00 /usr/local/httpd242/bin/httpd -k start
daemon 1898  1715  0 xx:12 ?     00:00:00 /usr/local/httpd242/bin/httpd -k start
daemon 1899  1715  0 xx:12 ?     00:00:00 /usr/local/httpd242/bin/httpd -k start
root   1984  1710  0 xx:14 pts/0 00:00:00 grep httpd
#
# /usr/local/httpd242/bin/apachectl restart
#
# ps -ef |grep httpd
root   1715     1  0 xx:08 ?     00:00:00 /usr/local/httpd242/bin/httpd -k start
daemon 1988  1715  0 xx:14 ?     00:00:00 /usr/local/httpd242/bin/httpd -k start
daemon 1989  1715  0 xx:14 ?     00:00:00 /usr/local/httpd242/bin/httpd -k start
daemon 1990  1715  0 xx:14 ?     00:00:00 /usr/local/httpd242/bin/httpd -k start
daemon 1991  1715  0 xx:14 ?     00:00:00 /usr/local/httpd242/bin/httpd -k start
root   2074  1710  0 xx:14 pts/0 00:00:00 grep httpd
#
# ls /usr/local/httpd242/logs
access_log  cgisock.1715  error_log  httpd.pid
#

このようにリスタートすると親プロセスは残って、子プロセスだけを立ち上げ直しています。つまり、先ほど作成したソケットは再利用されます。

ここで、httpd を終了してみます。

# /usr/local/httpd242/bin/apachectl stop
#
# ps -ef |grep httpd
root 2079 1710 0 xx:20 pts/0 00:00:00 grep httpd
#
# ls /usr/local/httpd242/logs/
access_log error_log
#

全てのプロセスが終了し、ソケットも消去されます。

もし、何らかの理由で(今回の例は、Windowsをアップデートしたら再起動して、coLinux が強制終了したときのものです。)ソケットが消去できなかった場合は、

# ls /usr/local/httpd242/logs
access_log cgisock.1731 error_log httpd.pid
#
# /usr/local/httpd242/bin/apachectl start
#
# ls /usr/local/httpd242/logs
access_log cgisock.1715 cgisock.1731 error_log httpd.pid
#

のように、残ってしまった、cgisock.1731 はそのままで、新しいソケットが作成されます。その場合は、消しておく必要があります。

# rm /usr/local/httpd242/logs/cgisock.1731

注意したい点です。httpd.pid は、毎回作成されますのでそのままで問題ないのは従来どおりです。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

apache httpd 2.4.2 の mod_sed 入力フィルタ機能

2012-07-06 01:58:19 | Apache httpd
またまた、apache httpd 2.4.2 の mod_sed ですが、今回は入力時のフィルタ機能について試してみました。ディレクティブで言うと、AddInputFilterInputSed ですね。

httpd に対して、POST されたときにこの機能が適用されます。そのためには、CGIが動作できるように設定する必要があります。

実は現在の apache httpd では、CGI 用のモジュールとして、mod_cgi ではなくて、mod_cgid が標準でインストールされています。つまり、前回のインストールでは、mod_cgi は作成されず、どうしても mod_cgi が必要なら、configure のオプションで、

--enable-cgi

を追加する必要があります。mod_cgid の通信はソケットで行うので、ScriptSock ディレクティブが用意されています。標準ではソケット名は、

/usr/local/httpd242/logs/cgisock

です。cgi の設定は、httpd.conf で以下を指定します。

LoadModule cgid_module modules/mod_cgid.so

後は以前と同様です。

再起動すると、

# ls -l /usr/local/httpd242/logs/cgisock.*
srwx------ 1 daemon root 0 Jul x xx:xx /usr/local/httpd242/logs/cgisock.1731
#
というソケットが作成されます。ちなみに1731 は、httpd のプロセスIDです。これで CGI の準備はできました。

今回の mod_sed の入力フィルタを試すには、htmlファイルと CGI 用のプログラムが必要です。早速用意してみます。

html ファイルは、/usr/local/httpd242/htdocs/sed/test2-sed.html として、

<html><head></head><body>
<form action="/sed/program/prog1.sh" method="post">
<label>data1: <input type="text" name="data1"></label><br>
<label>data2: <input type="text" name="data2"></label><br>
<input type="submit" value="OK">
<input type="reset" value="Reset"><br>
</form>
</body></html>

とします。

そこで呼び出される CGI プログラム /usr/local/httpd242/htdocs/sed/program/prog1.sh は、bash で作ります。


#!/bin/bash
echo "Content-type: text/html"
echo ""
echo "<html><head></head><body><pre>"
read Line

echo $Line

echo "</pre></body></html>"


テストするためにブラウザで、data1 に <b>abc</b> 、data2 に<u>def</u>を入れて prog1.sh を動かすと、

data1=%3Cb%3Eabc%3C%2Fb%3E&data2=%3Cu%3Edef%3C%2Fu%3E

のように POST によって送られてきたデータがそのまま表示されます。

準備が出来たので、mod_sed の入力フィルタのテスト用にはクロスサイトスクリプティング対策で基本のエスケープ処理を実施してみます。

< が %3C 、> が %3E 、& が %26 、" が%22 、' が %27 ですから、

%3C なら、%26lt%3B 、%3E なら %26gt%3B 、
%26 なら %26amp%3B 、 %22なら %26quot%3B
%27 なら、%26%2339%3B に変換してしまいましょう。最初に %26 を処理してしまうのがコツです。

ディレクティブはこうなります。
<Directory "/usr/local/httpd242/htdocs/sed/program">
   Options +ExecCGI
   AddHandler cgi-script .sh
   AddInputFilter Sed sh
   InputSed "s/%26/%26amp%3B/g"
   InputSed "s/%3C/%26lt%3B/g"
   InputSed "s/%3E/%26gt%3B/g"
   InputSed "s/%22/%26quot%3B/g"
   InputSed "s/%27/%26%2339%3B/g"
</Directory>

これは入力フィルタなので、出力フィルタで問題になった 304 を返さないように htmlファイルを更新しておく必要はないのでテストは楽です。

data1 に <b>a&b</b> 、 data2 に <u>"de'</u> を与えてみますと、

data1=%26lt%3Bb%26gt%3Ba%26amp%3Bb%26lt%3B%2Fb%26gt%3B&
data2=%26lt%3Bu%26gt%3B%26quot%3Bde%26%2339%3B%26lt%3B%2Fu%26gt%3B

のようになりました。(適当に改行してあります。)

念のために変換された入力データをデコードして表示してみます。bash で、POSTされたデータをデコードする方法は、
http://betu-masea.cocolog-nifty.com/blog/2006/10/bash3_1cf1.html
が参考になります。そこで定義されている urldecode() という関数をそのまま使って、先ほどのprog1.sh スクリプトの echo $Line の部分を、

urldecode Line
echo $RESULT

とすれば、上述の結果は、

data1=&lt;b&gt;a&amp;b&lt;/b&gt;&data2=&lt;u&gt;&quot;de&#39;&lt;/u&gt;

となりました。これだと既存のプログラムの & 文字処理を修正する必要があるかもしれませんので、実際に使う場合はデコード前のパラメタの分離とこの辺の工夫が必要です。

POSTで mod_sed に渡されたデータは丸ごとパターンスーペースに入力してしまうので1サイクルで処理が行われるようです。つまり、N コマンドのような次の行を読み込むものは意味がなさそうです。

ざっと調べたところ InputSed の例はほとんど見当たりませんが、今回試してみて以外に役立つような気がしました。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

apache httpd 2.4.2 の mod_sed 続き

2012-07-01 02:20:20 | Apache httpd
apache httpd 2.4.2 の mod_sed の続きです。前回提示した例が動作しなかった原因を探ってみました。

まず分岐が正しく動作するかどうかを試してみます。

sed の分岐は、

b ラベル の通常の分岐と、
t ラベル の条件分岐です。

そこで、httpd-sed-scripts.conf を以下のようにします。
<Directory "/usr/local/httpd242/htdocs/sed">
   AddOutputFilter Sed html
   OutputSed   "b loop1"
   OutputSed ":loop2"
   OutputSed   "s/good line/GOOD bad LINE/"
   OutputSed   "b"
   OutputSed ":loop1"
   OutputSed   "s/bad/good/"
   OutputSed   "t loop2"
</Directory>

・最初の b コマンドで loop1 へ分岐し、
・行内に bad の文字があったら、good に変換して、
・t コマンドによって loop2 へ分岐します。
・badの文字が無ければそのままサイクルを終了して次の行へ行きます。
・loop2 へ分岐した場合は、good line を GOOD bad LINE に変えて、
・ラベルなし b コマンドでサイクルを終了して次の行へ行きます。

これによって、b,t コマンドが正しく動作しているかを調べるのがねらいです。早速、htmlファイルの次の部分を変換させます。

(例1)
First line<br>
good line<br>
bad line<br>
Last line<br>

結果は次のとおりです。

First line<br>
good line<br>
GOOD bad LINE<br>
Last line<br>

t コマンドの分岐で戻る動作や、b コマンドの終了動作もうまくいっています。

実は、b にアドレスを付けると、分岐先のラベルが無い場合でもサイクルを終了しないようですのでご注意ください。それで、以降の設定では、アドレス付きの b コマンドは必ずラベルを指定してあります。

次にアドレスを見てみます。! が使えないことは分かりましたので、以下を試してみます。
(以降は OutputSed のところのみ示します。)

OutputSed "/<pre>/,/<¥/pre>/ {"
OutputSed "/<pre>/ b next"
OutputSed "/<¥/pre>/ b next"
OutputSed "s/^.*$/IN &/"
OutputSed ":next"
OutputSed "}"

htmlファイルのこの部分を変換してみます。

(例2)
First line<br>
<pre>
good line
</pre>
2nd line<br>
<pre>
good line
bad line
</pre>
Last line<br>

結果は次のとおりです。

First line<br>
<pre>
IN good line
</pre>
2nd line<br>
<pre>
IN good line
IN bad line
</pre>
Last line<br>

これもうまく動作しています。

最後に s コマンドの気になるところを試します。

OutputSed "s/\(One\)\(Two\)\(Three\)/¥3¥2¥1/"
OutputSed "/^Three/ s/^.*$/\n&\n/"

残念ながら以下の行が、

OneTwoThree

正しく変換されません。改行文字 \n が無視されて n とみなされます。

nThreeTwoOnen

どうやら、s/regexp/replacement/flags において、「replacement」の \n は認識されず n となり、「regexp」 の \n は認識されるようで、

OutputSed "N"
OutputSed "s/\(.*\)\n\(.*\)/¥1@¥2/"

は、2つの行が @ をはさんで1行として変換されます。

そこで改行文字は諦めて、@ 文字を使ってうまく動作しなかった sed スクリプトを修正してみます。

OutputSed "/<pre>/,/<¥/pre>/ {"
OutputSed "/<pre>/ b next"
OutputSed "/<¥/pre>/ b next"
OutputSed "/^$/ b next"
OutputSed "/^.$/ b next"
OutputSed "s/^.*$/@&@/"
OutputSed "t loop"
OutputSed ":loop"
OutputSed "s/\(@.\)\(.*\)\(.@\)/¥3¥2¥1/"
OutputSed "t loop"
OutputSed "s/@//g"
OutputSed "s/^\(.*[^ ]\)\( *\)$/¥2¥1/"
OutputSed ":next"
OutputSed "}"

(例2)は以下のようになり、何とかうまくいきました。

First line<br>
<pre>
enil doog
</pre>
2nd line<br>
<pre>
enil doog
enil dab
</pre>
Last line<br>

OutputSed修正後に動作確認を行う際には、

# touch /usr/local/httpd242/htdocs/sed/*

を忘れないようにしましょう。

というわけで、mod_sed には多少の問題点がありますが、Experimental ですし、たいていのものは出来るので、積極的に利用したいと思います。それに今回調べたことで、sed コマンドの奥深さが改めて分かったので、そちらも得した気分です。

(行間が無駄に開いている部分がありますが、gooブログの仕様です。)
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

apache httpd 2.4.2 の mod_sed

2012-06-27 22:09:00 | Apache httpd
apache httpd 2.4 の新機能 mod_sed を試します。ドキュメントで示されている例は単純なのでもう少し複雑なもので調べてみます。

sed を知るために、ここでは以下を参考にします。

http://www.bookshelf.jp/texi/sed/sed-ja.html#SEC_Top

重要なのは、「3.1 sed が動作する様子」です。自分用にまとめてみます。


それによると、sed 動作は、次のサイクルを行ごとに繰り返します。

・1行読み込み改行文字を削除して「パターン空間に配置」する。
・アドレスに合致したら、パターン空間の文字列に対してコマンドを実行
・全てのコマンドが終了したら、
 指示がない限りパターン空間の内容を出力して、
 指示がない限り改行文字を出力する。
・パターン空間の内容を削除し、最初に戻る。

これに加えてサイクル間でデータを保持できるホールド空間があり、パターン空間とデータをやり取りする特殊なコマンドが用意されています。


以上の点から、sed スクリプトは複数行のコマンドからなるプログラムにすることが可能であり、当然のように mod_sed も複数行のスクリプトを受け付けるようになっています。それがどこまで可能なのかを探ってみます。

例えば、
<pre>
........
</pre>
の、....... の部分だけを行の文字を反転する(4.5章参照)ことにするために sed スクリプトを次のようにしたとします。fedora14 の GNU sed ver. 4.2.1 では一応動作します。
/<pre>/,/<\/pre>/ {
  /pre>/! {
    /../! b
    s/^.*$/\n&\n/
    t loop
    :loop
    s/\(\n.\)\(.*\)\(.\n\)/¥3¥2¥1/
    t loop
    s/\n//g
    s/^\(.*[^ ]\)\(  *\)$/¥2¥1/
  }
}

これを 設定ファイル httpd.conf に組み込んでみます。mod_sed の説明にしたがいます。今回は、OutputSed ディレクティブを使います。これに指定するには上のスクリプトを1行づつ順番に指定していくようです。

このような後で変更の可能性があるものは、httpd.confに直接指定しないで以下のものを追加にして、今後は httpd-sed-scripts.conf を修正することにします。


LoadModule sed_module modules/mod_sed.so

Include /usr/local/httpd242/conf/extra/httpd-sed-scripts.conf


httpd-sed-scripts.conf は、説明どおりに mod_sed 用のディレクティブを指定します。

<Directory "/usr/local/httpd242/htdocs/sed">
AddOutputFilter Sed html
OutputSed "/<pre>/,/<\/pre>/ {"
OutputSed "/pre>/! {"
............................
OutputSed "}"
</Directory>

しかし、これは httpd を再起動すると次のエラーになります。

Failed to compile sed expression. unrecognized command: /pre>/! {

つまり、sedスクリプトの構文エラーは、httpd の起動時にチェックされるようです。ちなみにエラーが2つある場合は、最初のエラーのある行を直すと、次の行でエラーがでます。

アドレスの中の ! がエラーになっているようです。どうやら完全に sed コマンドと互換性が取れているわけではないようです。

さらにやっかいなのは既存の sed スクリプトの修正です。

もし OutputSedInputSed を修正しても、指定ディレクトリ以下のファイルが更新されないと、httpd は 304 をブラウザに返します。ブラウザはアクセスしようとしたファイルが更新されてないとして、自分のキャッシュを使って表示されるので修正が反映されません。

またマニュアルには、.htaccess に指定できるようになっていますが、試してみると、

[core:alert] ...省略... /usr/local/httpd242/htdocs/sed/.htaccess: OutputSed not allowed here

のようなエラーになって error_log に出力され、500で戻ってきて使えませんでした。

現在のところ上の sed スクリプトはまだ動作していません。時間があれば、どこが問題かを調べてみたいと思います。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

apache httpd 2.4.2 の mod_data

2012-06-21 22:32:29 | Apache httpd
前回インストールした Apache httpd 2.4.2 の configure のオプション でさりげなく指定した --enable-data は、2.4 から利用可能な mode_data を用意します。URI の指定する画像ファイルを RFC2397 の data: 形式のURI に変換する機能のようです。
<Location /data/images>
    SetOutputFilter DATA
</Location>

とすれば、ここの設定では、/usr/local/httpd242/htdocs/data/images の下の小さな画像を data: 形式に変換してくれます。

具体的な例として、/usr/local/httpd242/conf/httpd.conf の中で、

LoadModule data_module modules/mod_data.so

<IfModule data_module> <Location /data/images> SetOutputFilter DATA </Location> </IfModule>

を指定します。

早速試してみます。素材は、無料のボタンやアイコンを提供されている、

「ネットショップ素材.com」
http://www.shop-sozai.com/

から2つのイメージ、

http://www.shop-sozai.com/hit/img/hit01.gif
http://www.shop-sozai.com/hit/img/hit05.png

を取り寄せました。これを所定のディレクトにコピーします。

# cp hit01.gif hit05.png /usr/local/httpd242/htdocs/data/images

このcoLinux のホスト名は、fedora14 ですから、ブラウザで直接以下のURIをアクセスしてみます。

http://fedora14/data/images/hit01.gif

ブラウザに次のような結果が返ってきます。(改行してあります。)

data:image/gif;base64,R0lGODlhLQAtALMAAMwAAOaAgNIgIP////LAwNl
AQOJwcOuZmfXNzdYwMM8QEAAAAAAAAAAAAAAAAAAAACH5BAAHAP8ALAAAAAAt
AC0AAATPMIEJkqSW1jsz5pvmgV5HniL6aWzrvnAsz3Rt33iOq2bqr8Be5Scsh
oJHo27JbDqf0CcvSS1VVVOrNjuNer/gsKhQUEzIhTMZIEC7CwLYFDEYpAH1wS
QPCOT/AwdYRAB0dnt1iHp+gHWChDAEdXd8eIkUjAFOko16lp4TmZudnpWhdZp
NnAZklaZ9qDNzk4q1FAexVx2EhpSXr7gDqVs0nL6ll6fCYszNzjuExEjSQlzR
1kjP2tvczNhG1LpD09/iSt3o6eo25eHuF+3xkOoRADs=

同様に、

http://fedora14/data/image/hit05.png

はこのようになります。(改行してあります。)

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAYAAADF
eBvrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RV
(以下省略)

たしかにタイプは識別されて変換されています。ちなみに、

Content-Type: text/plain

として値が返ってきますので、ブラウザにこの URI がそのまま表示されてしまうことになります。この変換された URI を利用して、html ファイルの中に、img タグを次のように指定します。

<img alt="Hit"
src="data:image/gif;base64,R0lGODlhLQAtALMAAMwAAOaA......">


ブラウザで見ると、確かに画像が表示されます。注意したいのは、

<img alt="Hit" src="http://fedora14/data/images/hit01.gif">

と指定してしまうと、画像データではなくて変換されたURIが返ってきてしまうのでブラウザではイメージは表示されずに alt で指定した文字列が表示されることです。つまり通常の方法では、このディレクトリの下の画像を表示することは出来なくなります。

変換されるタイミングは、httpd に対して、

GET /data/images/hit01.gif HTTP/1.1

が要求された時のようで、その時変換された URI が返却されます。

SSI でこれを利用しようとして、例えば、

<img src="<!--#include virtual="/data/images/hit01.gif" -->" alt="Hit">

と指定しても、結果はこのフィルタを通らず直接画像データが src= の直後に挿入されるだけでこの機能は使えません。というわけで、この機能と SSI(mod_include) を使って何か出来るという予想は間違いのようです。

以上の点から実際にこの機能が何に使えるのかはよく分かりませんでした。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

apache httpd 2.4.2 のインストール

2012-06-17 15:34:24 | Apache httpd
httpd 2.4.2 をインストールするためには、前回に続いて Perl5 互換の正規表現をC言語で実装したライブラリである、PCRE ( http://pcre.org/ ) をインストールします。実際にこれを利用しているのは、分かっているところで、

httpd-2.4.2/server/util_pcre.c

です。

$ gpg --verify pcre-8.30.tar.gz.sig
gpg: Signature made Sat Feb 4 09:37:26 2012 EST using RSA key ID FB0F43D8
gpg: Good signature from "Philip Hazel <ph10@hermes.cam.ac.uk>"
gpg: aka "Philip Hazel <ph10@cam.ac.uk>"
gpg: aka "Philip Hazel <ph10@cus.cam.ac.uk>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 45F6 8D54 BBE2 3FB3 039B 46E5 9766 E084 FB0F 43D8

$ LDFLAGS=-L/usr/local/lib CPPFLAGS=-I/usr/local/include \
./configure --enable-pcregrep-libz
...................
$ make
,,,,,,,,,,,,,,,,,,,

(このとき、g++ がないと
 CXX pcrecpp.lo
 libtool: compile: unrecognized option `-DHAVE_CONFIG_H'
 libtool: compile: Try `libtool --help' for more information.
 make[1]: *** [pcrecpp.lo] Error 1
 make[1]: Leaving directory `/home/espiya/src/pcre-8.30'
 make: *** [all] Error 2
 のようなエラーになります。ちょっと分かりにくいので念のために書いておきます。)

$ make test
........................
Testing pcregrep
pcregrep version 8.30 2012-02-04
Skipping pcregrep UTF-8 tests: no UTF-8 support in PCRE library
Testing pcregrep newline settings
PASS: RunGrepTest
==================
All 5 tests passed
==================
make[2]: Leaving directory `/home/espiya/src/pcre-8.30'
make[1]: Leaving directory `/home/espiya/src/pcre-8.30'
$

# make install 2>&1 |tee Install.log

これで、PCRE が /usr/local へインストールされました。

準備が整いましたので、早速、Apache httpd 2.4.2 のソースを取り寄せます。

$ md5sum httpd-2.4.2.tar.gz
02d674020d5eda33267861d4a09bf3d4 httpd-2.4.2.tar.gz
$ gpg --verify httpd-2.4.2.tar.gz.asc
gpg: Signature made Thu Apr 5 08:16:57 2012 EDT using RSA key ID 791485A8
gpg: Good signature from "Jim Jagielski (Release Signing Key) <jim@apache.org>"
gpg: aka "Jim Jagielski <jim@jimjag.com>"
gpg: aka "Jim Jagielski <jim@jaguNET.com>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: A93D 62EC C3C8 EA12 DB22 0EC9 34EA 76E6 7914 85A8

展開して、./configure を使って必要なものを調べて、コンパイルオプションを決めます。

$ ./configure --help

SSI とかも一応いれておきます。標準の設定ファイルでは使用できないようになっています。

$ tar xzf httpd-2.4.2.tar.gz
$ cd httpd-2.4.2
$ ./configure --prefix=/usr/local/httpd242 --enable-usertrack \
--enable-auth-digest \
--enable-ssl --enable-rewrite --enable-so \
--enable-dav --enable-dav-fs --enable-dav-lock \
--enable-data --enable-include \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr --with-z=/usr/local \
--with-ssl=/usr/local/ssl --with-pcre=/usr/local
................
$ make
................
$

# make install 2>&1 |tee Install.log

これで、httpd が、/usr/local/httpd242 にインストールされました。最初の設定では設定ファイル等もこのディレクトリの下に集約されていますので、いろいろ試すにはこの状態を利用すると便利です。最後に簡単な動作確認をしてみます。

# /usr/local/httpd242/bin/apachectl start
# lynx -dump http://fedora14/
                  It works!


# lynx -head -dump http://fedora14/
HTTP/1.1 200 OK
Date: Sun, 17 Jun 2012 07:18:37 GMT
Server: Apache/2.4.2 (Unix)
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Connection: close
Content-Type: text/html


# /usr/local/httpd242/bin/apachectl stop
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

apache httpd 2.4.2 のインストールの準備

2012-06-12 21:07:14 | Apache httpd
しばらく作業をしていなかったら、Apache httpd のバージョンが 2.2 から 2.4 へアップしていました。今使っている Fedora14 では標準で 2.2.17 ですから、これを使うにはコンパイルするしかありません。

ところが、このブログで紹介しているとおりに行っても configure で、以下のようなメッセージが出てうまく Makefile が作成できません。

Configuring Apache Portable Runtime library ...

checking for APR... no
configure: error: APR not found. Please read the documentation.

そこで、ソースの modules/ ディレクトリの中の、例えば filters などのソースファイルを見てみますと、apr_ という名前の関数を大量に使用しています。

APR(Apache Portable Runtime) http://apr.apache.org/ は、Apache が、OS環境の違いを吸収するために用意した API ですから当然ですね。Apache がクロスプラットフォームなプログラムを重視していることが良く分かります。

そこで APR をインストールします。apr-iconv は、iconv を利用するので使いません。

先に、libiconv 1.14 (http://www.gnu.org/software/libiconv/ )をインストールします。

$ gpg --verify libiconv-1.14.tar.gz.sig
gpg: Signature made Sun Aug 7 13:58:18 2011 EDT using DSA key ID F059B1D1
gpg: Good signature from "Bruno Haible (Open Source Development) <bruno@clisp.org>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 1736 90D4 963E 5FC4 6917 7FA7 C71A 4C65 F059 B1D1
$
$ tar xzf libiconv-1.14.tar.gz
$ cd libiconv-1.14
$ ./configure
,,,,,,,,,,,,
$ make
............

# make install 2>&1 |tee Install.log

これで libiconv が、/usr/local にインストールされました。

今回インストールする APR は、apr 1.4.6 と apr-util 1.4.1 です。

$ md5sum apr-1.4.6.tar.gz
76cc4457fbb71eefdafa27dba8f511fb apr-1.4.6.tar.gz
$ gpg --verify apr-1.4.6.tar.gz.asc
gpg: Signature made Tue Feb 7 18:17:58 2012 EST using RSA key ID 9E49284A
gpg: Good signature from "Bojan Smojver <bojan@rexursive.com>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7CDB ED10 0806 5521 82F9 8844 E8E7 E00B 4DAA 1988
Subkey fingerprint: 5D23 B66B 5AEF 5B17 23A1 F0DC 71AD C85E 9E49 284A
$

$ md5sum apr-util-1.4.1.tar.gz
666a5d56098a9debf998510e304c8095 apr-util-1.4.1.tar.gz
$ gpg --verify apr-util-1.4.1.tar.gz.asc
gpg: Signature made Wed Dec 7 17:53:14 2011 EST using DSA key ID 751D7F27
gpg: Good signature from "Graham Leggett <minfrin@sharp.fm>"
gpg: aka "Graham Leggett <minfrin@apache.org>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: EB13 8C6A F0FC 6910 01B1 6D93 344A 844D 751D 7F27
$

先に apr 1.4.6 を展開してコンパイルします。

$ tar xzf apr-1.4.6.tar.gz
$ cd apr-1.4.6
$ ./configure
.................
$ make
.................
$ make test
.................
testatomic     : SUCCESS
testdir       : SUCCESS
testdso       : SUCCESS
testdup       : SUCCESS
testenv       : SUCCESS
testfile      : SUCCESS
testfilecopy    : SUCCESS
testfileinfo    : SUCCESS
testflock      : SUCCESS
testfmt       : SUCCESS
testfnmatch     : SUCCESS
testargs      : SUCCESS
testhash      : SUCCESS
testipsub      : SUCCESS
testlock      : SUCCESS
testcond      : SUCCESS
testlfs       : SUCCESS
testmmap      : SUCCESS
testnames      : SUCCESS
testoc       : SUCCESS
testpath      : SUCCESS
testpipe      : SUCCESS
testpoll      : SUCCESS
testpools      : SUCCESS
testproc      : SUCCESS
testprocmutex    : SUCCESS
testrand      : SUCCESS
testsleep      : SUCCESS
testshm       : SUCCESS
testsock      : SUCCESS
testsockets     : SUCCESS
testsockopt     : SUCCESS
teststr       : SUCCESS
teststrnatcmp    : SUCCESS
testtable      : SUCCESS
testtemp      : SUCCESS
testthread     : SUCCESS
testtime      : SUCCESS
testud       : SUCCESS
testuser      : SUCCESS
testvsn       : SUCCESS
All tests passed.
make[1]: Leaving directory `/home/espiya/src/apr-1.4.6/test'
$

# make install 2>&1 |tee Install.log

これで、/usr/local/apr にインストールされました。

次に apr-util 1.4.1 です。データーベースを使いますが、ここではとりあえず gdbm を使います。devel が無ければ入れておきます。
# yum insall gdbm-devel

$ tar xzf apr-util-1.4.1.tar.gz
$ cd par-util-1.4.1
$ ./configure --with-apr=/usr/local/apr \
       --with-openssl=/usr/local/ssl \
       --with-iconv=/usr/local --with-dbm=gdbm
.................
$ make
.................
$ make test
.................
teststrmatch    : SUCCESS
testuri       : SUCCESS
testuuid      : SUCCESS
testbuckets     : SUCCESS
testpass      : SUCCESS
testmd4       : SUCCESS
testmd5       : SUCCESS
testcrypto     : SUCCESS
testdbd       : SUCCESS
testdate      : SUCCESS
testmemcache    : SUCCESS
testxml       : SUCCESS
testxlate      : SUCCESS
testrmm       : SUCCESS
testdbm       : SUCCESS
testqueue      : SUCCESS
testreslist     : SUCCESS
All tests passed.
make[1]: Leaving directory `/home/espiya/src/apr-util-1.4.1/test'
$

# make install 2>&1 |tee Install.log

となって、/usr/local/apr にインストールされました。長くなったので続きは次回にします。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

WebDAV と WindowsXP

2007-03-19 21:57:37 | Apache httpd
久しぶりの投稿です。

Apache httpd 2.2.4 + WebDAV + mod_ssl + digest で、httpd-dav.conf の中の次の部分に注目します。
<LimitExcept GET OPTIONS>
   require user espiya
</LimitExcept>

ここで、GET は、ブラウザからページを見るために除外しているのですが、OPTIONS はどうでしょうか。

試しに OPTIONS を除外しないと、
「ネットワークプレースの追加ウィザード」で、URLを指定しても、
「入力したフォルダは有効でないようです。別のフォルダを選択してください。」のメッセージがでます。

error_log には、
File Dose not exist: /home/data/davhome/_vti_inf.html
File Dose not exist: /home/data/davhome/_vti_bin

のようなメッセージがでます。これは、Windows XPが サーバをFrontPage Server Extension とみなすためらしいです。
mod_headers を使って、
  Header add MS-Author-Via "DAV"

を指定すればよいということです。これは、httpd コンパイル時に、configure のオプションで、
  -enable-headers

オプションが必要ですね。ただ試してみても、ここではうまくいきませんでした。

ちなみに、ないと言われるファイルやディレクトリを適当に作ってもエラーになるのでお手上げです。Mac ではこんなことはないのですが、Windows XP の WebDAV クライアントは不思議な仕様です。

また、前回作成したクライアント証明書の期限が切れ、そのときのエラーがどのように出るかが分かりました。

FireFox 2.0.0.2 では、「警告」ウィンドウが表示されて、「あなたの証明書の有効期限がきれているため、www.example.co.jp と暗号化された接続を確立できませんでした。」

のメッセージがでました。

InternetExplorer 6 では、「サーバーがみつかりません。」になりました。

/usr/local/httpd224/logs/error_log は、
[warn] Found CRL is expired - revoking all certificates until you get 
      updated CRL
[error] Certificate Verification: Error (12): CRL has expired

のようになりました。その後、証明書を変えたらうまくいかなくなりいろいろ試したところ、Digest認証のウィンドウでパスワードを保存しないようにレ点をはずしたらうまくいきました。Windows XPの場合いろいろパスワードなどを溜め込んでいるいるせいでしょうか。パスワードの保存が標準というのが気になります。

また、ここで使っているSSLのクライアント認証ですが、証明書を無効にする場合「証明書の失効」をおこないますが、httpd-ssl.conf の SSLCARevocationFile の指定をやめると証明書が復活してしまうようです。この辺がはっきりしないと実際の運用で問題になりそうです。使うときは必ず検証したほうがよいですね。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

WebDAVで気になること

2007-02-17 00:45:52 | Apache httpd
Apache httpd 2.2.4 で WebDAV を実行できるようになりましたが、WebDAV を利用してファイルを書き込みにいくと作成されたファイルのパーミッションは
# ls -l /home/data/davhome/dav/test001.txt
-rw-r--r-- 1 www www ...................
#

となって、同じグループに属する複数のユーザで利用するときに、coLinux 側から修正できません。
# umask
0022
#

だからだと思います。これは通常は変更しません。

しかし umask を変更する httpd のディレクティブはないみたいです。確か Apache httpd 1.3.37 あたりで mod_dav を持ってくるときにソースを見たら open() が直接使ってあったので、その直前に umask(00002) とか行えばできそうです。httpd-2.2.4/modules/dav/ 以下を調べると open()がありません。おそらく Apache httpd の module に入ったときに変更があり、変わりに
apr_file_open()

が使われているようです。

http://dev.ariel-networks.com/apr/apr-tutorial/html/apr-tutorial-5.html
によると、APR_OS_DEFAULT (0666 らしいです)が使えるらしいので、dav/fs 内を調べたところ、repos.c にそれらしき記述が。
/* ### do we need to deal with the umask? */
status = apr_file_open(&outf, dst, APR_WRITE | APR_CREATE | APR_TRUNCATE
                       | APR_BINARY, perms, p);

ここは、dav_fs_copymove_file() 内です。ここに
umask(00002);

と入れてみます。しかしこれははずれ。さらに dav_fs_open_stream() あたりにそれらしき記述があるので、この関数内の最初に umask(00002); を入れて、Windows XP からこのフォルダに何かファイルをコピーしたところ
# ls -l /home/data/davhome/dav/test001.txt
-rw-rw-r-- 1 www www ...................
#

これで一応うまくいきました。実際には、1回ここを通れば以降はすべてこの umask が有効になり、何回も umask を実行してしまうのであまり良い修正ではありませんし、他に影響を与えないように終わったら元に戻しておかないといけないと思いますので、すごくいい加減ですが実験なのでこれで OK です。

忘れないように書いておきますが、ソースを修正したら httpd-2.2.4/ で、
$ make
...........
# make install 
...........
# /etc/init.d/httpd stop
# /etc/init.d/httpd start
#

のようにしてから試します。その際、/usr/local/httpd224/conf 以下の設定は変更されず、/usr/local/httpd224/conf/original 以下が置き換わるだけです。便利ですね。

coLinux 側で、group 名 www のファイルを各ユーザが扱えるようにするには、
# lgroupmod -M espiya www

$ groups espiya
espiya: user www

$ newgrp www 

みたいなコマンドを使うわけです。フォルダ(coLinux 側ではディレクトリ) の場合も1回 umask を通ってしまえばこちらが有効になります。

こんな修正がお気楽にできるのも、家庭内の coLinux 環境で、Apache httpd をソースからインストールしたからで
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Apache httpd 2.2.4でWebDAV + ssl + Digest

2007-02-15 21:09:49 | Apache httpd
前回で OpenSSL の設定も終わりクライアント認証もできたので、WebDAV + ssl + Digest 認証を試してみます。

Apache httpd で ssl をクライアント認証にしておけば、クライアント証明書と自己認証型CA証明書を持っていないとアクセスできません。さらに WebDAV を使うときはDigest認証でパスワードを求められますから、一応安全といえるかもしれません。(本当は全部いっぺんに試してみたかっただけです。)

あらかじめ OpenSSL で証明書を用意して、それを httpd に反映しておきます。http の参照と https の参照は分離しておきます。ここでは、
http://www.example.co.jp/  なら、  /home/data/www     を
https://www.example.co.jp/ なら、 /home/data/davhome を

ドキュメントルートにします。

すでに、httpd は WebDAV に対応するようにコンパイルしてあります。
クライアント認証の設定も済んでいます。httpd 2.2.4 の設定ファイル httpd.conf,httpd-ssl.conf,httpd-dav.conf を修正します。気になる点だけ示すと、
・/usr/local/httpd224/conf/httpd.conf

User www
Group www

Include conf/extra/httpd-dav.conf
Include conf/extra/httpd-ssl.conf

・/usr/local/httpd224/conf/extra/httpd-ssl.conf

DocumentRoot "/home/data/davhome"
ServerName www.example.co.jp:443
ServerAdmin root@example.co.jp

SSLEngine on

SSLCertificateFile /usr/local/keys/server/server.crt
SSLCertificateKeyFile /usr/local/keys/server/servernp.key

SSLCACertificatePath /usr/local/keys/CA/
SSLCACertificateFile /usr/local/keys/CA/cacert.crt

SSLVerifyClient require
SSLVerifyDepth  10

<Directory "/home/data/davhome">
    Options None
    AllowOverride None
    Order allow,deny
    Allow from 192.168.1
</Directory>   

・/usr/local/httpd224/conf/httpd-dav.conf

DavLockDB "/usr/local/var/dav/DavLock"
Alias /dev "/home/data/davhome/dav"

<Directory "/home/data/davhome/dav">
    Dav On
    Order Allow,Deny
    Allow from 192.168.1
    AuthType Digest
    AuthName DAV-upload
    AuthUserFile "/usr/local/etc/password/davuser1.passwd"
    <LimitExcept GET OPTIONS>
        require user espiya
    </LimitExcept>
</Directory>

ここの LimitExcept は、このディレクトリを Web で公開するためです。ファイルのやり取りだけに使いたい場合はこれなしで直接 require を普通に指定すれば良いです。必要なディレクトリやパスワードファイルを準備します。
# mkdir /usr/local/etc/password
# mkdir /usr/local/var/dav
# chown www.www /usr/local/var/dav
# mkdir /home/data/davhome
# mkdir /home/data/davhome/dav
# chmod 0775 /home/data/davhome/dav
# chown www.www /home/data/davhome/dav
    
# htdigest -c '/usr/local/etc/password/davuser1.passwd' DAV-upload espiya
..............   Digest 認証のパスワード作成
# /etc/init.d/httpd restart

Windows XP で試してみます。「マイネットワーク」→「ネットワークプレースを追加する」→「ネットワークプレースの追加ウィザード」ウィンドウ →「次へ」→「別のネットワークの場所を選択」→「次へ」
ここで、アドレス https://www.example.co.jp/dav/ を指定し、
「デジタル証明書の選択」でクライアント証明書を選択する →「ネットワークのパスワードを入力」ウィンドウ→ユーザー名、パスワードで htdigest で指定したものを入れるとアイコンが作成され、開くと指定したディレクトリが Windows のフォルダとして開けました。

ここで、/home/data/davhome の下に dav ディレクトリを作ったのは、Digest パスワードファイルを利用者ごとに作成して、利用するディレクトリも分けようとの意図からです。つまり、/home/data/davhome/dav が参照できるのは、/usr/local/etc/password/davuser1.passwd にユーザ登録されている利用者だけです。

ところで、ssl を利用しない場合に「ネットワークプレースに追加」しようとして、ユーザとパスワードを入力してもうまく動作しません。その場合は、アドレスの最後に ? 文字を付けるそうです。Windows XP のWebDAV実装がそうなっているらしいです。? を入れるとユーザとパスワードを入力するウィンドウの形も明らかに変わっており確かにおかしいです。このことが報告されていた

(http://mtlab.ecn.fpu.ac.jp/WSM_2004/040601170336.html)

でご指摘のとおり、
Digest: user`サーバ名ユーザ名' in realm `realm名' not found /dav 
のようなログがでます。

ということは、Windows XP では、https の時(もしかしたらクライアント認証だけ?)だけ「?」文字が要らないようです。これはびっくりです。いったいいかなる仕様でしょうか。

次回もう少し、WebDAV について試してみます。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする