专栏首页Maroon1105Debian 7上的Yesod,Nginx和MySQL(Wheezy)

Debian 7上的Yesod,Nginx和MySQL(Wheezy)

Yesod是一个基于纯函数式编程语言Haskell的Web框架。它专为高效开发类型安全,RESTful和高性能Web应用程序而设计。本指南介绍了在Debian 7(Wheezy)上部署Yesod和Nginx Web服务器,MySQL数据库所需的过程。

注意本指南中所需的步骤需要root权限。请确保以root身份或使用sudo前缀运行以下步骤。有关权限的更多信息,请参阅我们的用户和组指南。

先决条件

在开始安装和配置下述组件之前,请确保已按照“ 入门指南”中的说明设置主机名。这是检查方法。

  1. 输入以下命令以查看主机名: hostname
  2. 并显示完全限定的域名(FQDN): hostname -f 如果命令列出以前创建的主机名,则可以开始安装。
  3. 确保您的系统是最新的。发出以下命令以更新系统的存储库数据库并升级系统: apt-get update apt-get upgrade
  4. 您还需要Nginx和MySQL软件。请参阅Debian 7上的Nginx网站(Wheezy)以及如何在Debian 7上安装MySQL作为安装指南。

安装必需的软件包

由于Yesod是使用Haskell编程语言构建的,因此Haskell软件包是初步安装。Web框架Yesod需要来自Haskell平台的两个软件包。lib*-devHaskell模块需要这两个包mysql。如果您想使用SQLite,那么您不需要安装它们。

apt-get install haskell-platform libpcre3-dev libmysqlclient-dev

安装Yesod

Yesod是一个大型框架,它依赖于许多其他软件包。我们将使用cabal来管理所有这些。Cabal是Haskell社区中央包存档Hackage的包管理器。因为Hackage上的所有包都是由社区维护的,所以依赖关系没有得到很好的保护。所以你可能会遇到所谓的cabal依赖地狱问题。

为了避免这个问题,Yesod的维护者创建了一个名为yesod-platform的元数据包。它的依赖项的版本号是固定的,所以你不会遇到“阴谋集团”。另一方面,固定版本号可能会导致其他问题,尤其是当您还使用cabal管理其他大型项目时(例如pandoc,用于转换标记格式的Haskell库)。解决此问题的方法非常简单:如果要管理多个大型项目,请为每个项目创建新用户,然后将其安装到用户的主文件夹中。

  1. 所以让我们创建一个新用户。我们可以将其命名为“yesod”: sudo adduser yesod
  2. 然后切换到用户yesod: su - yesod
  3. 更新cabal: cabal update 然后你会.cabal在yesod的主文件夹中找到一个新文件夹。安装的cabal所有程序,所有库及其所有文档的配置文件都cabal将放在此文件夹中。特别是,安装了新的程序$HOME/.cabal/bin。要使用它们,您可以将此文件夹添加到yesod的PATH: echo PATH=\$HOME/.cabal/bin:\$PATH >> .bashrc source .bashrc
  4. 首先升级cabal-install。Debian 7 的haskell-platform软件包提供的cabal-install软件包没有“沙盒”功能,这对Yesod非常有用,所以我们需要升级它: cabal install cabal-install
  5. 再次注销和su,然后检查新的cabal是否正在使用中: exit su - yesod cabal --version 版本应大于1.20。
  6. 升级亚历克斯快乐。它们是Haskell的“flex”和“bison”。Yesod需要的language-javascript包依赖于它们的更高版本,因此我们需要升级它们: cabal install alex happy
  7. 现在您可以安装yesod-platformyesod-bin包: cabal install --reorder-goals --max-backjumps=-1 yesod-platform yesod-bin 该yesod-bin软件包为您提供了脚手架,开发服务器和一些简单的代码生成助手yesod-platform。我们将在下一节中使用它来构建新站点的脚手架。 该标志--reorder-goals试图根据某些启发式重新排序目标。它可能使回溯更快。如果你不添加这个标志,cabal可能会进入某些“坏”搜索分支,并在这里浪费大量的时间和内存。如果您的计算机没有足够的内存,甚至可能cabal无法解决依赖关系,并会给您一条错误消息。 该参数--max-backjumps设置最大跳回次数。默认值为200.我们将其设置为-1,这意味着无限制的回溯。如果您不添加此参数,cabal可能会失败,如果它无法在200步回溯中找到解决方案。 在Linode 1G上构建yesod-platformyesod-bin打包需要大约20分钟。

