如何运行已部署的Haskell Web应用程序

时间:2012-01-11 22:08:37

标签: haskell

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

例如,对于node.js,我们使用cluster来启动在多个处理器内核上启动的应用程序,然后为centOS创建一个init.d脚本来运行,daemonize,拥有pid文件等。< / p>

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

2 个答案:

答案 0 :(得分:6)

由于你没有提到你正在使用哪个框架,我只是想回答这个问题。

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

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

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

答案 1 :(得分:2)

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

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可执行文件并将SIGHUP发送到my_app进程。

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