如何在FreeBSD10.2上部署ClojureWeb应用程序

来自菜鸟教程
跳转至:导航、​搜索

介绍

人们对函数式编程的兴趣持续上升,更具体地说,是 Clojure 中的 Web 编程。 许多关于如何构建基本应用程序的教程经常忽略部署细节。 本文将向您展示如何将 Clojure Web 应用程序部署到 FreeBSD 10.2 Droplet。

具体来说,我们将创建一个示例 Clojure 应用程序并将其打包以供生产使用,并在服务器上设置 Clojure 应用程序环境,使用 Supervisor 运行应用程序和 Nginx 为其提供请求。

先决条件

在开始本指南之前,您需要以下内容:

  • 一个 FreeBSD 10.2 Droplet,您可以选择使用 这些说明 对其进行自定义

第 1 步 - 创建和打包示例 Clojure 应用程序

第一步是使用 git 来获取要部署的示例 Clojure 项目。

首先,更新您的软件包并在服务器上安装 git

sudo pkg update
sudo pkg install git

接下来,克隆示例项目存储库。

git clone https://github.com/do-community/do-clojure-web.git

此存储库是遵循 Clojure 基本 Web 开发 教程的最终结果。 如果您愿意,您可以自己学习该教程,而不是克隆此存储库。

Clojure 利用 JVM 来运行其代码,因此您需要编译您的项目来运行它。 Leiningen 是 Clojure 应用程序的依赖管理和构建自动化工具,使这一切变得简单。

现在让我们安装 Leiningen。

sudo pkg install leiningen

您会注意到一些输出声明 Java 需要几个特殊的文件系统挂载点。 我们将在下一步处理这个问题。

现在您可以使用 lein 编译您的项目以在服务器上运行。

cd ~/do-clojure-web
lein uberjar

第 2 步 — 设置 Clojure 应用程序环境

这个应用程序需要三个主要部分才能正常工作:Java、Supervisor 和 Nginx。 我们在上一步安装 Leiningen 时安装了 Java,所以接下来,我们将安装 Supervisor 和 Nginx。

sudo pkg install nginx py27-supervisor

Java 需要几个特殊的文件系统挂载点,如步骤 1 中所述。 运行这两个命令以确保它们已安装。

sudo mount -t fdescfs fdesc /dev/fd
sudo mount -t procfs proc /proc

我们不会在每次系统启动时都运行这些命令,而是让它自动发生。 使用 ee 或您喜欢的文本编辑器编辑 /etc/fstab 文件。

sudo ee /etc/fstab

确保 /etc/fstab 文件的末尾有以下两个条目。

/etc/fstab

fdesc   /dev/fd     fdescfs     rw  0   0
proc    /proc       procfs      rw  0   0

您还需要一个地方来保存 Clojure Web 应用程序及其日志文件。 接下来创建该目录结构。

sudo mkdir -p /www/data/do-clojure-web/app/db/ /www/logs

现在您可以将 Clojure 应用程序文件和数据库文件移动到您创建的目录中。

sudo cp ~/do-clojure-web/target/do-clojure-web-0.1.0-standalone.jar /www/data/do-clojure-web/app/
sudo cp ~/do-clojure-web/db/do-clojure-web.h2.db /www/data/do-clojure-web/app/db/

该应用程序将在系统上以用户 www 的身份运行,因此它可以写入我们的内置数据库。 将应用程序路径的所有者设置为www

sudo chown -R www /www/data/do-clojure-web/

切换到 Clojure 应用程序目录。

cd /www/data/do-clojure-web/app/

在生产环境中,应用程序的版本号会随着每次更新而改变。 您不希望每次发生这种情况时都必须更新系统配置。 为防止这种情况,请创建指向当前运行的应用程序版本的符号链接。 您将在接下来的步骤中引用符号链接。

sudo ln -s do-clojure-web-0.1.0-standalone.jar do-clojure-web.jar

该应用程序当前配置为只能通过 localhost 访问,但您仍然可以确保它启动时没有错误。 在继续之前这样做。

sudo java -jar do-clojure-web.jar

如果一切正常,您应该得到类似于此的输出:

输出

. . .
2015-06-12 04:30:17.882:INFO:oejs.Server:jetty-7.x.y-SNAPSHOT
2015-06-12 04:30:17.995:INFO:oejs.AbstractConnector:Started SelectChannelConnector@127.0.0.1:5000

