6

を使用してwarpアプリケーションを実行するrunと、すべての IP アドレスでリッスンします。

localhostセキュリティ上の理由から、リバース プロキシを使用してリモート アクセスを処理し、リッスンのみしたいと考えています。

run特定のホスト/IP でのみリッスンするには、どのように呼び出す必要がありますか?

注:この質問は、Q&A スタイルで回答されているため、意図的に研究努力を示していません。

4

2 に答える 2

6

現在受け入れられている回答は、コンジットおよび/またはワープの変更によって壊れました。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!"
于 2014-05-05T20:11:10.503 に答える
2

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!" 
于 2014-03-24T21:07:27.157 に答える