Common LispのWebアプリをVPSで動かすまでのメモ
Mathe Vital Japan*1に代わるようなクライン群に関するウェブサイトを開発しようとしています。裏側をCommon Lispで作ってみようと思い、とりあえず原型ができた感じなのでVPSで動かしてみました。
僕はUnixもサーバー周りも初心者なのでメモにしておこうと思います。
VPS、ドメインの契約
VPSはConoHaのメモリ1GBの一番安いものにしました。どうやら登録時に、1000円分のクーポンがもらえる登録フォームもあるみたいなのですが失念していました。悲しい。
ドメインはお名前.comで取得ました。アカウントの作成に迷いましたが、初めてのドメイン取得と同時にアカウントを作成するようになっています。
VPSとドメインの契約を済ませたらVPSのIPアドレスとドメインを紐つけます。以下の記事を参考にしました。
お名前.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のインストール
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ですが接続に成功したのでVPSのCentOSもバージョンを入れ替えて試してみましたがどれもエラーが出てしまいました。何が悪いのかはまだわかりませんが、大量のアクセスがあるような事も速度が必要になる事もないのでとりあえずHunchentootで動かすことにしました。
追記(2015/9/17)
作者の深町さんにコメントを頂き、このプルリクエストで解決していることがわかりました。
* Fix error on ntoa : support for 64 bit address by kayhman · Pull Request #35 · fukamachi/woo · GitHub
おわり
これで一応外部からページにアクセスすることができるようになりました。それとセキュリティ面等で考慮することは色々ありそうで、これから少しずつ勉強していく必要がありますね。ひとまず、次の課題はTravisCIによる自動デプロイを試してみる事とサイトのコンテンツの開発ですね。
日々精進あるのみです。