如何在 Ubuntu 14.04 上部署 Clojure Web 应用程序

介绍

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

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

前提条件

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

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

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

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

1sudo apt-get update
2sudo apt-get install git

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

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

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

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

首先,安装Java。

1sudo apt-get install openjdk-7-jre-headless

下一篇 下载 Leiningen 安装脚本 有 Leiningen 的 Ubuntu 包,但它非常过时。

1sudo curl https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein -o /usr/local/bin/lein

设置权限,以便任何用户都可以使用Leiningen提供的lein实用程序。

1sudo chmod a+x /usr/local/bin/lein

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

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

第2步:设置Clojure应用环境

我们需要三个主要部分,以便这个应用程序正常工作:Java,Supervisor和Nginx. 我们在最后一步安装了Java,所以下一步,我们将安装Supervisor和Nginx。

1sudo apt-get install nginx supervisor

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

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

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

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

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

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

转到 Clojure 应用程序目录。

1cd /var/www/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 应用程序

管理您的应用程序作为一个服务有几个选项. 您将在这里使用的选项叫做 Supervisor;它更容易管理,比简单的脚本更通用。然而,对于真正需要扩展的服务,请查看 uWSGI 文档在运行 Clojure 应用程序时。

创建和编辑 /etc/supervisor/conf.d/do-clojure-web.conf 文件。

1sudo nano /etc/supervisor/conf.d/do-clojure-web.conf

将此配置添加到文件中并保存。

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

这个配置很简单. 监视者戴蒙(服务)将从 /var/www/do-clojure-web/app 目录中运行我们的应用程序. 它还将确保登录 /var/www/logs/do-clojure-web.app.log,并尝试重新启动应用程序,如果它崩溃。

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

由于Clojure Web 应用程序只接受 localhost 在端口 5000 的连接,我们需要在其前面放置 Nginx 等 Web 服务器以提供外部访问。

编辑/etc/nginx/sites-available/default文件。

1sudo nano /etc/nginx/sites-available/default

将红色突出的部分添加到文件中. 这定义了我们的后端,以便在下一个配置部分中轻松参考。

 1[label /etc/nginx/sites-available/default]
 2. . .
 3# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
 4##
 5upstream http_backend {
 6    server 127.0.0.1:5000;
 7    keepalive 32;
 8}
 9server {
10    listen 80 default_server;
11. . .

现在找到以位置 /开始的块,通过在每个行开始时添加一个# 来评论其中的所有行。

 1[label /etc/nginx/sites-available/default]
 2. . .
 3        # Make site accessible from http://localhost/
 4        server_name localhost;
 5
 6        # location / {
 7                # First attempt to serve request as file, then
 8                # as directory, then fall back to displaying a 404.
 9                # try_files $uri $uri/ =404;
10                # Uncomment to enable naxsi on this location
11                # include /etc/nginx/naxsi.rules
12        # }
13
14        # Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests
15. . .

然后,就在下面,在下面的部分中添加,这将告诉 Nginx在端口 80 上像正常的 Web 服务器一样倾听,并向 Clojure 应用程序代理您的请求。

 1[label /etc/nginx/sites-available/default]
 2. . .
 3
 4        # Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests
 5
 6    location / {
 7        proxy_pass http://http_backend;
 8
 9        proxy_http_version 1.1;
10        proxy_set_header Connection "";
11
12        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
13        proxy_set_header Host $http_host;
14
15        access_log /var/www/logs/do-clojure-web.access.log;
16        error_log /var/www/logs/do-clojure-web.error.log;
17    }
18
19        #location /RequestDenied {
20        #       proxy_pass http://127.0.0.1:8080;    
21        #}

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

是时候点燃所有碎片,并确保事情正常工作了。继续前进并启动监控员戴蒙,以便您的Clojure应用程序开始。

1sudo service supervisor start

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

1sudo service nginx start

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

如果您刚刚收到一个默认的 Nginx 页面,请尝试重新启动 Supervisor 用sudo service supervisor 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