安装

一般说明

安装hi-nginx的方式,就是编译安装nginx的方式。只是多个几个配置选项:

                --enable-http-hi-cpp=YES                            \
                --enable-http-hi-python=YES                         \
                --enable-http-hi-lua=YES                            \
                --enable-http-hi-duktape=YES                        \
                --enable-http-hi-java=YES                           \
                --enable-http-hi-php=YES                            \
                --with-http-hi-python-version=python3               \
                --with-http-hi-lua-version=lua5.3                   \
                --add-module=module/ngx_http_hi_module              \
                --add-module=module/ngx_autoblacklist_module

除c++外,均为可选的。所有语言支持均由模块ngx_http_hi_module提供。因此,必须通过--add-module添加该模块。

不需要哪种语言,就把相关enable项设置为NO。

同时,对于lua和python来说,它们还可以选择支持的版本。对lua而言,可选lua,lua5.x或者luajit。对python而言,可选python2或者python3。

依赖

  • linux,hi-nginx暂不支持windows系统
  • gcc 和 g++(c++11) 或者 clang 和 clang++
  • python-devel,如果 --enable-http-hi-python=YES 并且 with-http-hi-python-version=python2
  • python3.x-devel 如果 --enable-http-hi-python=YES 并且 with-http-hi-python-version=python3
  • lua-devel(lua5.1,5.2,5.3),如果 --enable-http-hi-lua=YES 并且 --with-http-hi-lua-version=lua5.x
  • luajit-devel,如果 --enable-http-hi-lua=YES 并且 --with-http-hi-lua-version=luajit
  • jdk,如果 --enable-http-hi-java=YES
  • PHP 7.0,7.1,7.2(--enable-embed=shared),如果 --enable-http-hi-php=YES

systemctl

安装后,systemctl enable nginxsystemctl start nginx

这是保证启动目录正确,从而配置时保证相对路径有效的最简单的方法。

关于php7支持

要安装php7支持,需要编译安装php7时添加--enable-embed=shared配置选项。这是必须的。

另外,如果是7.0和7.1,似乎需要把php7源码包中configure脚本需要略略的修改下。找到该脚本中的以下段落:

ac_fn_c_check_decl "$LINENO" "isfinite" "ac_cv_have_decl_isfinite" "#include <math.h>
"
if test "x$ac_cv_have_decl_isfinite" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

把第一等于1的等式改为等于0即可。

7.2不需要上述修改。

编译安装完成php7后,配置下php.ini文件,假设hi-nginx将安装在/usr/local


include_path = ".:/usr/local/nginx/php"

如果hi-nginx将安装在其他地方,需要相应地修改下上面的值。

如果有必要,还需把libphp7.so所在的路径添加到/etc/ld.so.conf.d/php.conf中。

关于java支持

强烈建议使用java版本不低于 1.8。

最简单方法是直接安装openjdk-devel,如果不怕麻烦,用oracle的也可以的。关键是设置$JAVA_HOME和java搜索路径,否则编译hi-nginx时无法找到相关java库和头文件。可以在/etc/ld.so.conf.d下新建一个文件java.conf,

  • 对9以下版本,内容如下:

          $JAVA_HOME/lib/
          $JAVA_HOME/lib/server
          $JAVA_HOME/lib/amd64/server
    
  • 对9版本,内容如下:
          $JAVA_HOME/jre/lib/amd64/server
    
    上面的$JAVA_HOME变量务必替换为该变量的真实值。总之,需要将libjvm.so所在的目录加入链接搜索路径。然后记得sudo ldconfig

关于javascript支持

hi-nginx对javascript的支持方案有两种。

第一种基于java,第二种基于duktape。前者比较吃内存,但能方便嵌入java库类。 后者很轻,采用c/c++语言实现,故而对熟悉c/c++的开发者更有利。

基于Java的方案

hi-nginx对javascript的支持是通过javax.script.ScriptEngine实现的。这种实现有两种方式,第一种是在java层,第二种是走jni。两种都是可行的。在hi-nginx-demo项目中,我给出了一个基于java层的简单实现。在hi-nginx项目中采用的基于jni实现。这种实现的好处是能够充分利用c/c++的优势降低JVM对内存的消耗,而且可以获得更高的性能表现。

