Apache HTTP Server 2.4.1 on Ubuntu
Apache HTTP Server 2.4.1 を Ubuntu 10.04 LTS (Sakura VPS 512MB)に入れてみました。
今回試したかったことは、
です。
必要となるパッケージをインストール
aptitude install libreadline6-dev # for lua
aptitude install gcc
aptitude install libpcre3 libpcre3-dev
aptitude install openssl libssl-dev
必要となるソースをダウンロード・展開
cd /usr/local/src wget http://www.lua.org/ftp/lua-5.1.5.tar.gz tar zxf lua-5.1.5.tar.gz wget http://ftp.meisei-u.ac.jp/mirror/apache/dist//httpd/httpd-2.4.1.tar.gz tar zxf httpd-2.4.1.tar.gz wget http://ftp.riken.jp/net/apache//apr/apr-1.4.6.tar.gz tar zxf apr-1.4.6.tar.gz wget http://ftp.riken.jp/net/apache//apr/apr-util-1.4.1.tar.gz tar zxf apr-util-1.4.1.tar.gz
Lua5.1 コンパイル・インストール
- 最新の5.2を導入したかったが、ApacheModuleとしてうまく動かなかったため5.1.5で導入
- /usr/local/lua へインストール
cd ./lua-5.1.5
64bitOSの場合は src/Makefile を修正する (参考)
- (org)-> CFLAGS= -O2 -Wall $(MYCFLAGS)
- (new)-> CFLAGS= -O2 -Wall -fPIC $(MYCFLAGS)
コンパイル・インストール
make linux make install INSTALL_TOP=/usr/local/lua
apr/apr-util コンパイル・インストール
cd ./apr-1.4.6 ./configure --prefix=/usr/local/apr make make install cd .. cd ./apr-util-1.4.1 ./configure --prefix=/usr/local/apr --with-apr=/usr/local/apr make make install
httpd-2.4.1 コンパイル・インストール
cd .. cd ./http-2.4.1 ./configure --prefix=/usr/local/apache24 --with-apr=/usr/local/apr --with-lua=/usr/local/lua --enable-so --enable-ssl=shared --enable-proxy=shared --enable-lua make make install /usr/local/apache24/bin/apachectl start
mod_lua を試す
/usr/local/apache24/conf/httpd.conf を編集(以下の2行を追加)
LoadModule lua_module modules/mod_lua.so AddHandler lua-script .lua
/usr/local/apache24/htdocs/example.lua を新規作成 (参考)
require "string" function handle(r) r.content_type = "text/plain" r:puts("Hello Lua World!\n") if r.method == 'GET' then for k, v in pairs( r:parseargs() ) do r:puts( string.format("%s: %s", k, v) ) end elseif r.method == 'POST' then for k, v in pairs( r:parsebody() ) do r:puts( string.format("%s: %s", k, v) ) end else r:puts("unknown HTTP method " .. r.method) end end
変更の反映
/usr/local/apache24/bin/apachectl configtest /usr/local/apache24/bin/apachectl stop /usr/local/apache24/bin/apachectl start
mod_sed を試す
/usr/local/apache24/conf/httpd.conf を編集
<Directory "/usr/local/apache24/htdocs/sed"> AddOutputFilter Sed html OutputSed "s/TAITO/ZUNTATA/g" OutputSed "s/SEGA/SST/g" OutputSed "s/FALCOM/JDK/g" </Directory>
/usr/local/apache24/htdocs/sed/example.html を新規作成
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=Shift_JIS"> <title>sed sample</title> </head> <body> KONAMI<br/> TAITO<br/> SEGA<br/> GEMADELIC<br/> T&E<br/> FALCOM1.6.0<br/> </body> </html>
変更の反映
/usr/local/apache24/bin/apachectl configtest /usr/local/apache24/bin/apachectl stop /usr/local/apache24/bin/apachectl start
備考:Lua 5.2.0 について
Lua 5.2.0 のコンパイル・インストール、および httpd-2.4.1 のコンパイル・インストールまでは問題ないが、LoadModule で mod_lua.so を有効にしようとすると以下のエラーが発生した
/usr/local/apache24/bin/apachectl configtest httpd: Syntax error on line 148 of /usr/local/apache24/conf/httpd.conf: Cannot load /usr/local/apache24/modules/mod_lua.so into server: /usr/local/apache24/modules/mod_lua.so: undefined symbol: lua_objlen
- 5.1.5 で同様の手順を行った場合にはエラーが発生しなかった
QEMU on Fedora8 でブリッジ接続
Fedora8 で、qemuとvirt-managerを使ってWindows仮想マシンを作成。
- CPU:Athron X2 BE-2350
- MEM:4GB
- OS :FedoraCore8 (Fedora7からUpgrade) / 2.6.24.5-85.fc8
QEMUの仮想マシンは、仮想マシンマネージャ(virt-manager)経由で作成した。
その際、仮想マシンの作成自体は問題なく行えるのだが、NICをブリッジ接続させるのが少々難しい。
ブリッジ接続ではなく、仮想ネットワーク接続(仮想LAN+NAT)であれば仮想マシンマネージャで簡単にできそうだが、ブリッジ接続は(brctlコマンドなどを使って)色々と手間がかかりそうだ。
そこで思いついたのが
「xenのブリッジ接続用スクリプトを利用して、qemuの仮想マシンをブリッジ接続する」
という方法。で、さっそくチャレンジ。
まず、以下のものをインストールする。
- Xen
- Virt-Manager
- QEMU
- 必須ではないと思うがKVM
Xenはインストールするものの、そのサービス自体は使用しない。
使用するのは「/etc/xen/scripts/network-bridge」あたりだけなので、Kernelは(xen-kernelではない)通常のKernelで起動すること。
んでもって、/etc/init.d/xen-bridge を以下のような内容で作成。
#!/bin/bash # # xen-bridge Script to start and stop the Xen-Bridge. # # chkconfig: 2345 98 01 # description: Starts and stops the Xen control daemon. ### BEGIN INIT INFO # Provides: xen-bridge # Required-Start: $network # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: 3 4 5 # Default-Stop: 0 1 2 6 # Default-Enabled: yes # Short-Description: Start/stop xen-bridge # Description: Starts and stops the Xen-bridge. ### END INIT INFO start() { echo "Starting xen-bridge script" /etc/xen/scripts/network-bridge start } stop() { echo "Stopping xen-bridge script" /etc/xen/scripts/network-bridge stop } RETVAL=0 case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo $"Usage: $0 {start|stop|restart}" exit 1 esac exit $RETVAL
んでもって「chkconfig --add xen-bridge」とかして自動起動するようにしておく。
おそらく「network」サービスより後に起動する必要があるので、起動は98、終了は01とした(networkはそれぞれ10と90)。
設定が終わったら、Fedoraを再起動。設定が誤っている場合は、ssh等でリモート接続できなくなるので注意。
なお、xendやxendomainのサービスは停止しておいても構わない。
で、再起動が完了したとする。そこで ifconfig -a 等を実行すると「eth0」と「peth0」が作成されていることが確認できる。
通常、1つめのNIC「eth0」は、論理的なIFも物理的なIFも意味合い的に含む(と思っている)が、xen-bridgeが起動すると論理IFは「eth0」、物理IFは「peth0」と分離されるらしい(eth0がpeth0にブリッジ接続しているイメージ。多分・・・)。
この状態であれば、Virt-Managerによりqemuの仮想マシンを作成する際に、NICとして「eth0」を接続して、peth0へブリッジ接続することができる。具体的には、仮想マシン作成ウィザードの「ホストネットワークに接続」の項で、共有物理装置として「peth0」を選択することができるようになる。
VistaでSambaが踊れない
Windows Vista のファイルコピーが遅い上に、予想時間も極めていい加減なのはよく知られいるところですが、Vista以外のOSと(Windowsファイル共有で)ファイル送受信を行うと、これまた遅い。
特に、Sambaの共有フォルダに対して書き込みを行うと、遅いだけでなくしばしば失敗する(私の環境では)。
数MB程度なら成功率は高いが、100MB単位になると大抵失敗・・・で、調べてみると、こんな情報が。
Windows Vista ベースのコンピュータとそれ以前のオペレーティング システムの間で、サイズの大きいファイルをコピーすると、予想よりもコピー操作に時間がかかることがある
とりあえず、Vista側で
としたところ、現象は収まったようです。
その後、1GB単位のファイル書き込みは問題なく行えているので大丈夫でしょう。
Vista SP1 では改善されるんでしょうかね・・・。
ちなみに環境は
- Windows Vista Home Premium
- Fedora Core 7 / Samba 3.0.28-0.fc7
を1.0Gbpsで接続中。
2008/02/17 追記
以下の辺りにある対応も効果があるかも。
Vistaからは、デフォルトのLAN Managerの認証レベルが引き上げられてしまっているようです。
レジストリの変更になるようですが、XP以前と同様のレベルに落とすことも必要かもしれません。
WebDAVクライアント
JBoss4.0.3SP1でのサーバ証明書設定
環境
- OS :WindowsXP Professional SP2
- JDK:Sun Java SDK J2SE 1.4.2-11
- JBoss 4.0.3 SP1(WebServerは同梱のTomcatを使用)
JBossでHTTPSをしばらく使用していましたが、SSLHandshakeException が発生するようになったため、設定を見直してみました。なるべくJBossのデフォルトの設定を生かす形にしています。
なお、JBossのインストール先を「%JBOSS_HOME%」、JDK/JREのインストール先を「%JAVA_HOME%」という環境変数に設定しているものとします。
また、問題を見つけた方は是非激しくツッコミお願いいたします。
手順
とした場合
C:\>keytool -genkey -alias rmi+ssl -keyalg RSA -keystore chap8.keystore -validity 3650 キーストアのパスワードを入力してください: rmi+ssl 姓名を入力してください。 [Unknown]:localhost 組織単位名を入力してください。 [Unknown]: 組織名を入力してください。 [Unknown]: 都市名または地域名を入力してください。 [Unknown]: 州名または地方名を入力してください。 [Unknown]: この単位に該当する 2 文字の国番号を入力してください。 [Unknown]: CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown でよろしいですか? [no]: y <rmi+ssl> の鍵パスワードを入力してください。 (キーストアのパスワードと同じ場合は RETURN を押してください): C:\>
-
- 出力された「chap8.keystore」を「%JBOSS_HOME%\server\default\conf」にコピーします
- ローカルCAによる証明書を信頼させる(JDKの cacerts に追加)
keytool -export -alias rmi+ssl -keystore clientKeys -file client.cer -keystore %JBOSS_HOME%/server/default/conf\chap8.keystore キーストアのパスワードを入力してください: rmi+ssl 証明書がファイル <client.cer> に保存されました。
-
- キーストアへの証明書の登録
- JDKのキーストアのデフォルトパスワードは「changeit」なので、それを使用しています。
- キーストアへの証明書の登録
keytool -import -alias rmi+ssl -file client.cer -noprompt -trustcacerts -keystore %JAVA_HOME%/jre/lib/security/cacerts キーストアのパスワードを入力してください: changeit 証明書がキーストアに追加されました。
-
-
- キーストアへの証明書の登録時にエラーになる場合
- 既にキーストアに存在すると言われた場合は、以下の手順で削除してから再度追加を行う
-
keytool -delete -alias rmi+ssl -keystore %JAVA_HOME%/jre/lib/security/cacerts キーストアのパスワードを入力してください: changeit
FC5でApache/SSL/WebDAV/Digest認証
FedoraCore5 をセットアップしたので、何か新しいものに手を出してみよう、ということで、WebDAVに挑戦。
でも、単純にWebDAVを立ち上げるだけであれば、他にも資料はいくらでもありそうなので、ちょっと踏み込んでやってみた。
ポイントは
ちなみに、以前行った作業を「思い起こしながら」まとめた資料ですので、記述あやまりや矛盾など、山ほどある可能性があると思います。
ので、もし問題を見つけた方は是非激しくツッコミお願いいたします。
導入メモ
ドメイン名の取得
外部公開するということで、適当なドメイン名を取得します。
メジャー度では DynDNS あたり、容易さでは ddo.jp あたりでしょうか。
ここでは「myserver.hogehoge.com」というドメイン名を取得したとしましょう。
各パッケージの導入
Apache HTTP Server、OpenSSL、mod_ssl などがインストールされていなければ導入します。
(例:確認) # rpm -qa | grep httpd # rpm -qa | grep openssl
インストールされていないものについては yumにて導入します。
(例:導入) # yum install openssl
など。
日本語対応のため mod_encoding を導入
こちらで、FC5 の apache 2.2 対応版、mod_encoding のrpmを作成されているすばらしい方がいらっしゃいます。こちらからmod_encoding-2.2.0-1.i386.tar.gzをダウンロードして導入します。
(例:確認) # wget http://www.aconus.com/~oyaji/ftp/download_f.cgi?name=fc5/mod_encoding/mod_encoding-2.2.0-1.i386.tar.gz # tar zxvf ./mod_encoding-2.2.0-1.i386.tar.gz # rpm -e mod_encoding # rpm -ivh ./mod_encoding-2.2.0-1.i386.rpm
ちなみに私の環境ではどうも上手く導入できなかったので、強引に入れてしまいました。
rpm -ivh --nodeps --force ./mod_encoding-2.2.0-1.i386.rpm
原因調べろって?エラーログは?・・・すいません、時間が無かったので勢いでやってしまいました(^^;
サーバ証明書の作成
以下のファイルを作成するものとする
こちらをとても参考にさせてもらいました。
- サーバ用秘密鍵作成
# cd /etc/pki/tls/certs # make myserver.key
# umask 77 ; openssl genrsa -aes256 > myserver.key
最低限の入力で済まそうとする場合は
最初の「Enter pass phrase:」「Verifying - Enter pass phrase:」には任意のパスワードを入力。
「Country Name 」に「JP」
「Common Name」にサーバ名(今回は「myserver.hogehoge.com」)
でいいと思います。他はデフォルト(Enter押下)でOK。
最後のほうで聞かれるパスワードも空でよいです。
httpd起動時のパスワード入力を不要にするため、サーバー用秘密鍵からパスワード削除
# openssl rsa -in myserver.key -out myserver.key
パスワードを聞かれたら、秘密鍵作成時に入力したパスワードを入力してください。
- サーバ用公開鍵作成
# cd /etc/pki/tls/certs # make server.csr # umask 77 ; openssl req -new -key myserver.key -out myserver.csr
- 公開鍵を元に、サーバ証明書作成
サーバ証明書を作成するためには、mod_sslに付属する「sign.sh」を使用します。
恐らくrpmでmod_sslを導入した場合には存在しないと思われるので、このあたりからダウンロードします。
例えば mod_ssl-2.8.28-1.3.37.tar.gz ならば
# cd /etc/pki/tls/certs # wget http://www.modssl.org/source/mod_ssl-2.8.28-1.3.37.tar.gz # tar zxvf .//mod_ssl-2.8.28-1.3.37.tar.gz
などとする。そこで
# ./mod_ssl-2.8.28-1.3.37/pkg.contrib/sign.sh myserver.csr
「Sign the certificate? [y/n]:」には「y」
「1 out of 1 certificate requests certified, commit? [y/n]」にも「y」を入力する。
CA証明書をブラウザにインポートするための myserver.pem ファイル作成
(有効期間[-days オプション]は適当に設定。私は10年にしてしまいました・・・) # openssl x509 -in myserver.csr -out myserver.pem -req -signkey myserver.key -days 3650 (root のみ参照できるようにパーミッション変更) # chmod 400 myserver.*
なお、上記の例では「/etc/pki/tls/certs」にダウンロードしたり、展開したりとしてしまっていますが、その辺りは上手く読み替えてください。
ファイル名や配置先は、後の手順にある ssl.conf の設定とあわせます。
# cd /etc/pki/tls/certs (サーバ秘密鍵:ssl.conf の SSLCertificateKeyFile の設定とあわせる) # mv myserver.key /etc/pki/tls/private (サーバ証明書:ssl.conf の SSLCertificateFile の設定とあわせる) # mv myserver.pem /etc/pki/tls/certs (今回の場合は同じ場所なので、このコマンドは不要ですね)
サーバの公開鍵については、証明書を作成する過程での成果物のようなので、気になるのであれば消してもOKと思われます。
apache 設定ファイルを変更
(サーバ名) ServerName www.example.com:80 ↓ #ServerName www.example.com:80 ServerName myserver.hogehoge.com:80
上記の設定は、HTTPS限定であれば必須では無いかな?まぁおまけってことで。
また、以下の設定があることを確認します。
(ダイジェスト認証用モジュール) LoadModule auth_digest_module modules/mod_auth_digest.so (WebDAV用モジュール) LoadModule dav_module modules/mod_dav.so LoadModule dav_fs_module modules/mod_dav_fs.so (WevDAVモジュール用設定) # # WebDAV module configuration section. # <IfModule mod_dav_fs.c> # Location of the WebDAV lock database. DAVLockDB /var/lib/dav/lockdb </IfModule>
それと、
<IfModule mod_headers.c> Header add MS-Author-Via "DAV" </IfModule>
という記述を追加します。私は末尾に追加しました。
Windows2000/XP から Webフォルダ接続する場合の対応だそうです。
(サーバ名) #ServerName www.example.com:443 ↓ #ServerName www.example.com:443 ServerName myserver.hogehoge.com:443
(サーバ証明書(公開鍵)指定) SSLCertificateFile /etc/pki/tls/certs/localhost.crt ↓ #SSLCertificateFile /etc/pki/tls/certs/localhost.crt SSLCertificateFile /etc/pki/tls/certs/myserver.pem
(サーバ証明書の秘密鍵指定) SSLCertificateKeyFile /etc/pki/tls/private/localhost.key ↓ #SSLCertificateKeyFile /etc/pki/tls/private/localhost.key SSLCertificateKeyFile /etc/pki/tls/private/myserver.key
まぁ、鍵ファイルの名前や場所は、先の手順で作成した鍵の結果と合わせてもらえれば任意です。
- /etc/httpd/conf.d/mod_encoding.conf の内容の確認。
私の環境の場合は以下の通り。
LoadModule encoding_module modules/mod_encoding.so <IfModule mod_encoding.c> EncodingEngine on NormalizeUsername on SetServerEncoding UTF-8 # DefaultClientEncoding UTF-8 CP932 JA-AUTO-SJIS-MS SJIS DefaultClientEncoding JA-AUTO-SJIS-MS UTF-8 CP932 SJIS AddClientEncoding "Microsoft .* DAV 1.1" ASCII CP932 UTF-8 AddClientEncoding "Microsoft .* DAV" UTF-8 CP932 AddClientEncoding "(Microsoft .* DAV $)" UTF-8 CP932 AddClientEncoding "(Microsoft .* DAV 1.1)" CP932 UTF-8 AddClientEncoding "Microsoft-WebDAV*" UTF-8 CP932 AddClientEncoding "RMA/*" CP932 AddClientEncoding "xdwin9x/" CP932 # AddClientEncoding "cadaver/" UTF-8 EUCJP-MS AddClientEncoding "cadaver/" EUCJP-MS UTF-8 AddClientEncoding "Mozilla/" EUCJP-MS </IfModule>
「EncodingEngine」は当然「on」であること、また「NormalizeUsername」はWindowsからのWebフォルダ接続の場合の不具合を解消してくれるらしいので、忘れずに「on」にすること。
WebDAV 設定ファイルを変更
- 認証方法はパスワードファイルを使ったDigest認証とする
- 公開URLは「https://myserver.hogehoge.com/web/dav」とする
- 公開先のローカル位置は「/var/pub/webdav」とする
- アクセスできるユーザは「myuser」とする
- httpd.confの「User」「Group」で指定されているユーザ、グループに即したアクセス権を設定しておく
Alias /web/dav "/var/pub/webdav" <Location "/web/dav"> DAV On SSLRequireSSL ##ファイル置き場は自動インデックスリスト表示 Options FollowSymLinks Indexes ## 認証設定 ## Digest認証:AuthNameはRealm名(htdigestで指定) AuthType Digest AuthName "member" AuthDigestProvider file AuthUserFile conf/.htdigest AuthDigestDomain /web/dav/ ## AuthGroupFile /dev/null <LimitExcept OPTIONS> Require user myuser </LimitExcept> ## 名前解決できるアクセス元のみ許可 HostnameLookups On ## アクセス制限 Order deny,allow Deny from all Allow from all </Location>
- DAV
- 当然「on」で。
- SSLRequireSSL
- HTTPS必須としたいので、忘れずに記述する。
- Options
- 任意に設定してください。私はファイル一覧表示ぐらいはしたかったので、上記の設定となっています。
- AuthType
- 当然「Digest」で。
- AuthName
- ブラウザによっては、ユーザ・パスワード入力ダイアログの表示名となるが、Basic認証と違って単なる表示用の文字列ではありません。この後の手順でユーザを作成する際の realm(groupのようなもの?権限セットらしいです)名となるので、その辺りを考慮して設定すること。
- AuthDigestProvider
- 今回はパスワードファイルを使用しますので「file」で。
- AuthUserFile
- LimitExcept OPTIONS
WebDAV アクセス用のユーザを作成
- WebDAVでDigest認証を行うためのユーザを作成します。
- OSユーザを合わせて作成する必要はありません。むしろ作らないほうがよいでしょう。
# htdigest -c /etc/httpd/conf/.htdigest 'member' myuser
パスワードファイルへのユーザ作成が初回の場合のみ「-c」をつけます。
1つ目のパラメータは、パスワードファイルのパスを指定します。
2つ目のパラメータは「realm」(ssl.conf の AuthName とあわせる)を指定します。
3つ目のパラメータは、追加するユーザ名を指定します。
パスワードの入力を求められるので、任意のパスワードを設定してください。
httpd の起動
# service httpd restart
として、httpdを起動(再起動)して、確認してみましょう。
ブラウザで「https://myserver.hogehoge.com/web/dav」にアクセスすると認証ダイアログが出るので、ユーザ名とパスワードを入力してうまく閲覧できればOKです。
以上。と思う。漏れありそうだな。。。
ちなみに
- WindowsXPからWebフォルダ接続した場合は、日本語も問題なく使用できるのですが、Windows2000からだと日本語ファイル名を扱おうとするとエラーではじかれてしまいます。調査中です・・・。
- 2006/08/23 追記:ちなみにFC5標準のapache2.2 では、HTTPSを使用するにあたり、起動時にパラメータを指定する必要はありません(従来の -DSSL)。ですので、/etc/sysconfig/httpd などへの設定も不要です。
- 2006/08/29 追記:SELinuxは無効にした状態で作業を行いました。ですので、SELinuxを有効にされている方は、その辺りの設定も必要になると思います。
ロギング用関数
log4perlのインストールが許されない環境でロギングをしたかったので、参考ページをもとに、試しに作ってみたロギング用関数。
出力先に関してのエラー処理なども組み込んでいないですし、どこまで実用になるかはわかりませんが、とりあえず私の環境では充分な感じ。
もっといい方法があれば教えてもらえると助かります。
環境
- OS :Windows2000 Professional SP4+Cygwin
- Perl:Perl 5.8.0
ソース
#-----------------------------------------# # ログ出力 関数 # # 第2引数に「1」を指定すると # # 標準出力にも出力(省略時は出力せず) # #-----------------------------------------# sub logger { ($msg, $STDOUT_FLG) = @_; $msg = "[" . getTime() . "] " . $msg . "\r\n"; open(LOG, "+>>/tmp/log.log"); flock(LOG, 2); @log = <LOG>; seek(LOG, 0, 0); print LOG $msg; truncate(LOG, tell()); flock(LOG, 8); close(LOG); if( $STDOUT_FLG == 1 ) { print $msg; } }
使用例
logger("ファイル出力のみ"); logger("標準出力・ファイル出力の両方" ,1);