如何让 Yesod 监听特定 IP?

How to make Yesod listen on a specific IP?

我编写了一个名为 myapp 的 Yesod 网络应用程序,并将其编译(使用 stack build)为 myapp-exe。现在我想部署它,但我不想使用 Keter/scaffolding。 warp 程序允许我指定要侦听的端口,但不能指定 IP。有没有办法让编译后的可执行文件 myapp-exe 只在 127.0.0.1 上监听?

Warp 提供了一个名为 setHost 的函数:

https://s3.amazonaws.com/haddock.stackage.org/lts-5.18/warp-3.2.2/Network-Wai-Handler-Warp.html#v:setHost

你没有展示你是如何 运行 你的应用程序,但我猜你需要从 运行 runSettings 切换。

好吧,我应该在回答之前再研究一些。答案是使用 Network.Wai.Handler.Warp 中的 runSettings 而不是简单的 warp:

let stts = setPort 12345 $ setHost "127.0.0.1" defaultSettings
runStderrLoggingT $ withSqlitePool dbfile 10 $ \pool -> liftIO $ do
  waiApp <- toWaiApp $ MyApp pool
  runSettings stts waiApp

这允许更多设置,而 warp 只是一个方便的包装。