【问题标题】:How to run a deployed Haskell web application如何运行已部署的 Haskell Web 应用程序
【发布时间】:2012-01-12 21:39:35
【问题描述】:

我已经阅读了我可以在这里找到的每个 Haskell 部署线程以及在更广泛的网络上找到的几个,但我仍然没有得到任何东西。如果我为我的服务器编译了一个应用程序,并且可以 ssh 进入并运行它,我该如何运行它?假设我使用的是 HTTP 接口(不是 FastCGI)。

例如,对于 node.js,我们使用集群让应用程序在多个处理器内核上启动,然后为 centOS 创建一个 init.d 脚本来运行、守护进程、拥有一个 pid 文件等。

如何为 Haskell 应用程序执行此操作?

【问题讨论】:

  • 您使用的是特定框架吗? (Happstack/Yesod/等?)
  • 是的。 :) 我对 Happstack 和 Snap 都感兴趣。我一直在玩 Hack2,但它使用的是 Snap 的服务器。

标签: haskell


【解决方案1】:

由于您没有提及您使用的是哪个框架,我只是笼统地回答这个问题。

使用 Haskell,您不必启动 Web 应用程序的多个实例(在一个集群中),因为如果应用程序支持并发,它通常在内部使用多个线程。相反,您想要做的是确保使用 -threaded-rtsopts 标志编译应用程序。然后,当您运行应用程序时,您传递标志+RTS -N<number of simultaneous threads>。例如,如果您在配备英特尔® 超线程技术的 8 核计算机上使用在端口 1234 上运行的 Snap Web 应用程序,您可以使用my-server -p 1234 +RTS -N16 启动它,以使其最多并行化到 16 个操作系统线程。

要守护 Web 应用程序,您可以使用与 node.js 相同的过程。您创建了一个 init 脚本,以各种 UNIX 运行模式启动可执行文件,而 Bob 是您的叔叔。

与任何其他 Web 应用程序一样,您可能希望使用前端服务器将流量重定向到您的 Web 应用程序(这就是您可能不想为您的 Web 应用程序使用端口 80 的原因)。有关如何执行此操作的详细信息,请访问the Web/Deploy page on HaskellWiki

【讨论】:

  • 你回答的正是我试图弄清楚的问题!但是,如果您不想使用前端服务器(我不知道为什么需要它),如何在服务器上运行 snap 应用程序?就像运行“your_app_name -p 80 +RS -N16”的Ubuntu服务一样???我希望你能回答,我一直在努力解决这个问题......谢谢!
【解决方案2】:

三大 Haskell Web 框架(Snap、Yesod 和 Happstack)都具有内置 Web 服务器的能力。生产部署的传统方法可能是使用操作系统的机制将进程作为守护进程运行在初始化脚本或类似脚本中。我使用的一个更轻的解决方案是一个类似于以下的脚本:

while true; do
  echo Restarting at `date` | tee -a stdout.log stderr.log > /dev/null
  ./my_app 80 >> stdout.log 2>> stderr.log
done

我在后台运行这个脚本。它非常简单,因此 shell 脚本进程本身永远不会崩溃。如果服务器因任何原因崩溃,此脚本会自动确保它立即重新启动。如果您想推出新版本,只需将其复制到 my_app 可执行文件上,然后向 my_app 进程发送 SIGHUP。

硬化的系统管理员可能会对这样的事情感到不寒而栗。我不会说这是最好的方法,但我已经使用这种方法运行了几年的生产应用程序,并且效果很好。正如其他人所提到的,您还可以使用前端代理服务器进行设置,这样您的应用就不必以 root 身份运行。

【讨论】:

  • 这种方法使得许多系统管理员想要用他们的守护进程做的事情变得困难,比如检查进程状态(当你有多个守护进程时不能用ps aux|grep ...pgrep相同/相似的名称),在没有特殊信号的情况下进行实际的配置重新加载,等等。
  • 当然。这是一个较轻的解决方案,在职业系统管理员可能采取的方法似乎有点偏重的情况下对我来说效果很好。
猜你喜欢
  • 1970-01-01
  • 2017-04-22
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 2011-03-16
  • 1970-01-01
相关资源
最近更新 更多