如何部署在Ubuntu 14.04 Clojure的一个Web应用程序

这篇文章将告诉你如何将Clojure的Web应用程序部署到Ubuntu的14.04Droplet。 具体而言,我们将创建一个示例应用程序的Clojure和打包以供生产使用,并利用主管运行应用程序和Nginx的服务请求,它设置了Clojure的应用环境中的服务器上。

介绍

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

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

先决条件

在开始本指南之前,您需要具备以下条件:

  • 一个Ubuntu 14.04 Droplet
  • 与您的服务器上sudo访问的非root用户帐户,您可以通过以下设置这些说明

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

的第一步是使用git抢例子Clojure的项目进行部署。

首先,更新你的包和安装git在服务器上。

sudo apt-get update
sudo apt-get install git

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

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

这个库是继的最终结果Clojure的基本Web开发的教程。 如果你喜欢,而不是克隆这个存储库,你可以自己跟着这个教程。

Clojure的利用了JVM运行其代码,所以你需要编译的项目来运行它。 Leiningen,Clojure应用程序的依赖关系管理和构建自动化工具,使这很容易。 有几个步骤来让Leiningen设置。

首先,安装Java。

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

接下来下载Leiningen安装脚本。 有一个Ubuntu的包为Leiningen,但它是非常过时的。

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

设置权限,使任何用户都可以使用该lein工具Leiningen提供。

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

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

cd ~/do-clojure-web
lein uberjar

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

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

sudo apt-get install nginx supervisor

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

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

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

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

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

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

切换到Clojure应用程序目录。

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

有一些选项用于将应用程序作为服务进行管理。 在这里,您将使用的选项称为监事 ; 它比一个简单的脚本更容易管理和更多功能。 但是,对于真正需要扩展服务时,检查出uWSGI文档上运行的应用程序的Clojure。

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

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

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

/etc/supervisor/conf.d/do-clojure-web.conf中
[program:do-clojure-web]
command=/usr/bin/java -jar do-clojure-web.jar
directory=/var/www/do-clojure-web/app
user=www-data
autostart=true
autorestart=true
startretries=3
redirect_stderr=true
stdout_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文件。

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

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

/ etc / nginx / sites-available / default
. . .
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##
upstream http_backend {
    server 127.0.0.1:5000;
    keepalive 32;
}
server {
    listen 80 default_server;
. . .

现在发现开头的块location / 通过添加注释掉所有行#在每一行的开头。

/ etc / nginx / sites-available / default
. . .
        # Make site accessible from http://localhost/
        server_name localhost;


        # location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                # try_files $uri $uri/ =404;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        # }

        # Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests
. . .

然后,在下面,添加在下面的部分,这将告诉Nginx像一个普通的Web服务器在端口80上侦听,并代理您的请求到Clojure应用程序。

/ etc / nginx / sites-available / default
. . .

        # Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests

    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 /var/www/logs/do-clojure-web.access.log;
        error_log /var/www/logs/do-clojure-web.error.log;
    }

        #location /RequestDenied {
        #       proxy_pass http://127.0.0.1:8080;    
        #}

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

现在是时候开火所有的部分,并确保事情正常工作。 继续,启动Supervisor守护进程,所以你的Clojure应用程序启动。

sudo service supervisor start 

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

sudo service nginx start

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

如果你刚开始一个默认的Nginx页面,请尝试重新启动监控器sudo service supervisor restart ,等待30秒,重新启动与Nginx的sudo service nginx restart

一旦该网站已加载,点击添加位置链接,在屏幕的上方,并尝试添加一些数字坐标,以确保您的数据库的访问权限是正确的。 例如,您可以为Y值增加1 x值 2。 这应该会带你到一个页面,说:

添加位置输出
Added [1, 2] (id: 1) to the db. See for yourself.

如果你点击查看所有地点在屏幕的顶部链接,您应该看到您的新条目表。

结论

你刚刚使用Leiningen,Supervisor和Nginx部署了一个Clojure应用程序! 有很多要学习围绕甚至部署最简单的网站和应用程序的主题。 下一步是部署您的自定义应用程序,而不是本教程中使用的演示应用程序。