如何在生产中运行Snap haskell webapp?
我已经在我的Ubuntu生产服务器(EC2上)上安装了Snap/Haskell,并签出了我的项目——但我如何运行它呢 我的意思是,在本地,我从命令行运行它:如何在生产中运行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说
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、 gscreen-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。如果你不想使用阴谋集团开发,就使用阴谋集团本身。不使用沙箱,您将得到相同的结果。您运行的是哪种负载平衡器?