このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

Erlang実験室:Windows上でWebサーバーYAWSを動かす

Erlangで実装された軽量なWebサーバーYAWSを、Windows上で動かすことができます。そのやり方は、次の2つの記事で説明されています。

  1. http://yaws.hyber.org/wiki/showPage.yaws?node=YawsAndCygwin
  2. http://yaws.hyber.org/wiki/showPage.yaws?node=YawsAndWin32

一番目の方法は、Cygwinによる擬似Unix環境内にYAWSをインストールします。二番目のほうは、WindowsアプリケーションとしてYAWSをインストールします。僕は、CentOSUbuntuで動かしているものとの対応が取りやすいだろう、という理由で一番目のCygwin方式を選択しました。Cygwinを本質的に使うのはインストール時で、インストールが終わってしまえばCygwinなしでも動作します。

以下に述べる方法は、何度かインストールをやり直した結果、これがよかろうと思ったものです。無難(トラブルが起きにくい)で手間が少ないことを判断基準にしてます。

内容:

  1. Cygwinの導入
  2. YAWSのダウンロードと展開
  3. ホームディレクトリーと環境変数HOME
  4. 空白入りパス名への対処
  5. buildとinstall
  6. yaws.confの編集
  7. YAWSを動かしてみる
  8. YAWSのmanページのインストール
  9. Windowsから直接起動するには
  10. オマケ:システムへのインストール

Cygwinの導入

http://cygwin.com/ からsetpu.exeをダウンロードし、これを使ってインストールします。インターネット上にいくつも解説があるので、詳細はそちらを。一言注意; setup.exeは何度も利用することになるかもしれません。この名前では正体不明になるので、cygwin_setup.exe とかにリネームしておいたほうがいいでしょう。

僕は、最小構成でインストールしてみたのですが、perlgccもmakeもありません。この状態でも、既にインストールされているActivePerlやMSYSのgcc、makeを起動できます。とはいえ、異なるシステムのコマンドが混在した状態は不吉な印象があったので、perlgcc一式、makeなどはCygwin本来のものを追加インストールしました。

Cygwinbashから which gccなどとしてみて、/usr/bin/gcc などが見えていればOKです。ただし、Erlangは既にインストールされているWindows版をそのまま使用しました。そのほうが、werlが使えるので便利です。

●YAWSのダウンロードと展開

http://yaws.hyber.org/ から、yaws-1.77.tar.gz(現時点での最新版)をダウンロードします。yaws-1.77.tar.gz を /home/ に置いて展開しましょう。


$ tar xvf yaws-1.77.tar.gz

yaws --> yaws-1.77/ というシンボリックリンクWindowsレベルではyaws.lnk)ができます、これを消して、yaws-1.77/ を yaws/ にリネームします。


$ rm yaws
$ mv yaws-1.77 yaws

●ホームディレクトリーと環境変数HOME

今回は、YAWSをシステム全体で使うのではなくて、特定ユーザーがプライベートにYAWSを使う設定にします。そこで、ユーザーのホームディレクトリーが必要です。通常は、Windowsのホーム(UserProfileディレクトリ)と一致させておくのが便利でしょう。

Windowsのレベル、またはCygwin内で環境変数HOMEを設定しておいてください。例えば*1


HOME="/cygdrive/c/Documents and Settings/Hiyama"; export HOME

既にCygwin内で HOME=/home/hiyama のように設定してあるなら、もちろんそれでもかまいません。

[追記]書いた後で気が付いたのですが、環境変数HOMEの値に空白が入ってなければ、後のパッチは不要ですね。例えば、


$ HOME=`cygpath -s -m /cygdrive/c/Documents\ and\ Settings/Hiyama/`
$ expor HOME
としておけば、Makefileに手を加える必要はないでしょう。[/追記]

●空白入りパス名への対処

これから先は、/home/yaws/ で作業します。


$ cd yaws

Windowsのホーム(のパス名)には空白が入る可能性があり、これがトラブルのもとです。空白の問題を回避するために、yaws/scripts/Makefile に次のパッチを当ててください。


