我已经在我的生产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
但如何?我如何运行它自己的服务器?如果我只是对编程感兴趣,为什么我必须知道该死的东西的部署...
答案 0 :(得分:25)
好的,所以经过一些digging和asking,这就是我想出来的。
将Snap应用程序编译为二进制文件,然后在upstart的帮助下将其作为服务运行。
编译您的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
中。你可以把它移到任何你喜欢的地方,但我们会留在那里。
在您的应用程序文件夹中创建一个日志,否则snap会抱怨:
$ mkdir /home/john/webapps/mysite/log
现在我们将创建一个运行我们的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服务器,以便它们不再占用该端口)
完成。您可以检查它是否正在运行并在需要时手动启动:
initctl list | grep mysite
initctl start mysite
答案 1 :(得分:17)
是的,snap-server是它自己的服务器,这意味着你的Haskell / Snap应用程序的编译会留下一个可执行文件,你可以从命令行运行它来托管你的站点。就是这样,没有像apache或nginx这样的外部服务器。如果需要,您可以设置反向代理,但这取决于您。
以下是我对大部分严肃部署的处理方式:
cabal-dev/bin/myapp -p 8010 -e prod +RTS -A4M -qg1
HUP
信号,监控应用程序只会将其重新启动。希望这有帮助。
答案 2 :(得分:5)
因为它是Ubuntu,所以使用upstart管理它几乎总是更好。
man 5 init
除此之外,它还允许您为服务设置依赖性层次结构。 “snapapp取决于mongodb,所以在mongodb运行之前不要启动snapapp” - 那种事情。
是的,snap是一个Web服务器,但我们几乎总是将nginx放在它们前面,而snap应用程序只监听localhost,而proxy_path
指向服务器或其中一组。
有趣的是,我们几乎完全转向使用Common Lisp进行$ work的新开发,设置完全相同。