亚马逊上的Haskell(Yesod)

4
我想使用亚马逊网络服务部署一个使用Yesod制作的系统。但是我找不到一个好的教程或步骤来完成这个过程。 寻找能够处理Haskell的Web主机说Amazon EC2是最好的选择。但它没有说明如何操作或提供链接。 此外,它还有一个评论说我可以将我的S3链接到EC2。

@Tobias Brandt - 我建议你先尝试在 Ubuntu 14 上本地安装 Yesod,但我自己尝试失败了。因为我是 Haskell Yesod 的新手,所以也不知道该怎么做。 - Ryan Monreal
1
如果你使用的是Ubuntu 10.14,你应该可以通过sudo apt-get install haskell-platform来安装Haskell平台。之后,请按照http://www.yesodweb.com/page/quickstart进行操作。 - Tobias Brandt
在Ubuntu 14上怎么样?因为Amazon EC2提供了更新的操作系统,即Ubuntu Server 14.04 LTS。 - Ryan Monreal
抱歉,我的意思是14.04。只需跟随链接即可。 - Tobias Brandt
3个回答

5
我建议您查看 https://github.com/snoyberg/keter/https://halcyon.sh/。它们是Haskell Web应用程序的部署管理器。Keter是用Haskell编写的,而Halcyon则是使用shell。在我看来,keter更适合处理Amazon,而halcyon则更适合处理依赖项、初始设置、Heroku和Digital Ocean。两者都很棒。
(更新25-02-2015)
Keter被提及在《使用Haskel和Yesod开发Web应用程序》第2版中,该书于2015年2月推出(http://www.yesodweb.com/book/deploying-your-webapp)。我强烈推荐这本书和这些工具。
此外,如果只是一个小项目或测试的话,我建议使用Heroku。
链接: http://shop.oreilly.com/product/0636920035664.do http://www.amazon.com/Developing-Apps-Haskell-Yesod-Safety-Driven/dp/1491915595/ref=dp_ob_title_bk https://github.com/snoyberg/keter/ https://halcyon.sh/

为了补充我上面的回答,我还想建议您看一下 halcyon(https://halcyon.sh/),并且不要在您的 EC2 内编译代码,原因显而易见。 - notvitor
我已经通过 @fpcomplete IDE 编译了我的项目,但是一旦我安装 keter,就会出现错误。我已经在GITHUB上创建了一个问题。 - Ryan Monreal

2
我可以在EC2/Ubuntu 14.04上使用Nginx作为前端服务器,并使用Yesod应用程序作为反向代理。我没有尝试Keter,因为Nginx/Yesod已经很好地运行了。我假设您已经安装了Nginx。
Haskell/Yesod的安装
正如Yesod作者在http://www.yesodweb.com/page/quickstart中所述,Stackage(https://www.stackage.org)非常容易安装依赖库,甚至是Haskell本身。我按照这个网站(https://github.com/commercialhaskell/stack/blob/master/doc/install_and_upgrade.md)来轻松安装Ubuntu 14.04上的Stack。
  1. wget -q -O- https://s3.amazonaws.com/download.fpcomplete.com/ubuntu/fpco.key | sudo apt-key add -
  2. echo 'deb http://download.fpcomplete.com/ubuntu/trusty stable main'|sudo tee /etc/apt/sources.list.d/fpco.list
  3. sudo apt-get update && sudo apt-get install stack -y

您可以使用stack ghci来启动Haskell REPL。

创建并构建Yesod项目

  • stack new my-project yesod-sqlite && cd my-project
  • stack install yesod-bin cabal-install --install-ghc
  • stack build

使用交换空间以获得更多内存

对于我的EC2服务器,我只有1G的内存无法完成构建,但我可以使用交换分区来使用更多内存-https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04
  1. sudo fallocate -l 4G /swapfile
  2. sudo chmod 600 /swapfile
  3. sudo mkswap /swapfile
  4. sudo swapon /swapfile

开发测试

  • stack exec -- yesod devel

您可以启动Web浏览器使用http://localhost:3000检查。

部署

根据http://www.yesodweb.com/book/deploying-your-webapp,我需要三个组件来部署到其他机器。

  1. 您的可执行文件。
  2. 配置文件夹。
  3. 静态文件夹。

stack build 命令会给出可执行文件的位置:

my-project-0.0.0: install
Installing library in
/home/a/my-project/.stack-work/install/x86_64-linux/lts-3.13/7.10.2/lib/x86_64-linux-ghc-7.10.2/my-project-0.0.0-Khn8lQEgR1HARzYGStlvPe
Installing executable(s) in
/home/a/my-project/.stack-work/install/x86_64-linux/lts-3.13/7.10.2/bin
Registering my-project-0.0.0...

可执行文件位于 /home/a/my-project/.stack-work/install/x86_64-linux/lts-3.13/7.10.2/bin。我可以将文件(可执行文件、静态文件和配置文件)复制到 ~/deployment 目录中检查 Yesod 是否正常工作。
这是目录结构。
├── config
│   ├── client_session_key.aes
...
│   └── test-settings.yml
├── my-project
└── static
    ...

更改端口号

在 config/settings.yml 中更改端口号。

port:           "_env:PORT:3002"
approot:        "_env:APPROOT:http://localhost:3002"

(我不确定为什么)但是,要使settings.yml起作用,您需要将文件复制到当前目录中,然后运行./my_project settings.yml
检查http://localhost:3002
设置Nginx服务器
这是Yesod的配置文件。
# the IP(s) on which your node server is running. I chose port 3000.
upstream yesod {
        server 127.0.0.1:3002;
        keepalive 8;
}

# the nginx server instance
server {
        listen 0.0.0.0:80;
        server_name yesod.example.com;
        access_log /var/log/nginx/access_yesod.log;
        error_log /var/log/nginx/error_yesod.log;

        location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;

            proxy_pass http://yesod/;
            proxy_redirect off;
        }

        location /excluded {
            return 403;
        } 
}

将此文件复制到 /etc/nginx/site-enabled(或从 site-available 创建符号链接),然后重新启动 nginx 服务器:sudo server nginx restart。
现在,您可以从 http://yesod.example.com 访问 Yesod 应用程序。
参考资料:

1

Yesod的书中有一个完整的章节介绍如何部署你的Yesod应用http://www.yesodweb.com/book/deploying-your-webapp

在那里推荐使用Amazon,所以在Amazon上应该没有任何问题。如果你有关于keter的更具体问题,请将它们作为新问题发布。


@RyanMonreal 任何亚马逊实例都应该很乐意运行keter,只是不要在那里构建它,而是在Linux机器(或虚拟机)上本地构建它,并将keter可执行文件复制到实例中。 keter是一个轻量级高性能的可执行文件,类似于nginx,但是用Haskell编写,具有其配置格式,并且能够监听/opt/keter/incoming中的更改,因此您无需执行任何操作,只需将proj.keter文件通过scp复制到/opt/keter/incoming即可。 - Konstantine Rybnikov
我已经在我的实例上成功安装了Keter。 同时,我已经使用fpcomplete IDE构建了我的项目,它为我提供了一个完整的构建项目的包。 但是,当我按照链接sudo start mysite操作时,出现了错误。这是怎么回事? - Ryan Monreal
@RyanMonreal 哦,我现在明白了。我想你只是使用普通的本地构建来在本地构建你的项目。在这种情况下,你只需要运行 yesod keter,然后会有一个 .keter 文件,你需要将其 scp 到你的亚马逊实例上。 - Konstantine Rybnikov
@RyanMonreal 让我看看如何部署由fpcomplete开发的yesod应用程序。 - Konstantine Rybnikov
@RyanMonreal 在从fpcomplete中心下载了您的应用程序之后,您可以解压并在Amazon服务器上运行Main可执行文件。它将在某个端口(不是80)上运行,您可以删除keter并仅配置nginx将80端口转发到该端口,或者您可以尝试为此配置keter。要配置keter-本地解压缩.tar.gz文件,将config/keter.yml文件放置在其中,其内容如下:https://gist.github.com/k-bx/056b07a85eec3e01ae8d(编辑您的主机名和IP),然后将其打包回.tar.gz文件,将该.tar.gz文件重命名为.keter。 - Konstantine Rybnikov
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接