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

And*_*yuk 29 haskell haskell-snap-framework

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

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

project-name -p 8000
Run Code Online (Sandbox Code Playgroud)

snap是否带有它自己的web服务器(它看起来像它),如果是这样,我如何配置它作为某种守护进程运行?

有小费吗?

编辑2:

维基上,他们说:

snap-server是一个HTTP服务器库,支持snap-core中定义的接口.

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

包括自己的服务器.请参阅Web /框架

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

编辑:相关问题:部署使用Snap Framework的Haskell代码

And*_*yuk 25

好的,经过一番挖掘询问,这就是我想出的.

好主意

将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
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

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

    $ sudo vi /etc/init/mysite.conf
    
    Run Code Online (Sandbox Code Playgroud)

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

    start on startup
    chdir /home/john/webapps/mysite
    exec /home/john/.cabal/bin/mysite -p 80
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

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

    initctl list | grep mysite
    initctl start mysite
    
    Run Code Online (Sandbox Code Playgroud)


oza*_*man 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部署自动化的忠实粉丝.您可以使用结构处理远程同步,重启等.

希望这可以帮助.


cli*_*ntm 5

既然它是Ubuntu,那么使用upstart来管理它几乎总是更好.

man 5 init

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

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

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