介绍
在 Clojure 中,功能编程和更具体地说,Web编程的兴趣不断增加. 许多关于如何构建基本应用程序的教程往往忽略了部署细节。
具体来说,我们将创建一个样本 Clojure 应用程序,并将其包装用于生产使用,并在服务器上设置 Clojure 应用程序环境,使用 Supervisor 运行应用程序,并使用 Nginx 服务请求。
注意:从 2022 年 7 月 1 日开始,DigitalOcean 将不再通过控制面板或 API 支持 FreeBSD Droplets. 但是,您仍然可以使用自定义图像将 FreeBSD Droplets 旋转。 请了解如何按照 我们的产品文档导入自定义图像到 DigitalOcean。
前提条件
在您开始本指南之前,您将需要以下内容:
- 一个 FreeBSD 10.2 服务器,您可以选择使用 [这些说明] 定制(https://andsky.com/tech/tutorials/how-to-get-started-with-freebsd-10-1)
步骤 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应用程序!在部署即使是最简单的网站和应用程序的主题上还有很多东西要学习。