使用Yesod

要开始开发Yesod网站,首先要构建一个脚手架。在开发中,scaffold是占位符或示例集,它由所选框架或编译器的默认值构成。然后开发人员可以覆盖脚手架网站。

  1. 使用命令启动Yesod开发: cd $HOME yesod init 系统将询问您项目的名称以及要使用的数据库。您必须将项目命名为“myblog”。这在以后很重要。而第二个问题的答案是“mysql”。
  2. 输入Yesod创建的项目文件夹: cd $HOME/myblog
  3. 然后,发出以下命令以初始化沙箱。沙箱功能可确保将站点的依赖项安装站点所在的文件夹中,因此cabal不会破坏/home/yesod/.cabal中安装的软件包。你可以同时开发几个站点,你不必担心“阴谋集团依赖地狱”: cabal sandbox init 此命令将生成配置文件$HOME/myblog/cabal.sandbox.config,并在其中创建本地cabal环境$HOME/myblog/.cabal-sandbox
  4. 然后在沙箱中安装项目所需的包: cabal install --enable-tests . --reorder-goals --max-backjumps=-1 yesod-platform yesod-bin 它会将我们网站“myblog”所需的所有软件包编译并安装到最后一步创建的沙箱中。您可能会注意到“沙盒”版本yesod-platform可能比我们在上一节中安装的版本更新,因为在沙箱中,cabal在较小的树上搜索解决方案,因此结果可能会更好。

如果您想构建另一个站点,只需返回$HOME文件夹,然后yesod init再次发布。由于沙盒机制,不同的站点不会相互影响。

使用MySQL

在测试站点的脚手架之前,您需要在MySQL中创建一个用户和几个数据库。“yesod”命令为MySQL生成了一个配置文件,位于$HOME/myblog/config/mysql.yml。看一看。

$ HOME / myblog /配置/ mysql.yml

1 2 3 4 5 6 7 8 9 10 11 12 13 14

Default: &defaults user: myblog password: myblog host: localhost port: 3306 database: myblog poolsize: 10 ... Production: database: myblog_production poolsize: 100 <<: *defaults

您的站点可以在不同的环境中启动,例如开发,测试,分段和生产,您可以为它们提供不同的配置。本Default节给出了四种不同环境的配置。您可以使用自己的主机,端口,用户名,密码,数据库等修改此部分。例如,如果在生产环境中需要不同的设置,则可以Production先在该部分中编写新设置,然后再导入默认设置<<: *defaults

我们不需要修改此配置文件,它是可以接受的。因此,您只需要创建一个密码为“myblog”的用户“myblog”,以及四个数据库“myblog”,“myblog_testing”,“myblog_staging”和“myblog_production”。请记住将“myblog”替换为项目名称。

  1. 发出以下命令以登录mysql数据库管理系统的root帐户: mysql -u root -p
  2. 使用密码“myblog”创建用户“myblog”: create user 'myblog'@'localhost' identified by 'myblog';
  3. 创建数据库: create database myblog; create database myblog_test; create database myblog_staging; create database myblog_production;
  4. 不要忘记将用户分配到数据库: grant all privileges on myblog.* to 'myblog'@'localhost'; grant all privileges on myblog_testing.* to 'myblog'@'localhost'; grant all privileges on myblog_staging.* to 'myblog'@'localhost'; grant all privileges on myblog_production.* to 'myblog'@'localhost';
  5. 您现在可以退出mysql数据库管理系统: exit;
  6. 当MySQL用户和数据库准备就绪时,您可以发出以下命令来启动项目: cd $HOME/myblog yesod devel 请等待编译,然后您可以在http://www.yoursite.com:3000/看到您网站的脚手架,您www.yoursite.com的FQDN 在哪里。要停止它,只需按Enter

如果您的Linode有防火墙,3000则可能无法从外部访问该端口,因此您将无法在http://www.yoursite.com:3000/上看到您的站点。此端口仅用于测试或开发,因此请勿在防火墙上打开它。相反,您可以在Linode上设置SSH隧道,并通过此隧道在http://www.yoursite.com:3000/上查看您的站点。有关详细信息,请检查使用您的Linode设置SSH隧道以进行安全浏览

