Common LispのWebアプリをVPSで動かすまでのメモ

Mathe Vital Japan*1に代わるようなクライン群に関するウェブサイトを開発しようとしています。裏側をCommon Lispで作ってみようと思い、とりあえず原型ができた感じなのでVPSで動かしてみました。
僕はUnixもサーバー周りも初心者なのでメモにしておこうと思います。

VPSドメインの契約

VPSはConoHaのメモリ1GBの一番安いものにしました。どうやら登録時に、1000円分のクーポンがもらえる登録フォームもあるみたいなのですが失念していました。悲しい。
ドメインはお名前.comで取得ました。アカウントの作成に迷いましたが、初めてのドメイン取得と同時にアカウントを作成するようになっています。
VPSドメインの契約を済ませたらVPSIPアドレスドメインを紐つけます。以下の記事を参考にしました。
お名前.comでドメインを取得してConoHaで公開するまで - Qiita

ログイン

OSはCentOS64bitの7.1、6.7、6.6をそれぞれ試しました。パッケージが新しいのでCentOS7.1の方がちょっと楽だと思います。SSHクライアントにはTeraTermを使用しました。ConoHaではWebコンソールが使用できますが、Webコンソールから操作を行うと何故かネット周りでトラブルがあり使えませんでした。例えばgitでgithubからcloneできないとか、pingやtracerouteが返ってこないとか…

ログインしたら一応パッケージのアップデートをしてgit、gccを入れておきます。

yum update
yum install git
yum install gcc

Emacsのインストール

最初からVimが入っていますが使い慣れないので最新版のEmacsを入れます。
CentOSに最新のemacsをインストールする方法 - エンジニア?プログラマ?
24.5がstableなのでインストールします。ビルドオプションはGUI関連のものだと思います。

roswellのインストール

snmsts/roswell · GitHub

yum install libcurl-devel
yum install autoconf
git clone https://github.com/snmsts/roswell.git
cd roswell
./bootstrap
./configure
make
make install

CentOS6系だとyumでインストールできるautoconfのバージョンが低いと言われるので最新版をビルドする必要があります。
autoconf のインストール - ひたすら事務

sbclのインストール

yum install zlib-devel
ros install sbcl

インストール中は止まりますが心配はないはずです。プログレスバーが全く動かないのは端末の仕様ですかね…
sbclのビルドにはzlib-develが必要です。
error in install sbcl · Issue #65 · snmsts/roswell · GitHub
最初、インストールが失敗したというエラーに気付かず、最新のsbclがビルドされたものと勘違いしていました。sbcl-binはイントールされており、普通に使えていたので気付きませんでした。もしインストールに失敗したら

ros delete sbcl

で消してからでないと再インストールできませんでした。

clackupコマンドのインストール

ros install clack
export PATH=$PATH:~/.roswell/bin

clackupコマンドをインストールしたらパスを通します。この方法は一時的なもので、再ログイン時にはリセットされてしまうそうです。永続的に追加するにはユーザーの.bash_profileをいじるそうです。
パス(PATH)の確認と設定方法は? - Pocketstudio.jp Linux Wiki

ファイアウォールの設定

CentOS6ならiptables
iptablesの設定方法|さくらインターネット公式サポートサイト
CentOS7ならfirewalld
CentOS7 firewalldの設定方法

iptablesはデフォルトでは何も設定されていないみたいなので特に設定しなくてもhttpでアクセスできますがそのままでは危ないですね。

wooのロード

サーバーのwooにはlibevというライブラリが必要です。CentOS7ならyumで入るはずですがCentOS6の場合はビルドが必要です。
ほぼ毎日更新してた、ごくうブログ:[Linux] CentOS5でメールサーバ構築(qmail + tcpserver + libev + vpopmail + qmail-conf + daemontools)
ここを参考にビルドします。

cd /usr/local/src/
wget http://dist.schmorp.de/libev/libev-4.20.tar.gz
tar xvfz libev-4.04.tar.gz
cd libev-4.04
./configure 
make
make install

これだけでは共有ライブラリは参照されないみたいなのでここを参考にパスを通します。
Tomorrow is always fresh with no mistake in it.@備忘録 - ライブラリのパスを設定する
僕は/etc/ld.so.conf.d/にlibevがおいてあるライブラリのパスを書いたファイルを置き、ldconfigで読み込みなおしました。

アプリケーションの起動

Roswell時代のCommon LispのWebアプリケーション運用 - 八発白中

clackのアプリケーションをgitなどで取ってきたらアプリケーションのルートに入って

clackup --port 80 app.lisp

でライブラリが色々ロードされてサーバーが立ち上がります。デフォルトではHunchentootが起動します。他のサーバーは--serverオプションで起動します。これでブラウザからipアドレス、もしくはドメインをを入力すればページにアクセスできるはずです。

この時、ずっと/usr/local/srcにclone等をして作業していましたが、asdfがアプリケーションのシステムを読み込めなかったとエラーが出るときがありました。~/common-lisp/というディレクトリを作成し、ここにアプリケーションを置くとロードしてくれました。asdfのパス設定の関連でしょうかね。

気になる事

Hunchentootで立ち上げると時折エラーが発生しているようです。止まる事はないのですが気になりますね。

[2015-09-10 17:09:56 [ERROR]] Error while processing connection: couldn't read from #<SB-SYS:FD-STREAM
                                                                                      for "socket 133.130.58.156:80, peer: 133.26.34.248:52675"
                                                                                      {1003825813}>:
                                                                   Connection reset by peer

wooは結局動かすことができませんでした。サーバーは立ち上がるのですが、アクセスすると以下のようなエラーが出ます。

Unhandled TYPE-ERROR in thread #<SB-THREAD:THREAD "main thread" RUNNING
                                  {1002C1F513}>:
  The value 4162984581 is not of type (SIGNED-BYTE 32).

デスクトップのCentOS6.6ではlocalhostですが接続に成功したのでVPSCentOSもバージョンを入れ替えて試してみましたがどれもエラーが出てしまいました。何が悪いのかはまだわかりませんが、大量のアクセスがあるような事も速度が必要になる事もないのでとりあえずHunchentootで動かすことにしました。

追記(2015/9/17)

作者の深町さんにコメントを頂き、このプルリクエストで解決していることがわかりました。
* Fix error on ntoa : support for 64 bit address by kayhman · Pull Request #35 · fukamachi/woo · GitHub

おわり

これで一応外部からページにアクセスすることができるようになりました。それとセキュリティ面等で考慮することは色々ありそうで、これから少しずつ勉強していく必要がありますね。ひとまず、次の課題はTravisCIによる自動デプロイを試してみる事とサイトのコンテンツの開発ですね。
日々精進あるのみです。

*1:今時ジャバアプレットですよ…