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

如何在生产中运行Snap haskell webapp?,haskell,haskell-snap-framework,Haskell,Haskell Snap Framework,我已经在我的Ubuntu生产服务器(EC2上)上安装了Snap/Haskell,并签出了我的项目——但我如何运行它呢 我的意思是,在本地,我从命令行运行它: project-name -p 8000 snap是否自带自己的web服务器(),如果是,我如何配置它作为某种守护进程运行 有什么建议吗 编辑2: 另一方面,他们说: snap server是一个支持该接口的HTTP服务器库 在snap core中定义 在这里,关于“haskell web代码的部署/后端选项”的haskell wiki说

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

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

project-name -p 8000
snap是否自带自己的web服务器(),如果是,我如何配置它作为某种守护进程运行

有什么建议吗

编辑2:

另一方面,他们说:

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

在这里,关于“haskell web代码的部署/后端选项”的haskell wiki说:

包括它自己的服务器

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


编辑:相关问题:

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

man 5初始化

除此之外,它还允许您为服务设置依赖层次结构。“snapapp依赖于mongodb,所以在mongodb运行之前不要启动snapapp”——诸如此类的事情

是的,snap是一个web服务器,但我们几乎总是将nginx放在它们前面,snap应用程序只在本地主机上侦听,并且一个
代理路径指向服务器或一组服务器


有趣的是,我们几乎完全切换到Common Lisp进行$work的新开发,并且设置完全相同。

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

以下是我对大多数严肃部署所做的:

  • 在相同的linux机器或兼容的机器上编译-我几乎总是使用cabal dev进行沙箱
  • 命令行参数:
    cabal dev/bin/myapp-p8010-e prod+RTS-A4M-qg1
  • 我在一个非特权、非默认端口(上面的8010)上运行,这样我就可以使用负载平衡器将请求转发给它。这还允许我在需要时在每个linux设备上运行多个snap应用程序
  • 然后我使用一个简单的过程监控应用程序来确保它保持正常。您可以使用:
    • 上帝:
    • 天使:
    • 主管:
  • 设置好显示器后,只要想重新启动应用程序,就可以向应用程序发送
    HUP
    信号,监控应用程序就会将其重新启动
  • 我非常喜欢部署自动化。您可以使用fabric处理远程同步、重新启动等
希望这能有所帮助。

好的,经过一段时间的讨论后,我得出了以下结论

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

一步一步地
  • 编译你的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
    
    $ sudo vi /etc/init/mysite.conf
    
    正如我们所看到的,二进制文件被放置在
    /home/john/.cabal/bin
    中。你可以把它搬到任何你喜欢的地方,但我们会把它留在那里

  • 在应用程序文件夹中创建日志,否则snap将投诉:

    $ mkdir /home/john/webapps/mysite/log
    
  • 现在,我们将创建一个运行我们的webapp的服务。要做到这一点,我们将使用Ubuntu的服务设施,名为

    a) 我们只需在
    /etc/init/
    目录中创建一个具有所需名称的conf文件即可命名我们的服务。让我们称之为mysite

    $ cd /home/john/webapps/mysite
    $ cabal install
    ...
    Preprocessing executable 'mysite` for 'mysite-0.1'...
    Installing executable(s) in /home/john/.cabal/bin
    
    $ 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
    。我们将
    -p80
    参数传递给SnapWebServer,使其在端口80上运行。(注意:您必须禁用所有apache和nginx服务器,以便它们不再占用该端口)

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

    initctl list | grep mysite
    initctl start mysite
    

  • 当您运行projectname-p8000时,您的应用程序是否不仅仅按照您的请求在端口8000上运行?如果您不能将其作为守护程序运行,请像screen一样运行它。e、 g
    screen-S snapd-d-m-L项目名称-p 8000
    然后您可以通过
    screen-r snapd-X quit
    停止进程Sarah是的,但在生产环境中,当我注销时,它会终止我的会话和其中的所有进程。@Daniellschkowski我可能可以将其作为守护进程运行,我只是不知道如何…感谢您让我了解upstart。它看起来很棒而且使用简单!你会如何“将nginx从它们中加入”——我的意思是我的snap webapp是什么形状的?我仍然运行SnapWebServer,还是只运行nginx?抱歉问了这么愚蠢的问题……作为一个[明显的]旁注:我会在nginx后面运行snap,它将提供静态内容和动态内容的代理url。谢谢,这太棒了。但我如何“启动”我的应用程序?还有,除了使用cabal dev,还有其他方法吗?这该死的东西在windows上不起作用?你只需要运行可执行文件——在cabal编译后创建的myapp.exe。如果你不想使用阴谋集团开发,就使用阴谋集团本身。不使用沙箱,您将得到相同的结果。您运行的是哪种负载平衡器?