--- Makefile.orig 2008-11-06 22:29:35.808296000 +0900
+++ Makefile 2008-11-06 23:02:54.482248000 +0900
@@ -15,8 +15,9 @@


local_install: ../bin/yaws
- @install -d $$HOME/yaws_logs
- @if [ -f $$HOME/yaws.conf ]; \
+ @HOME=`cygpath -s -m "$$HOME"`; install -d $$HOME/yaws_logs
+ @HOME=`cygpath -s -m "$$HOME"`; \
+ if [ -f $$HOME/yaws.conf ]; \
then target=$$HOME/yaws.conf.template; \
else \
target=$$HOME/yaws.conf; \

このパッチファイルを /home/yaws/scripts/Makefile.20081107.diff として:


$ cd scripts
$ patch < Makefile.20081107.diff
patching file Makefile

$ cd ..
$

●buildとinstall

ここから先は、http://yaws.hyber.org/wiki/showPage.yaws?node=YawsAndCygwin にも書かれているお決まりの手順です。


$ ./configure --prefix= --localstatedir=/var --sysconfdir=/etc
checking build system type... i686-pc-cygwin
checking host system type... i686-pc-cygwin
checking target system type... i686-pc-cygwin
checking for erl... /cygdrive/c/Installed/erl5.6.4/bin/erl
checking for erlc... /cygdrive/c/Installed/erl5.6.4/bin/erlc
checking erts version... 5.6.4
checking kernel version... 2.12.4
checking stdlib version... 1.15.4
checking sasl version... 2.1.5.3
checking mnesia version... 4.4.5
checking for gcc... gcc
checking for C compiler default output file name... a.exe
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables... .exe
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking whether gcc needs -traditional... no
checking whether make sets $(MAKE)... yes
checking for a BSD-compatible install... /usr/bin/install -c
checking for werl... /cygdrive/c/Installed/erl5.6.4/bin/werl
configure: creating ./config.status
config.status: creating include.mk

