如何在 FreeBSD 10.2 上部署 Clojure Web 应用程序

介绍

在 Clojure 中,功能编程和更具体地说,Web编程的兴趣不断增加. 许多关于如何构建基本应用程序的教程往往忽略了部署细节。

具体来说,我们将创建一个样本 Clojure 应用程序,并将其包装用于生产使用,并在服务器上设置 Clojure 应用程序环境,使用 Supervisor 运行应用程序,并使用 Nginx 服务请求。

注意:从 2022 年 7 月 1 日开始,DigitalOcean 将不再通过控制面板或 API 支持 FreeBSD Droplets. 但是,您仍然可以使用自定义图像将 FreeBSD Droplets 旋转。 请了解如何按照 我们的产品文档导入自定义图像到 DigitalOcean。

前提条件

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

步骤 1 — 创建和包装样本Clojure应用程序

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

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

1sudo pkg update
2sudo pkg install git

接下来,克隆样本项目存储库。

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

此存储是遵循 Clojure Basic Web Development 教程的最终结果. 如果您喜欢,而不是克隆此存储,您可以自己遵循该教程。

Clojure 利用 JVM来运行其代码,所以您需要编译您的项目来运行它。

让我们现在安装 Leiningen。

1sudo pkg install leiningen

您会注意到一些输出声明说Java需要一些特殊的文件系统安装点,我们将在下一步处理此问题。

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

1cd ~/do-clojure-web
2lein uberjar

第2步:设置Clojure应用环境

这个应用程序需要三个主要部件才能正常工作:Java、Supervisor 和 Nginx. 我们在最后一步安装 Leiningen 时安装了 Java,所以下一步我们会安装 Supervisor 和 Nginx。

1sudo pkg install nginx py27-supervisor

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

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

而不是每次系统启动执行这些命令,我们会自动执行此操作,使用ee或您最喜欢的文本编辑器来编辑/etc/fstab文件。

1sudo ee /etc/fstab

确保您的 /etc/fstab 文件的尽头有以下两个条目。

1[label /etc/fstab]
2fdesc   /dev/fd fdescfs rw 0 0
3proc    /proc procfs rw 0 0

您还需要一个地方来存储您的 Clojure Web 应用程序及其日志文件,然后创建该目录结构。

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

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

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

该应用程序将作为系统上的用户 www 运行,以便它可以写入我们的内置数据库。

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

转到 Clojure 应用程序目录。

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

在生產環境中,應用程式的版本號碼會隨著每個更新而變化. 您不希望每次發生這種情況時都需要更新系統配置。 為了防止這種情況,請建立一個對應用程式的現行執行版本的simlink。

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

该应用程序目前已配置为仅通过 localhost 访问,但您仍然可以确保它没有错误地启动。

1sudo java -jar do-clojure-web.jar

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

1[label Output]
2. . .
32015-06-12 04:30:17.882:INFO:oejs.Server:jetty-7.x.y-SNAPSHOT
42015-06-12 04:30:17.995:INFO:oejs.AbstractConnector:Started [email protected]:5000

继续前进并暂时停止应用程序,点击键组合 CTRL+C

步骤 3 — 配置管理员运行 Clojure 应用程序

对于一个真正需要扩展的服务,我建议查看运行Clojure应用程序的 uWSGI文档

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

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

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

 1[label /usr/local/etc/supervisord.conf]
 2[program:do-clojure-web]
 3command=/usr/local/bin/java -jar do-clojure-web.jar
 4directory=/www/data/do-clojure-web/app
 5user=www
 6autostart=true
 7autorestart=true
 8startretries=3
 9redirect_stderr=true
10stdout_logfile=/www/logs/do-clojure-web.app.log

这个配置是相当直前的。 监视者戴蒙(服务)将从 /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 文件。

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

首先,添加上游块,在文件中已经存在的服务器块上方以红色点亮。

 1[label /usr/local/etc/nginx/nginx.conf]
 2. . .
 3    #gzip on;
 4
 5    upstream http_backend {
 6        server 127.0.0.1:5000;
 7        keepalive 32;
 8    }
 9
10    server {
11            listen 80;
12            server_name localhost;
13. . .

现在找到以)。通过在每个行开始时添加一个# 来评论其中的所有行,并在新的位置/部分中添加红色突出,这告诉Nginx在端口80上听像正常的Web服务器,并向Clojure应用程序代理您的请求。

 1[label /usr/local/etc/nginx/nginx.conf]
 2. . .
 3    server {
 4        listen 80;
 5        server_name localhost;
 6
 7        #charset koi8-r;
 8
 9        #access_log logs/host.access.log main;
10
11        #location / {
12        #    root   /usr/local/www/nginx;
13        #    index index.html index.htm;
14        #}
15
16        location / {
17            proxy_pass http://http_backend;
18
19            proxy_http_version 1.1;
20            proxy_set_header Connection "";
21
22            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
23            proxy_set_header Host $http_host;
24
25            access_log /www/logs/do-clojure-web.access.log;
26            error_log /www/logs/do-clojure-web.error.log;
27        }
28
29        #error_page 404              /404.html;
30. . .

保存和退出文件。

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

是时候打开所有零件并确保事情正常工作了,第一步是确保您的服务已配置为启动。

编辑 /etc/rc.conf 文件。

1sudo ee /etc/rc.conf

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

1[label /usr/local/etc/rc.conf]
2nginx_enable="YES"
3supervisord_enable="YES"

保存和退出文件。

继续运行并启动 Supervisor daemon 以便您的 Clojure 应用程序启动。

1sudo service supervisord start

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

1sudo service nginx start

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

如果您刚刚收到一个默认的 Nginx 页面,请尝试重新启动 Supervisor 用sudo service supervisord restart,等待 30 秒,然后重新启动 Nginx 用sudo service nginx restart

一旦网站已加载,请点击屏幕顶部的添加位置链接,然后尝试添加几个数字坐标,以确保您的数据库访问权限正确。

1[label add-location output]
2Added [1, 2] (id: 1) to the db. See for yourself.

如果你点击屏幕顶部的 查看所有位置 链接,你应该看到一张带你的新条目的表。

结论

你刚刚使用Leiningen,Supervisor和Nginx部署了一个Clojure应用程序!在部署即使是最简单的网站和应用程序的主题上还有很多东西要学习。

Published At
Categories with 技术
comments powered by Disqus