您可能已经注意到我们还没有配置Nginx。实际上,Yesod应用程序包含一个名为Warp的http服务器,它使用Haskell编写,运行时间非常快。如果没有安装Apache或Nginx等http服务器,您可以运行独立的Yesod应用程序。此功能类似于Node.js上的Express框架。

您的第一个Yesod网站的初始设置已完成。要开始Yesod网站的更高级开发,请阅读Yesod Book以获取更多详细信息。

部署到Nginx

Warp是一个快速的http服务器,但它缺少一些高级功能,如虚拟主机,负载平衡器或SSL代理,因此我们需要Nginx更灵活地为我们的站点提供服务。在本节中,我们将介绍一种将您的站点部署到Nginx的方法。

准备Yesod

  1. 在部署之前,您需要准备要部署的文件。在文件夹中发出以下命令$HOME/myblog: cabal clean cabal configure cabal build 您可以将它们视为make distclean && ./configure && make从源代码构建Unix包的标准方法。但是不要跑到cabal install这里!此命令将您的应用程序安装到其沙箱中,这不是我们想要的。
  2. 发出命令后cabal build,您的应用程序(myblog)将被构建并放入$HOME/myblog/dist/build/myblog/。这是我们要部署的程序。您可以将目录移动到任何位置。 您还需要将两个文件$HOME/myblog/config,并$HOME/myblog/static在同一目录。 让我们创建一个文件夹/var来部署这些文件。您需要root权限才能发出以下命令: mkdir /var/myblog chmod 755 /var/myblog/ chown yesod.yesod /var/myblog 然后复制文件: cp $HOME/myblog/dist/build/myblog/myblog /var/myblog cp -R $HOME/myblog/config /var/myblog cp -R $HOME/myblog/static /var/myblog
  3. 在启动站点之前,您需要修改该文件/var/myblog/config/settings.yml。此文件具有与之相同的结构mysql.ymlDefault各种环境都有一节和其他四节。我们只会/var/myblogProduction环境中运行,所以我们只需要修改这个设置文件的最后三行: /var/myblog/config/settings.yml1 2 3 Production: approot: "http://www.yoursite.com" <<: *defaults这里www.yoursite.com应该被您的FQDN取代。您也可以在此处使用其他虚拟主机名,例如myblog.yoursite.com只需确保它与在步骤5中传递给Nginx的那个相同。
  4. 要启动您的站点,请发出以下命令: cd /var/myblog ./myblog Production 您的网站现已上线。如果您已设置SSH隧道,可以在http://www.yoursite.com:3000/或http://hostingIP:3000/上查看。请注意,它还不能顺利运行,因为我们没有指示您的站点的静态文件所在的位置。我们将在下一步中执行此操作。请按Ctrl-C立即停止。
  5. 如果您希望您的站点作为守护程序运行,这意味着在一个恒定的运行状态下,您可以创建一个init.d脚本。我们在这里创建了一个简单的,供您参考: /etc/init.d/myblog 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 #! /bin/sh ### BEGIN INIT INFO # Provides: myblog # Required-Start: $network $syslog mysql nginx # Required-Stop: $network $syslog mysql nginx # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: MyBlog # Description: MyBlog: My First Yesod Application ### END INIT INFO PATH=/sbin:/bin:/usr/sbin:/usr/bin DESC="MyBlog" NAME=myblog MYROOT=/var/myblog MYGROUP=yesod MYUSER=yesod PIDFILE=/var/opt/myblog/run/$NAME.pid LOGFILE=/var/opt/myblog/log/$NAME.log DAEMON=/var/myblog/myblog DAEMON_ARGS="Production" . /lib/lsb/init-functions case "$1" in start) log_daemon_msg "Starting $DESC" "$NAME" mkdir -p /var/opt/myblog/run mkdir -p /var/opt/myblog/log chown -R ${MYUSER}:${MYGROUP} /var/opt/myblog start-stop-daemon --start --quiet --background \ --make-pidfile --pidfile $PIDFILE \ --chuid $MYUSER:$MYGROUP --chdir $MYROOT \ --exec /bin/bash -- -c \ "exec $DAEMON $DAEMON_ARGS > $LOGFILE" \ || true log_end_msg $? ;; stop) log_daemon_msg "Stopping $DESC" "$NAME" start-stop-daemon --stop --quiet \ --pidfile $PIDFILE --exec $DAEMON \ || true rm -f $PIDFILE log_end_msg $? ;; status) status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? ;; restart) $0 stop $0 start ;; *) echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2 exit 3 ;; esac exit 0别忘了让它可执行: chmod +x /etc/init.d/myblog 您可以发出以下命令来启动您的站点: service myblog start 您还可以使用相应的命令停止,重新启动或查询站点的状态。如果有任何错误,您可以查看日志文件/var/opt/myblog/log/myblog.log。 如果您需要在启动时运行站点,请发出以下命令将其添加到Debian系统的默认运行级别: update-rc.d myblog defaults