更重要的是,因为可以利用javax.script.ScriptEngine接口,所以任何实现JSR-223的基于JVM的脚本语言,都是可以直接支持的,例如groovy和kotlin——当然需要安装相关语言并正确设置配置。比如gooovy:


        hi_java_classpath "-Djava.class.path=.:/usr/local/nginx/java:/usr/local/nginx/java/hi-nginx-java.jar:/usr/local/groovy-2.5.0/lib:/usr/local/groovy-2.5.0/lib/groovy-2.5.0.jar:/usr/local/groovy-2.5.0/lib/groovy-jsr223-2.5.0.jar";

        location / {
                hi_need_cache off;
                hi_cache_expires 5s;
                hi_need_kvdb on;
                hi_kvdb_size 10;
                hi_kvdb_expires 5m;
                hi_need_cookies on;
                hi_need_headers on;
                hi_need_session on;
                hi_session_expires 300s;
                hi_javascript_compiledscript_expires 5m;
                hi_javascript_lang groovy;
                hi_javascript_extension groovy;
                hi_javascript_script groovy/index.groovy;
                #hi_javascript_content "hi_res.content='hello,world.';hi_res.status=200";
        }

有一点必须指出:如果你需要运行多种jsr-223的JVM语言,比如javascript和groovy,那么由于JVM是进程级的,每个进程只有一个JVM,且只会初始化一次,所以为了确保多种JVM语言能够同时运行,需要确保JVM初始化时的hi_java_classpath指令参数能够同时为多种语言所用。比如,单单运行javascript,不需要跟groovy有关的配置,但是若同时需要运行groovy,则需要添加相关配置。

由于java本身对javascript的良好支持,使得在hi-nginx中,可以直接在javascript脚本中使用java——相当于把java嵌入了javascript。

基于duktape的方案

该方案基于开源javascript引擎。如果熟悉该引擎的api,开发C/C++扩展是很容易的。在用法上,它类似于lua。

该方案支持动态库加载,可以在动态库中注册c函数以及c++函数和类。例如:


#include <string>
#include <dukglue/dukglue.h>
#include <dukglue/duktape.h>
#include <dukglue/duktape_object.hpp>


class demo : public hi::duktape_object {
public:
    demo() = default;
    virtual~demo() = default;

    std::string echo(const std::string& text) {
        return text;
    }

    static bool loaded;
};

bool demo::loaded = false;

#ifdef __cplusplus
extern "C" {
#endif

    duk_ret_t cpp(duk_context *ctx) {
        if (!demo::loaded) {
            dukglue_register_constructor<demo>(ctx, "demo");
            dukglue_register_method(ctx, &demo::echo, "echo");
            demo::loaded = true;
        }
        if (demo::loaded) {
            duk_push_true(ctx);
        } else {
            duk_push_false(ctx);
        }
        return 1; /* one return value */
    }

#ifdef __cplusplus
}
#endif


PROJECT=demo.so
SRC=$(shell find . -type f | egrep *.cpp$$)
OBJ=$(patsubst %.cpp,%.o,$(SRC))

ifndef NGINX_INSTALL_DIR
NGINX_INSTALL_DIR=/usr/local/nginx
endif

CXX=g++ 
CXXFLAGS+=-O3 -std=c++11 -fPIC -Wall -I$(NGINX_INSTALL_DIR)/include
LDLIBS+=-lduktape
LDFLAGS+=-shared 

all:$(PROJECT)

$(PROJECT): $(OBJ)
    $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS) 

clean:
    rm -f  $(OBJ) $(PROJECT)

install:
    test -d $(NGINX_INSTALL_DIR)/duktape/package || mkdir -p $(NGINX_INSTALL_DIR)/duktape/package
    install $(PROJECT) $(NGINX_INSTALL_DIR)/duktape/package

var loaded = hi_module.require('demo', 'cpp')
var registered = cpp()
if (loaded && registered) {
    var a = new demo()
    hi_res.header('Content-Type', 'text/plain;charset=UTF-8')
    hi_res.content(a.echo('hello,cpp class'))
    hi_res.status(200)
    hi_module.free(a)
}

关于第三方模块

hi-nginx自带两个第三方模块,在3rd目录中,需要的话,用--add-module=3rd/[module_name]添加到编译配置命令中即可。

如果需要更多第三方模块,可以自行下载需要的模块。其实,很多常用的第三方模块都可以在这里这里找到。各取所需吧,建议统一放在3rd目录中——凡nginx能接受的,hi-nginx必能接受。

results matching ""

    No results matching ""