$ make | tee make.log
make[1]: Entering directory `/home/yaws/c_src'
touch ../priv/.foo
make[1]: Leaving directory `/home/yaws/c_src'
...
... (省略) ...
...
make[1]: Leaving directory `/home/yaws/scripts'
rm -rf yaws-1.77.script yaws-1.77.boot
rm -rf yaws-1.77.rel yaws-1.77.tar.gz

$ make local_install | tee make_local_install.log
make[1]: Entering directory `/home/yaws/c_src'
make[1]: Nothing to be done for `all'.
...
... (省略) ...
...
make[1]: Entering directory `/home/yaws/scripts'
--- Installing local config file at c:/DOCUME~1/Hiyama/Work/yaws.conf
--- Installed c:/DOCUME~1/Hiyama/Work/bin/yaws
make[1]: Leaving directory `/home/yaws/scripts'

$

以上により、環境変数HOMEが指しているホームディレクトリーに次のファイル/サブディレクトリが作られます。

ローカルインストールでは、~/ 以外には影響を与えません(安心です)。

●yaws.confの編集

~/yaws.confを修正しないとうまく動かないでしょう。次の記述を探してください。


ebin_dir = C:/cygwin/home/yaws//examples/ebin
ebin_dir = C:/cygwin/var/yaws/ebin

1行目のスラッシュ2つ「//」は実害はないでしょうが、気持ち悪いので「/」にしました。2行目は意味ないので削除するか、YAWSのebinディレクトリを指すように直します(必須ではありません)。

修正後:


ebin_dir = C:/cygwin/home/yaws/examples/ebin
ebin_dir = C:/cygwin/home/yaws/ebin # yawsコマンドでも指定される(冗長)

仮想ホストlocalhostに関する設定は次のようになっていると思います。


<server localhost>
port = 8000
listen = 0.0.0.0
docroot = /tmp
dir_listings = true
<auth>
realm = foobar
dir = /
user = foo:bar
user = baz:bar
</auth>
</server>

ここの/tmpは、Cygwinの/tmp(Windowsから見てのC:\cygwin\tmp\)ではなくて、C:\tmp\ のことです。C:\tmp\ がなければ作るか、他の実在するディレクトリを指すようにします。

yaws.confに出現するパスは、Cygwinのパスではなくて、Windowsのパス(ただし、スラッシュを使う)です。また、標準で使用するホスト名は、Windowsのコンピュータ名です。WindowsErlangで動くYAWSは、Cygwinが創りだした擬似環境ではなくて、Windowsシステムをそのまま見てることに注意してください。

[追記]YAWSもERTS(erl, werl)も空白入りパスは苦手です。「空白を含むパス名で困ったときの応急処置」で述べたように、必ずショートネームを渡すようにしないと、ERTSが一瞬で死んでしまいます。引用符で囲んでもダメです。ショートネームを渡すのが無難です。ショートネームを知るには、Cygwinのcygpathがけっこう便利です。


$ cygpath -m -s /cygdrive/c/Documents\ and\ Settings/All\ Users/
c:/DOCUME~1/ALLUSE~1/

$

パス名を二重引用符で囲むと大丈夫なときもあります。[/追記]

●YAWSを動かしてみる

~/bin/yaws でYAWSを起動します。とりあえず使うオプションは:

  • yaws -i :コンソールを使う対話モードでYAWSを起動する
  • yaws -w :ウィンドウを使う対話モードでYAWSを起動する

お試しや実験では、これ以外は使わないでしょう。ウィンドウ(werl)を使うのがお勧めです。


$ yaws -w &

セキュリティソフトの警告が出るかもしれません。そのときはブロックを解除します。

さー、ブラウザで、http://<コンピュータ名>:8000/ や http://localhost:8000/ にアクセスしましょう。http://localhost:8000/ での認証は、ID: foo、PASSWORD: bar です。

YAWSを終了するには、対話的Erlang Shellから、


3> yaws:stop().

=INFO REPORT==== 7-Nov-2008::14:12:12 ===
application: yaws
exited: stopped
type: permanent
ok
4> q().

動くことが確認できたら、YAWSの設定を好みにカスタマイズします。次が設定のマニュアルです。

●YAWSのmanページのインストール

YAWSのmanページをCygwinから使えたほうが便利かもしれません。


$ cd man; make PREFIX=/usr/local | tee make_man.log; cd ..
install -d /usr/local/share/man/man1
install -d /usr/local/share/man/man5
cp yaws.1 /usr/local/share/man/man1
cp yaws.conf.5 /usr/local/share/man/man5
cp yaws_api.5 /usr/local/share/man/man5

$ man yaws
...
...(表示される)
...

Windowsから直接起動するには

~/bin/yawsはシェルスクリプトですから、そのままWindowsからは実行できません。しかし、-w オプションに限るならば、yawsコマンドは次の1行と同じです。


werl -pa C:/cygwin/home/yaws/ebin -yaws debug -run yaws -yaws id default

僕は、この1行を書いたバッチファイルを wyaws.bat としています。Cygwinとは無関係にYAWSを起動できます。

●オマケ:システムへのインストール

ホームディレクトリー以外を汚さないローカルインストールがお勧めですが、Cygwinシステム全体にYAWSをインストールすることもできます。/usr/local/ にインストールしたときは次のようなファイル/ディレクトリが作られます*2(これで全部である保証はありません)。

  • /usr/local/bin/yaws
  • /usr/local/lib/yaws/
  • /usr/local/lib/yaws/ebin/
  • /usr/local/lib/yaws/examples/
  • /usr/local/lib/yaws/include/
  • /usr/local/lib/yaws/priv/
  • /etc/yaws.conf
  • /etc/yaws.conf.template
  • /etc/yaws-cert.pem
  • /etc/yaws-key.pem
  • /var/yaws/
  • /var/yaws/ebin/
  • /var/yaws/www/
  • /var/log/yaws/
  • /usr/local/share/doc/yaws-1.77/
  • /usr/local/share/man/man1/
  • /usr/local/share/man/man5/

*1:実際は、"/cygdrive/c/Documents and Settings/Hiyama/Work" にしてあります。

*2:なんか、/yaws_logs/ ってのもできてたのですが、なにかのマチガイのような気がします。