【问题标题】:How to run Snap haskell webapp in production?如何在生产中运行 Snap haskell webapp?
【发布时间】:2012-06-28 04:11:00
【问题描述】:

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

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

project-name -p 8000

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

有什么建议吗?

编辑 2:

他们在wiki 上说:

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

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

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

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

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

【问题讨论】:

  • 当你运行 project-name -p 8000 时,你的应用是不是按照你的要求运行在 8000 端口上?
  • 如果你不能将它作为守护进程运行,像使用屏幕一样运行它。例如screen -S snapd -d -m -L project-name -p 8000然后您可以通过screen -r snapd -X quit停止进程
  • @Sarah 是的,但是在生产中当我注销时,它会终止我的会话和其中的所有进程。
  • @DanielLeschkowski 我可能可以将它作为守护进程运行,我只是不知道如何......

标签: haskell haskell-snap-framework


【解决方案1】:

好的,在diggingasking 之后,这就是我想出的。

大创意

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

一步一步

  1. 编译您的网络应用程序。为了这个例子,我们假设 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 网络服务器,使其在端口 80 上运行。(注意:您必须禁用所有 apache 和 nginx 服务器,以便它们不再占用该端口)

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

    initctl list | grep mysite
    initctl start mysite
    

【讨论】:

    【解决方案2】:

    是的,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 处理远程同步、重启等。

    希望这会有所帮助。

    【讨论】:

    • 谢谢,太好了。但是我如何“启动”我的应用程序?另外,有没有使用 cabal-dev 的替代方法,这该死的东西在 Windows 上不起作用?
    • 您首先运行可执行文件——在 cabal 编译后创建的 myapp.exe。如果您不想使用 cabal-dev,只需使用 cabal 本身。没有沙盒,您将获得相同的结果。
    • 你运行什么样的负载均衡器?
    【解决方案3】:

    因为它是 Ubuntu,你几乎总是最好使用 upstart 来管理它。

    man 5 init

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

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

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

    【讨论】:

    • 感谢您让我了解新贵。它看起来很棒而且使用简单!您将如何“将 nginx 从其中放入其中”-我的意思是我的 snap webapp 采用什么形状?我仍然运行 snap webserver,还是只运行 nginx?对不起,愚蠢的问题......
    • 作为一个 [明显的] 旁注:我会在 nginx 后面运行 snap,它将提供静态内容和代理 URL 到动态内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 2021-01-06
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多