2012-01-11 34 views
8

我读过的每哈斯克尔部署线程我能在这里找到和一些更广泛的网络上,但我还是不明白一两件事。如果我已经为我的服务器编译了一个应用程序,并且可以ssh并运行它,那么我该如何去运行它?假设我使用的是HTTP接口(不是FastCGI)。如何运行部署Haskell的Web应用程序

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

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

+1

您是否使用特定框架? (Happstack/Yesod/etc?) – alternative 2012-01-12 02:42:33

+0

是的。 :)我对Happstack和Snap都很感兴趣。我一直在玩Hack2,但它使用Snap的服务器。 – 2012-01-12 15:23:50

回答

6

既然你不提你使用的框架,我只是要回答一般这个问题。

哈斯克尔,你没有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应用程序(这就是为什么你会不想使用端口80用于Web应用程序)的前端服务器。有关如何执行此操作的详细信息,请访问the Web/Deploy page on HaskellWiki

+0

你的回答完全是我试图弄清楚的问题!但是如果你不想使用前端服务器(我不知道为什么需要它),你如何在服务器上运行snap应用程序?就像Ubuntu服务那样,运行“your_app_name -p 80 + RS -N16”?我希望你回答,我一直在试图弄清楚这件事一段时间......谢谢! – drozzy 2012-07-01 00:05:53

2

三大Haskell网络框架(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身份运行。

+0

这种方法使很多系统管理员想要对其守护进程执行操作很困难,比如检查进程状态(这不能用'ps aux | grep ...''或'pgrep'当你有多个守护进程具有相同/相似的名字时),做实际的配置重载,没有特殊信号等。 – dflemstr 2012-01-12 14:14:24

+0

当然。这是一个较轻的解决方案,对于我职业系统管理员可能采取的方法似乎有点沉重的情况下,我的工作很好。 – mightybyte 2012-01-19 14:58:43

相关问题