WAI   基本的な例

ホーム


はじめに

ネットで色々見て回りましたが、HaskellでWebアプリを開発する方法を網羅的・体系的 に説明しているサイトを見つけることができませんでした。(YesodとSnap以外)。Yesodと Snapは、サイトが整っていましたが、実際にデプロイすることはできませんでした。そこで HaskellのWeb開発の基本である Wai を使って、単発的な事例を拾っていくことにしました。

HaskellのWeb Frameworkとしては、Yesod、Snap、Happstackが有名です。その中でYesod は、Haskell謹製のWai (Web Application Interface)を使っています。Wai を使う Framework としては、そのほかにもScotty、Spockなどがあリます。Haskell謹製としては、Warpという HTTP サーバーもあります。実際にWarpを使うとApacheやNginxを使わなくてもHaskellの Webアプリをブラウザに表示でます。

ここでは、YesodなどのWeb Framework は使わずに、WaiとWarpを使って、Webアプリを 構築する方法を模索していこうと思います。

またすべてのサンプルは、Dokkuを使って、実際にデプロイする形で書いています。

動作環境

Dokku環境が設定済みの Ubuntu 18.04 と CentOS 7.6。Warp でWebサイトが表示されている ことを確認するために、どちらにも Apache や Nginx などの HTTP サーバーはイントール していません。ローカル環境には、Stack と Cabal がインストール済みです。

基本的な例

リモートサーバーでの作業

リモートサーバーに「wai-app」という Dokku リポジトリを作る。今後このリポジトリ を変更して使い続けることにしますので、サンプルとして残したい場合は、適宜、別の リポジトリを作ってください。

ローカルでの作業

プロジェクトの作成

stack new wai-app simple

「wai-app」ディレクトリに移動してビルド

stack build

実行

stack exec wai-app
hello world

「wai-app.cabal」の末尾に次のコードを追加


build-depends:       base >= 4.7 && < 5
                   , warp
                   , wai
                   , http-types
    

「src/Main.hs」を次のコードに変更。


{-# LANGUAGE OverloadedStrings #-}
import Network.Wai
import Network.HTTP.Types
import Network.Wai.Handler.Warp (run, Port)
import System.Environment (getEnvironment)
import Data.List (lookup)
import Data.Maybe

app :: Application
app _ respond = do
    respond $ responseLBS
        status200
        [("Content-Type", "text/plain")]
        "Hello, Web!"

main :: IO ()
main = do
    port <- getPort
    run port app

getPort :: IO Port
getPort = getEnvironment >>= return . port
    where
        port = fromMaybe defaultPort . fmap read . lookup "PORT"

defaultPort :: Port
defaultPort = 80
    

再びビルド

stack build

プロジェクト内に次の内容の「.buildpacks」というファイルを追加


https://github.com/mfine/heroku-buildpack-stack
    

プロジェクト内に次の内容の「Procfile」というファイルを追加


web: wai-app
    

プロジェクト内に Git リポジトリを作る

git init

Git リポジトリにプロジェクト内のすべてのファイルを追加

git add .

追加したファイルをリポジトリに関連付ける

git commit -m "wai-app"

デプロイ先の登録。「123.123.123.123」の部分は、リモートサーバーのIPアドレス

git remote add dokku dokku@123.123.123.123:wai-app

デプロイ

git push dokku master

初回デプロイはリモートリポジトリにHaskell環境をインストールするために時間が かかります。2回目からはそれほど時間はかかりません。

次のように表示されればデプロイは成功しています。


=====> Application deployed:
       https://123.123.123.123:12345

To 123.123.123.123:wai-app xxxxxxxxxxxxxx master -> master

「https://123.123.123.123:12345」がアプリのURLです。ブラウザで確認してください。

リモートサーバがCentOSの場合は「https://123-123-123-123:12345」というハイフン区切 りで表示されますので、「https://123.123.123.123:12345」というドット区切りに直して確認 してください。

ファイアーウォールの設定

リモートサーバーがCentOSの場合は、ファイアーウォールの設定をしなければサイトが 表示されません。

CentOSサーバにログインして次の作業をしてください。「12345」の部分は、 「:」の後の5桁のポート番号です。この作業はUbuntuサーバーでは必要 ありません。

firewall-cmd --zone=public --add-port=12345/tcp --permanent
firewall-cmd --reload

トラブルシューティング

デプロイに失敗する場合は次のことを試してみてください。

  1. ファイルの記述に間違いがないか

  2. プロジェクトはビルドしたか

  3. .ssh/known_hostsファイルを削除する

  4. 次のコードを実行してリポジトリを削除して、またリポジトリを作り直す。
    rm -rf .git

  5. リモートサーバーでリポジトリを削除して、またリポジトリを作り直す。
    ssh root@123.123.123.123
    su dokku
    cd
    dokku apps:destroy wai-app
    wwai-app
    dokku apps:create wai-app
    dokku apps:list
    リモートサーバーのリポジトリを作り直した場合は、アプリケーションのポート番号が 変更されます。またリモートサーバーのリポジトリを作り直した後の、初回デプロイは、 時間がかかります。


8700 visits
Posted: Feb. 09, 2019
Update: Feb. 09, 2019

ホーム   ページトップ