配置Nginx。

创建文件/etc/nginx/sites-available/myblog

在/ etc / nginx的/网站可用/ myblog

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

server { listen 80; server_name www.yoursite.com; location / { proxy_pass http://127.0.0.1:3000; } location /static { root /var/myblog; expires max; } }

server_name应该是你的FQDN,或者你在写的虚拟主机名/var/myblog/config/settings.yml。该位置/static告诉Nginx在哪里查找带有url的文件http://server_name/static/*。强烈建议的优化是从单独的域名提供静态文件,从而绕过cookie传输开销。您可以在部署Yesod Book的Webapp一章中找到有关此优化的更多详细信息。

将上述文件链接到/etc/nginx/sites-enabled,然后重新启动nginx

ln -s /etc/nginx/sites-available/myblog /etc/nginx/sites-enabled
service nginx restart

您可以在http://www.yoursite.com查看。

使用Nginx和MySQL的Yesod的安装和配置已经完成。

更多信息

有关此主题的其他信息,您可能需要参考以下资源。虽然提供这些是希望它们有用,但请注意,我们无法保证外部托管材料的准确性或及时性。

本文的版权归 GongAo啊_ 所有,如需转载请联系作者。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何在Linux上安装SHOUTcast DNAS服务器

    SHOUTcast是专为通过互联网传输流媒体而设计的软件。SHOUTcast系统使用经典的客户端 - 服务器配置。您可以在服务器上安装SHOUTcast,并使用...

    GongAo啊_
  • 使用Solr涡轮增压您的WordPress搜索

    由于无法建议搜索短语,捕捉拼写错误,理解单词变体,组织和过滤结果以及索引搜索结果文档,因此WordPress内置的标准搜索无法为访问者提供最佳搜索体验。全文搜索...

    GongAo啊_
  • 使用TCP Wrappers保护您的Linode

    TCP包装器是基于主机的访问控制系统。它们用于通过仅允许特定客户端访问服务器上运行的服务来防止对服务器的未授权访问。

    GongAo啊_
  • 业界 | Oculus VR创始人正面怼:Magic Leap就是一个悲剧

    成立于2011年,成立之后一直默默无闻,直到2017年12月,Magic Leap公司才公布了旗下第一款增强现实AR眼镜产品Magic Leap One,官方称...

    大数据文摘
  • ARkit|一起“宜家”吧!!!

    宜家家居将该技术应用到智能家居中,通过“IKEA Place”实现在住所就能看到虚拟家居在家中摆放的实际情况。

    算法与编程之美
  • Spark异常处理与调优(更新中~)

    http://blog.csdn.net/u011239443/article/details/52127689

    用户1621453
  • Android全面插件化RePlugin流程与源码解析

    RePlugin,360开源的全面插件化框架,按照官网说的,其目的是“尽可能多的让模块变成插件”,并在很稳定的前提下,尽可能像开发普通App那样灵活。那么下面就...

    恋猫
  • 全局替换字体?微信出品官方Sketch插件试试看~

    最近静Design的QQ群有小伙伴问,有没有可以全局替换文本字体颜色等等属性的插件呢?这个真的是非常需要的功能啊。有时候我们打开其他人的设计稿Sketch源文件...

    用户5009027
  • Magic Leap不带普通消费者玩了,疫情之下卖身未果,裁员一半求生

    一是裁员大约1000人——占公司员工总数的一半。二是逐步关停消费者业务,转向企业级产品。

    量子位
  • Magic Leap欲再度融资,此轮过后其市场估值将达60亿美元

    VRPinea

扫码关注云+社区

领取腾讯云代金券