29

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

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

project-name -p 8000

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

有小费吗?

编辑2:

他们在维基上说:

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

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

包括自己的服务器。见网络/框架

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

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

4

3 回答 3

25

好的,所以经过一些挖掘询问,这就是我想出的。

大创意

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

一步步

  1. 编译你的 web 应用程序。为了这个例子,我们假设 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 的服务。为此,我们将使用 Ubuntu 的服务工具upstart

    a) 我们只需通过在目录中创建一个具有所需名称的 conf 文件来命名我们的服务/etc/init/。让我们称之为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
    
于 2012-07-03T05:15:29.907 回答
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部署自动化的忠实粉丝。您可以使用fabric 处理远程同步、重启等。

希望这可以帮助。

于 2012-06-28T06:28:34.307 回答
5

由于它是 Ubuntu,因此您几乎总是最好使用 upstart 来管理它。

man 5 init

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

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

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

于 2012-06-27T16:57:59.783 回答