用于将OCaml应用程序部署到Nginx服务器的库和示例

时间:2016-04-29 00:51:13

标签: nginx cgi ocaml fastcgi

我在Ubuntu的OCaml中开发了一个桌面应用程序。

现在,我想将它部署到我拥有的DigitalOcean Ubuntu服务器(512 MB内存/ 20 GB磁盘)。我将在客户端使用JavaScript程序来调用存储在服务器端的可执行文件,然后处理返回的结果。

但是,我不知道如何开始。

有人向我指出了FastCGI,我确实在Nginx服务器中看到了一些FastCGI设置。似乎有一些OCaml库来处理FastCGI或CGI:ocamlnetcgiCamlGI等。

有人能告诉我哪个库稳定并且符合我的需要吗?

此外,是否有一些库的示例和Nginx服务器中的设置让我开始使用?

1 个答案:

答案 0 :(得分:1)

我不认为我会提出的解决方案不那么沉重,但它有几个优点:

  • 它允许您在Ocaml中生成网站,以便与您的代码的界面不会很难做到
  • 如果需要,您可以直接在Javascript中导出整个应用程序:您不会让您的服务器执行用户可以执行的无用计算,而且您不需要重写代码Javascript,Ocsigen可以为您转换代码
  • 如果服务器需要执行某些操作,您可以从客户端代码中轻松调用服务器端函数,并且所有代码都将使用Ocaml编写。
  • 很容易

这个神奇的工具是什么? Ocsigen!您可以找到完整的教程here

现在让我们看看如何使用它

安装Ocsigen

首先,如果您没有,请安装opam(它将允许您安装ocaml软件包)。只需按照网站上的说明操作(我不能粘贴链接,因为我没有足够的声誉点),但基本上是为了ubuntu运行:

sudo add-apt-repository ppa:avsm/ppa
sudo apt-get update
sudo apt-get install ocaml ocaml-native-compilers camlp4-extra m4 opam

然后,您需要安装Ocsigen。所有说明都在这里:https://ocsigen.org/install但基本上只是这样做:

sudo aptitude install libev-dev libgdbm-dev libncurses5-dev libpcre3-dev libssl-dev libsqlite3-dev libcairo-ocaml-dev m4 opam camlp4-extra
opam install eliom

(注意:如果您不想安装/使用opam,也可以使用apt-get安装它,但我更喜欢使用opam来处理ocaml,你可以选择精确的版本......)

好了,你现在已经安装了ocsigen!

创建网页

然后创建一个基本的脚手架网站,运行

eliom-distillery -name mysite -template basic -target-directory mysite

并运行它:

cd mysite/
make test.byte

您应该在localhost上看到一个基本页面:8080 /.

现在,让我们插入您的代码。让我们想象它被命名为myscript并返回一个字符串:

let myscript () = "Here is my amazing result"

在文件let () = 中的mysite.eliom之前添加此代码,然后在h2 [pcdata "Welcome from Eliom's distillery!"];行之后添加:

p [pcdata (Printf.sprintf "My script gives the return function : \"%s\"" (myscript ()))]

这将创建一个paragraphe(p),其内容(pcdata)包含myscritpt的结果。

对我来说整个mysite.eliom给出了:

{shared{
  open Eliom_lib
  open Eliom_content
  open Html5.D
}}

module Mysite_app =
  Eliom_registration.App (
    struct
      let application_name = "mysite"
    end)

let main_service =
  Eliom_service.App.service ~path:[] ~get_params:Eliom_parameter.unit ()

let myscript () = "Here is my amazing result"

let () =
  Mysite_app.register
    ~service:main_service
    (fun () () ->
      Lwt.return
        (Eliom_tools.F.html
           ~title:"mysite"
           ~css:[["css";"mysite.css"]]
           Html5.F.(body [
               h2 [pcdata "Welcome from Eliom's distillery!"];
               p [pcdata (Printf.sprintf "My script gives the return function : \"%s\"" (myscript ()))]
           ])))

(请注意,let application_name = "mysite"必须遵循您向eliom-distillery提供的名称。如果情况并非如此,则您的javascript不会被链接)

让我们再次编译:

make test.byte

现在在localhost:8080,您可以阅读:

My script gives the return function : "Here is my amazing result"

包含了脚本的结果!

更进一步

您还可以定义要在客户端运行的myscript,获取一些Post / Get参数,或者只在几行中实时与页面通信,但如果您想了解更多信息,请阅读ocsigen教程!

与Nginx的接口

我不确定你是否真的需要将它与Nginx接口,因为ocsigenserver应该作为(http)服务器运行,但是如果需要,你总是可以通过使用反向代理将ocsigenserver behing为Nginx服务器(或者相反,你可以从ocsigenserver服务Nginx,阅读ocsigenserver手册了解更多细节)。