Keterとは
reverse proxy. 次のようなことが出来る
- main port 80番にバインド、各アプリケーションにリバースプロキシ
- SSLのサポート
- アプリのプロセスの死活監視、自動起動。ダウンタイム無しでの切り替え
- ログファイルの管理
他にも色々できるらしい。
ローカル環境での試す。
まずはmac os x上で試す。
keterのインストール
cabal update
cabal install keter
keterの設定ファイルを作成
/etc/keter.yaml
を編集
https://github.com/snoyberg/keter/blob/master/etc/keter-config.yaml
を元に作成。
今回はrootを任意に変更(KETER_ROOT)、httpsのリスナーを削除
とりあえず動かす(デーモン化は後述の本番で)
sudo keter /etc/keter.yaml
$KETER_ROOT/log
以下にログが吐かれる
アプリケーションの設定
(yesodのscaffoldingで作ったアプリであれば最初から必要なファイルが有るので、それを編集)
設定ファイルの作成
config/keter.yaml
を作成する。
exec: ../dist/build/app_name/app_name
host: example.com
サンプル: https://github.com/snoyberg/keter/blob/master/incoming/foo1_0/config/keter.yaml
アプリのポート
環境変数 PORT
を読んで、それでリッスンするように修正する。
サンプル:
デプロイ
アプリの「実行ファイル、keterのconfig、スタティックリソースなど」をtarで固める。固めたファイルの名前は.keterにする
tar -czvf gif-viewer-server.keter dist/build/gif-viewer-server/gif-viewer-server config/keter.yaml static/
出来た.keterを、
$KETER_ROOT/incoming
にコピーするとデプロイ実行
アプリで設定したドメインでローカルにアクセス(必要に応じてhostsで再現)、ポートはketerの設定のもの、にアクセスするとアプリケーションが動作しているのを確認できるはず
お疲れ様でした!アプリごとのログもローテートされ管理されているので確認しましょう。
本番環境で導入
だいたい次の状態
- 環境はopenSUSE 13.2 (x86_64)
- keterのプロセスはsystemdで起動、monitで監視
- nginx経由
(因みにランスクリプトは、公式のREADMEはubuntuでupstart、こちら解説 ではinit.dのやつとsystemdどちらも、が参考できる)
install
cabal install keter
sudo cp ~/.cabal/bin/keter /usr/bin/
keter config
/etc/keter.yaml
root: /opt/keter
listeners:
# HTTP
- host: "*4" # Listen on all IPv4 hosts
port: 3000 # Could be used to modify port
systemd
/etc/systemd/system/keter.service
sudo systemctl daemon-reload
sudo systemctl start keter.service
sudo systemctl enable keter.service
curl localhost:3000
# keterのwelcome
monit(if need)
cat /etc/monit.d/keter.conf
check process keter matching "keter"
start program = "/usr/bin/systemctl start keter.service"
stop program = "/usr/bin/systemctl stop keter.service"
if 5 restarts within 5 cycles then unmonitor
nginx conf
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
deploy
ローカルで試したとおりサーバー上でビルドして、keter/incomingに.keterを配置でデプロイ完了
状況によっては使えるかも
次はghcのクロスコンパイルかな