按组合键 CTRL+C 继续并暂时停止应用程序。

第 3 步 — 配置 Supervisor 以运行 Clojure 应用程序

有几个选项可用于将您的应用程序作为服务进行管理。 对于真正需要扩展的服务,我建议查看有关运行 Clojure 应用程序的 uWSGI 文档

创建并编辑 /usr/local/etc/supervisord.conf 文件。

sudo ee /usr/local/etc/supervisord.conf

将此配置添加到文件的最底部并保存。

/usr/local/etc/supervisord.conf

[program:do-clojure-web]
command=/usr/local/bin/java -jar do-clojure-web.jar
directory=/www/data/do-clojure-web/app
user=www
autostart=true
autorestart=true
startretries=3
redirect_stderr=true
stdout_logfile=/www/logs/do-clojure-web.app.log

这种配置非常简单。 Supervisor 守护进程(服务)将从 /www/data/do-clojure-web/app/ 目录中运行我们的应用程序。 它还将确保登录到 /www/logs/do-clojure-web.app.log,并在应用程序崩溃时尝试重新启动它。

第 4 步 — 将 Nginx 配置为代理服务器

因为 Clojure Web 应用程序只接受来自 localhost 的 5000 端口的连接,所以我们需要在它前面放置一个像 Nginx 这样的 Web 服务器来提供外部访问。 这对于在扩展应用程序时提供静态资产也非常方便。

编辑 /usr/local/etc/nginx/nginx.conf 文件。

sudo ee /usr/local/etc/nginx/nginx.conf

首先,在文件中已经存在的 server 块上方添加 upstream 块,在下方以红色突出显示。

/usr/local/etc/nginx/nginx.conf

. . .
    #gzip  on;
    
    upstream http_backend {
        server 127.0.0.1:5000;
        keepalive 32;
    }

    server {
            listen       80;
            server_name  localhost;
. . .

现在找到以 location / 开头的块(在 server 块内)。 通过在每行的开头添加 # 注释掉其中的所有行,并添加以红色突出显示的新 location / 部分。 这告诉 Nginx 像普通 Web 服务器一样在端口 80 上进行侦听,并将您的请求代理到 Clojure 应用程序。

/usr/local/etc/nginx/nginx.conf

. . .
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #location / {
        #    root   /usr/local/www/nginx;
        #    index  index.html index.htm;
        #}

        location / {
            proxy_pass http://http_backend;

            proxy_http_version 1.1;
            proxy_set_header Connection "";

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;

            access_log /www/logs/do-clojure-web.access.log;
            error_log /www/logs/do-clojure-web.error.log;
        }

        #error_page  404              /404.html;
. . .

保存并退出文件。

第 5 步 - 启动服务和测试访问

是时候启动所有部分并确保一切正常。 第一步是确保您的服务配置为在启动时启动。

编辑 /etc/rc.conf 文件。

sudo ee /etc/rc.conf

将这两行添加到 /etc/rc.conf 文件的末尾。

/usr/local/etc/rc.conf

nginx_enable="YES"
supervisord_enable="YES"

保存并退出文件。

继续并启动 Supervisor 守护进程,以便您的 Clojure 应用程序启动。

sudo service supervisord start 

等待它启动大约 30 秒,然后启动 Nginx Web 服务器前端代理。

sudo service nginx start

在浏览器中访问 http://your_server_ip。 您应该会看到示例 Clojure 应用程序站点加载。

如果您只是获得默认的 Nginx 页面,请尝试使用 sudo service supervisord restart 重新启动 Supervisor,等待 30 秒,然后使用 sudo service nginx restart 重新启动 Nginx。

加载站点后,单击屏幕顶部的 添加位置 链接并尝试添加一些数字坐标以确保您的数据库访问权限正确。 例如,您可以为 x 值 添加 1,为 y 值 添加 2。 这应该会将您带到一个页面,该页面显示:

添加位置输出

Added [1, 2] (id: 1) to the db. See for yourself.

如果您单击屏幕顶部的 查看所有位置 链接,您应该会看到一个包含新条目的表格。

结论

您刚刚使用 Leiningen、Supervisor 和 Nginx 部署了一个 Clojure 应用程序! 即使是部署最简单的网站和应用程序,也有很多东西需要学习。 下一步是部署您的自定义应用程序,而不是本教程中使用的演示应用程序。