如何在生产中运行Snap haskell webapp?

时间:2012-06-26 18:56:47

标签: haskell haskell-snap-framework

我已经在我的生产Ubuntu服务器上安装了Snap / Haskell(在EC2上),并检出了我的项目 - 但我该如何运行它?

我的意思是,在本地,我从命令行运行它:

project-name -p 8000

snap是否带有它自己的网络服务器(it looks like it),如果是这样,我如何配置它作为某种守护进程运行?

任何提示?

编辑2:

他们说wiki

  

snap-server是支持该接口的HTTP服务器库   在snap-core中定义。

虽然在这里,关于“你的haskell网络代码的部署/后端选项”的haskell wiki说Snap:

  

包含自己的服务器。 see Web/Frameworks

如何?我如何运行它自己的服务器?如果我只是对编程感兴趣,为什么我必须知道该死的东西的部署...

编辑:相关问题:Deploy Haskell code that uses the Snap Framework

3 个答案:

答案 0 :(得分:25)

好的,所以经过一些diggingasking,这就是我想出来的。

大创意

将Snap应用程序编译为二进制文件,然后在upstart的帮助下将其作为服务运行。

一步一步

  1. 编译您的webapp。为了这个例子,我们假设webapp位于/home/john/webapps/mysite

    $ cd /home/john/webapps/mysite
    $ cabal install
    ...
    Preprocessing executable 'mysite` for 'mysite-0.1'...
    Installing executable(s) in /home/john/.cabal/bin
    

    正如我们所看到的,二进制文件放在/home/john/.cabal/bin中。你可以把它移到任何你喜欢的地方,但我们会留在那里。

  2. 在您的应用程序文件夹中创建一个日志,否则snap会抱怨:

    $ mkdir /home/john/webapps/mysite/log
    
  3. 现在我们将创建一个运行我们的webapp的服务。为此,我们将使用名为upstart的Ubuntu服务工具。

    a)我们仅通过在/etc/init/目录中创建具有所需名称的conf文件来命名我们的服务。我们称之为mysite

    $ sudo vi /etc/init/mysite.conf
    

    b)现在让我们添加我们服务的描述:

    start on startup
    chdir /home/john/webapps/mysite
    exec /home/john/.cabal/bin/mysite -p 80
    

    首先,我们说该服务应该在系统的启动(或启动时)运行。

    其次,由于snap需要它snaplets和其他静态资源(比如我们之前创建的日志目录) - 我们告诉服务在我们项目的目录中运行。

    最后,我们指定实际将作为服务运行的二进制文件:/home/john/.cabal/bin/mysite。我们将-p 80参数传递给snap webserver以使其在端口80上运行。(注意:您必须禁用所有apache和nginx服务器,以便它们不再占用该端口)

  4. 完成。您可以检查它是否正在运行并在需要时手动启动:

    initctl list | grep mysite
    initctl start mysite
    

答案 1 :(得分:17)

是的,snap-server是它自己的服务器,这意味着你的Haskell / Snap应用程序的编译会留下一​​个可执行文件,你可以从命令行运行它来托管你的站点。就是这样,没有像apache或nginx这样的外部服务器。如果需要,您可以设置反向代理,但这取决于您。

以下是我对大部分严肃部署的处理方式:

  • 在同一个Linux机器箱或兼容机器上编译 - 我几乎总是使用cabal-dev进行沙盒处理
  • 命令行参数: cabal-dev/bin/myapp -p 8010 -e prod +RTS -A4M -qg1
  • 我在非默认的非默认端口(上面的8010)上运行,以便我可以使用负载均衡器将请求转发给它。如果需要,这还允许我在每个linux框中运行多个快照应用程序。
  • 然后我使用一个简单的流程监控应用程序来确保它保持运行状态。您可以使用:
  • 设置了一个显示器,只要您想重新启动,您就可以向应用程序发送HUP信号,监控应用程序只会将其重新启动。
  • 我是部署自动化Fabric的忠实粉丝。您可以使用结构处理远程同步,重启等。

希望这有帮助。

答案 2 :(得分:5)

因为它是Ubuntu,所以使用upstart管理它几乎总是更好。

man 5 init

除此之外,它还允许您为服务设置依赖性层次结构。 “snapapp取决于mongodb,所以在mongodb运行之前不要启动snapapp” - 那种事情。

是的,snap是一个Web服务器,但我们几乎总是将nginx放在它们前面,而snap应用程序只监听localhost,而proxy_path指向服务器或其中一组。

有趣的是,我们几乎完全转向使用Common Lisp进行$ work的新开发,设置完全相同。

相关问题