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

介绍

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

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

准备

在开始本教程之前,您需要准备以下内容:

第一步 - 创建和打包示例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 Basic Web Development教程的最终结果。如果您愿意,可以自己学习该教程,而不是克隆此存储库。

Clojure利用JVM来运行其代码,因此您需要编译项目来运行它。Leiningen是Clojure应用程序的依赖管理和构建自动化工具,可以轻松实现。有两个步骤可以让Leiningen成立。

首先,安装Java。

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

接下来下载Leiningen安装脚本。Leiningen有一个Ubuntu软件包,但它已经过时了。

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

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

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

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

cd ~/do-clojure-web
lein uberjar

第二步 - 设置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-data运行,以便它可以写入我们的内置数据库。将应用程序路径的所有者设置为www-data

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,立即停止应用程序。

第三步 - 配置Supervisor以运行Clojure应用程序

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

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

sudo nano /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

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

第四步 - 将Nginx配置为代理服务器

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

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

sudo nano /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 /开头的块。通过在每行的开头添加一个#来注释掉其中的所有行。

. . .
        # 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像端口80上的普通Web服务器一样监听并将您的请求代理到Clojure应用程序。

. . .
​
        # 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;    
        #}

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

现在是时候开始所有的工作,并确保一切正常。继续并启动Supervisor守护程序,以便您的Clojure应用程序启动。

sudo service supervisor start 

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

sudo service nginx start

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

如果您只是获取默认的Nginx页面,请尝试用 sudo service supervisor 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应用程序!有关部署甚至最简单的网站和应用程序的主题还有很多东西需要学习。下一步是部署自定义应用程序,但不是本教程中使用的示例应用程序。

想要了解更多关于Linux开源信息教程,请前往腾讯云+社区学习更多知识。

参考文献:《How To Deploy a Clojure Web Application on Ubuntu 14.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏韩东吉的Unity杂货铺

零基础入门 25:MonoDevelop模板和快捷

Hello,几天没更,一些小伙伴在后台给我留言想咨询一下关于monoDevelop这个IDE的一些快捷方式和模板导入导出等,是如何做到的?

1673
来自专栏极客慕白的成长之路

MySQL社区版安装图文教程

在MySQL官网下载社区版mysql-installer-community,此版本为免费的。

1183
来自专栏mwangblog

Linux中的前台与后台运行

然而有时候需要将编译、压缩等耗时的工作放到后台运行,这个时候只需要在命令末尾加上&即可。

931
来自专栏运维小白

8.1 shell介绍

shell介绍 shell是一个命令解释器,提供用户和机器之间的交互 支持特定语法,比如逻辑判断、循环 每个用户都可以有自己特定的shell CentOS7默认...

19210
来自专栏jiajia_deng

一步一步教你自己来编译 wxsqlite3 静态库

wxsqlite3 相比普通的 sqlite3 的好处就是可以对数据库进行加密,但这个 wxsqlite3 的编译过程真的是非常曲折,我自己也是折腾了几个小时才...

1743
来自专栏韩东吉的Unity杂货铺

零基础入门 1: 环境布置

【Unity零基础入门】今天开始不定期更新,可能你之前有了解过Unity,或者对Unity一点也不了解, 又或者你现在正在从事Unity的相关工作,不管是哪种情...

791
来自专栏bboysoul

centos 搭建nfs服务器

今天就是想做一个nfs服务,然后可以把zstack硬盘里面的一部分空间可以当做局域网里面的共享存储来使用而已,共享目录是/data,操作其实挺简单的。

1404
来自专栏GreenLeaves

六、CLR下的托管代码应用程序与非托管代码程序之间的性能对比

1、托管程序二次编译的问题,以及微软做的优化 五、CLR加载程序集代码时,JIT编译器对性能的产生的影响中介绍了CLR下托管应用程序的二次编译对性能产生的影响....

2604
来自专栏dalaoyang

Linux安装RabbitMQ

本文环境是在腾讯云服务器CentOS7.2搭建的,RabbitMQ 3.6.8, Erlang R16B03-1

7512
来自专栏.NET后端开发

RabbitMQ消息队列系列教程(二)Windows下安装和部署RabbitMQ

1934

扫码关注云+社区

领取腾讯云代金券