を使用してwarpアプリケーションを実行するrun
と、すべての IP アドレスでリッスンします。
localhost
セキュリティ上の理由から、リバース プロキシを使用してリモート アクセスを処理し、リッスンのみしたいと考えています。
run
特定のホスト/IP でのみリッスンするには、どのように呼び出す必要がありますか?
注:この質問は、Q&A スタイルで回答されているため、意図的に研究努力を示していません。
現在受け入れられている回答は、コンジットおよび/またはワープの変更によって壊れました。Host
Warp はコンストラクターをエクスポートしなくなりました。HostPreference
ただし、型は OverloadedStrings 拡張機能をサポートしているため、文字列を直接使用できるため、必要ありません。
setPort
この例では、とに切り替えることで非推奨の警告も排除していますsetHost
。
{-# LANGUAGE OverloadedStrings #-}
import Network.Wai (responseLBS)
import Network.Wai.Handler.Warp
import Network.HTTP.Types (status200)
import Network.HTTP.Types.Header (hContentType)
main = do
let port = 3000
putStrLn $ "Listening on port " ++ show port
let settings = setPort port $ setHost "127.0.0.1" defaultSettings
runSettings settings app
app req = return $
responseLBS status200 [(hContentType, "text/plain")] "Hello world!"
run
それ自体はできません。使用する必要がありますrunSettings
:
渡すパラメーターにはSettings
、リッスンするホストに関する情報が含まれています。
ここで関連する型はHostPreference
. を含むさまざまなワイルドカードを指定できますが、ここではコンストラクターIPv6Only
を使用します。Host
この回答に基づいて、ローカルホストのみをリッスンする最小限の例を示します。
のようなアクセサーは非推奨とマークされていますが、 warp 2.1.2.1 の公式ドキュメントには、 heresettingsHost
を使用した例がまだ示されています。settingsTimeout
{-# LANGUAGE OverloadedStrings #-}
import Network.Wai (responseLBS)
import Network.Wai.Handler.Warp
import Network.HTTP.Types (status200)
import Network.HTTP.Types.Header (hContentType)
main = do
let port = 3000
putStrLn $ "Listening on port " ++ show port
let settings = defaultSettings { settingsPort = port,
settingsHost = Host "127.0.0.1" }
runSettings settings app
app req = return $
responseLBS status200 [(hContentType, "text/plain")] "Hello world!"