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

Libraries and samples to deploy an OCaml application to an Nginx server

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

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

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

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

谁能告诉我哪个库稳定且适合我的需要?

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

我不认为我提出的解决方案是较轻的,但它有几个优点:

  • 它允许您在 Ocaml 中生成网站,这样您的代码的界面就不会太难了
  • 如果需要,您将能够直接在 Javascript 中导出整个应用程序:您不会让您的服务器执行用户可以执行的无用计算,而且您不需要重写您的Javascript 中的代码,Ocsigen 可以为您转换代码
  • 如果某些操作需要由服务器执行,您可以真正轻松地从客户端代码调用服务器端功能,并且您的所有代码都将用 Ocaml 编写。
  • 很简单

这是什么神奇的工具?奥西根!您可以找到完整的教程 here.

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

安装 Ocsigen

首先,如果您没有,请安装 opam(它将允许您安装 ocaml 包)。按照网站上的说明进行即可(我无法粘贴 link 因为我没有足够的信誉点),但基本上 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

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

大功告成,您现在已经安装了 ocsigen!

创建网页

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

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

然后运行它:

cd mysite/
make test.byte

您应该会在 localhost:8080/.

看到一个基本页面

现在,让我们插入您的代码。假设它被命名为 myscript 和 return 一个字符串:

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

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

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

这将创建一个段落 (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 将不会 linked)

让我们再次编译:

make test.byte

现在 localhost:8080 您可以阅读:

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

脚本的结果已包含在内!

更进一步

你也可以在client端定义myscript为运行,带一些Post/Get参数,或者只需要几行就可以和页面实时通信,但是如果你想学习有关更多信息,请阅读 ocsigen 教程!

与 Nginx 的接口

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