介绍
对于函数式编程,更具体地说,Clojure中的网络编程,人们的兴趣继续增加。 许多关于如何构建基本应用程序的教程经常忽略部署细节。 本文将向您展示如何将Clojure Web应用程序部署到FreeBSD 10.2 Droplet。
具体来说,我们将创建一个示例Clojure应用程序并将其打包供生产使用,并在服务器上使用Supervisor运行应用程序和Nginx来为其提供请求来设置Clojure应用程序环境。
先决条件
在开始本指南之前,您需要具备以下条件:
- 一个FreeBSD的10.2Droplet,你可以选择用自定义这些说明
第1步 - 创建和打包示例Clojure应用程序
的第一步是使用git
抢例子Clojure的项目进行部署。
首先,更新你的包和安装git
在服务器上。
sudo pkg update
sudo pkg install git
接下来,克隆示例项目存储库。
git clone https://github.com/do-community/do-clojure-web.git
这个库是继的最终结果Clojure的基本Web开发的教程。 如果你喜欢,而不是克隆这个存储库,你可以自己跟着这个教程。
Clojure的利用了JVM运行其代码,所以你需要编译的项目来运行它。 Leiningen,Clojure应用程序的依赖关系管理和构建自动化工具,使这很容易。
让我们现在安装Leiningen。
sudo pkg install leiningen
你会注意到一些输出声明Java需要几个特殊的文件系统挂载点。 我们将在下一步中处理这个问题。
现在,您可以编译您的项目与在服务器上运行lein
。
cd ~/do-clojure-web
lein uberjar
第2步 - 设置Clojure应用程序环境
我们需要三个主要部分为这个应用程序正常工作:Java,Supervisor和Nginx。 我们在最后一步安装了Java作为安装Leiningen的一部分,所以接下来,我们将安装Supervisor和Nginx。
sudo pkg install nginx py27-supervisor
Java需要几个特殊的文件系统安装点,如第1步中所述。运行这两个命令以确保它们已安装。
sudo mount -t fdescfs fdesc /dev/fd
sudo mount -t procfs proc /proc
而不是每次系统启动时运行这些命令,我们将使其自动进行。 编辑/etc/fstab
使用文件ee
或您喜爱的文本编辑器。
sudo ee /etc/fstab
确保您的最后/etc/fstab
的文件有以下两个条目。
fdesc /dev/fd fdescfs rw 0 0
proc /proc procfs rw 0 0
你需要一个地方来保存你的Clojure web应用程序及其日志文件。 接下来创建该目录结构。
sudo mkdir -p /www/data/do-clojure-web/app/db/ /www/logs
现在,您可以将Clojure应用程序文件和数据库文件移动到您创建的目录中。
sudo cp ~/do-clojure-web/target/do-clojure-web-0.1.0-standalone.jar /www/data/do-clojure-web/app/
sudo cp ~/do-clojure-web/db/do-clojure-web.h2.db /www/data/do-clojure-web/app/db/
该应用程序将运行在系统上的用户的WWW,以便它可以写入到我们的内置数据库。 设置应用程序路径到www的所有者。
sudo chown -R www /www/data/do-clojure-web/
切换到Clojure应用程序目录。
cd /www/data/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。
创建和编辑/usr/local/etc/supervisord.conf
文件。
sudo ee /usr/local/etc/supervisord.conf
将此配置添加到文件的最底部并保存。
[program:do-clojure-web]
command=/usr/local/bin/java -jar do-clojure-web.jar
directory=/www/data/do-clojure-web/app
user=www
autostart=true
autorestart=true
startretries=3
redirect_stderr=true
stdout_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
文件。
sudo ee /usr/local/etc/nginx/nginx.conf
首先,添加upstream
块,红色高亮的下方,上述server
的文件块了。
. . .
#gzip on;
upstream http_backend {
server 127.0.0.1:5000;
keepalive 32;
}
server {
listen 80;
server_name localhost;
. . .
现在发现开头的块location /
(内部server
块)。 通过添加注释掉所有行#
在每一行的开头,并且添加了新location /
以红色突出显示部分。 这告诉Nginx像端口80上的普通Web服务器一样侦听,并将您的请求代理到Clojure应用程序。
. . .
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#location / {
# root /usr/local/www/nginx;
# index index.html index.htm;
#}
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 /www/logs/do-clojure-web.access.log;
error_log /www/logs/do-clojure-web.error.log;
}
#error_page 404 /404.html;
. . .
保存并退出文件。
第5步 - 启动服务和测试访问
现在是时候开火所有的部分,并确保事情正常工作。 第一步是确保您的服务配置为在启动时启动。
编辑/etc/rc.conf
的文件。
sudo ee /etc/rc.conf
这两行添加到年底/etc/rc.conf
文件。
nginx_enable="YES"
supervisord_enable="YES"
保存并退出文件。
继续,启动Supervisor守护进程,所以你的Clojure应用程序启动。
sudo service supervisord start
等待大约30秒,它开始,然后启动Nginx Web服务器前端代理。
sudo service nginx start
访问http:// your_server_ip
在浏览器中。 您应该看到示例Clojure应用程序站点加载。
如果你刚开始一个默认的Nginx页面,请尝试重新启动监控器sudo service supervisord 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应用程序! 有很多要学习围绕着部署甚至最简单的网站和应用程序的主题。 下一步是部署您的自定义应用程序,而不是本教程中使用的演示应用程序。