を使用してwarpアプリケーションを実行するrunと、すべての IP アドレスでリッスンします。
localhostセキュリティ上の理由から、リバース プロキシを使用してリモート アクセスを処理し、リッスンのみしたいと考えています。
run特定のホスト/IP でのみリッスンするには、どのように呼び出す必要がありますか?
注:この質問は、Q&A スタイルで回答されているため、意図的に研究努力を示していません。
現在受け入れられている回答は、コンジットおよび/またはワープの変更によって壊れました。HostWarp はコンストラクターをエクスポートしなくなりました。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!"