Features
All features of nginx(latest release) are inherited, i.e., it is 100% compatible with nginx.
Web development using python, c++, lua, php7, java , quickjs
Dependency
linux
gcc and g++(c++11) or clang and clang++
python-devel,if --enable-http-hi-python=YES and with-http-hi-python-version=python2
python3.x-devel if --enable-http-hi-python=YES and with-http-hi-python-version=python3(or python3-embed)
lua-devel(lua5.x),if --enable-http-hi-lua=YES and --with-http-hi-lua-version=lua5.x
luajit-devel,if --enable-http-hi-lua=YES and --with-http-hi-lua-version=luajit
jdk 8+,if --enable-http-hi-java=YES
PHP 7.0,7.1, 7.2,7.3(--enable-embed=shared),if --enable-http-hi-php=YES
Installation
./configure --help or see install_demo.sh or
--enable-http-hi-cpp=YES \
--enable-http-hi-python=NO \
--enable-http-hi-lua=NO \
--enable-http-hi-qjs=NO \
--enable-http-hi-java=NO \
--enable-http-hi-php=NO \
--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
python, lua api
hi_req
uri
method
client
param
user_agent
has_header
get_header
has_form
get_form
has_session
get_session
has_cookie
get_cookie
has_cache
get_cache
hi_res
status
content
header
session
cache
quickjs api
hi
uri
method
client
param
user_agent
has_header
get_header
has_form
get_form
has_session
get_session
has_cookie
get_cookie
has_cache
get_cache
status
content
header
session
cache
hello,world
cpp servlet class
#include "servlet.hpp"
namespace hi{
class hello : public servlet {
public:
void handler(request& req, response& res) {
res.headers.find("Content-Type")->second = "text/plain;charset=UTF-8";
res.content = "hello,world";
res.status = 200;
}
};
}
extern "C" hi::servlet* create() {
return new hi::hello();
}
extern "C" void destroy(hi::servlet* p) {
delete p;
}
cpp compile
g++ -std=c++11 -I/usr/local/nginx/include -shared -fPIC hello.cpp -o hello.so
install hello.so /usr/local/nginx/cpp
java servlet class
package hi;
import hi.servlet;
import hi.request;
import hi.response;
public class jhello implements hi.servlet {
public jhello() {
}
public void handler(hi.request req, hi.response res) {
res.status = 200;
res.content = "hello,world";
}
}
php servlet class
see php/hi/request.php,php/hi/response.php and php/hi/servlet.php
require_once 'hi/servlet.php';
require_once 'hi/route.php';
class index implements \hi\servlet {
public function handler(\hi\request $req, \hi\response $res) {
$app = \hi\route::get_instance();
$app->add('{^/$}', array('GET'), function ($rq, $rs, &$param) {
$rs->content = 'hello,world';
$rs->status = 200;
});
$app->add('{^/who/(?P\w+)/?$}', array('GET'), function ($rq, $rs, &$param) {
$rs->content = 'hello,'.$param['name'];
$rs->status = 200;
});
$app->run($req, $res);
}
}
quickjs
import * as hi from "hi";
hi.header('Content-Type','text/plain;charset=UTF-8')
hi.content('hello,world')
hi.status(200)
python
hi_res.status(200)
hi_res.content("hello,world")
example
lua
hi_res:status(200)
hi_res:content("hello,world")
3rd party module
nginx-push-stream-module
ngx_http_concat_module
ngx_http_footer_filter_module
ngx_http_trim_filter_module
ngx_slab_stat
ngx_http_hi_module directives
directives : content: loc,if in loc
hi,default: ""
example:
location = /hello {
hi cpp/hello.so ;
}
directives : content: http,srv,loc,if in loc ,if in srv
hi_need_tokens,default: on
example:
hi_need_tokens on|off;
directives : content: http,srv,loc,if in loc ,if in srv
hi_cache_method,default: GET
example:
hi_cache_method GET|POST|PUT|HEAD;
directives : content: http,srv,loc,if in loc ,if in srv
hi_need_cache,default: on
example:
hi_need_cache on|off;
directives : content: http,srv,loc,if in loc ,if in srv
hi_cache_size,default: 10
example:
hi_cache_size 10;
directives : content: http,srv,loc,if in loc ,if in srv
hi_cache_expires,default: 300s
example:
hi_cache_expires 300s;
directives : content: http,srv,loc,if in loc ,if in srv
hi_need_kvdb,default: off
example:
hi_need_kvdb on|off;
directives : content: http,srv,loc,if in loc ,if in srv
hi_kvdb_size,default: 10
example:
hi_kvdb_size 10;
directives : content: http,srv,loc,if in loc ,if in srv
hi_kvdb_expires,default: 300s
example:
hi_kvdb_expires 300s;
directives : content: http,srv,loc,if in loc ,if in srv
hi_need_headers,default: off
example:
hi_need_headers on|off;
directives : content: http,srv,loc,if in loc ,if in srv
hi_need_cookies,default: off
example:
hi_need_cookies on|off;
directives : content: http,srv,loc,if in loc ,if in srv
hi_need_session,default: off
example:
hi_need_session on|off;
directives : content: http,srv,loc,if in loc ,if in srv
hi_session_expires,default: 300s
example:
hi_session_expires 300s;
directives : content: loc,if in loc
hi_python_content,default: ""
example:
location = /pyecho {
hi_python_content "hi_res.status(200)\nhi_res.content('hello,world')" ;
}
directives : content: loc,if in loc
hi_python_script,default: ""
example:
location ~ \.py$ {
hi_python_script python;
}
or
location / {
hi_python_script python/index.py;
}
directives : content: http,srv,if in srv
hi_lua_package_path,default: ""
example:
hi_lua_package_path '/usr/local/nginx/lua/?.lua;';
directives : content: http,srv,if in srv
hi_lua_package_cpath,default: ""
example:
hi_lua_package_cpath '/usr/local/nginx/lua/?.so;';
directives : content: loc,if in loc
hi_lua_content,default: ""
example:
location = /luaecho {
hi_lua_content "hi_res:status(200)\nhi_res:content('hello,world')" ;
}
directives : content: loc,if in loc
hi_lua_script,default: ""
example:
location ~ \.lua$ {
hi_lua_script lua;
}
or
location / {
hi_lua_script lua/index.lua;
}
directives : content: http,srv,if in srv
hi_java_classpath,default:"-Djava.class.path=."
example:
hi_java_classpath "-Djava.class.path=.:/usr/local/nginx/java:/usr/local/nginx/java/hi-nginx-java.jar";
directives : content: http,srv,if in srv
hi_java_options,default:"-server -d64 -Xmx1G -Xms1G -Xmn256m"
example:
hi_java_options "-server -d64 -Xmx3G -Xms3G -Xmn768m -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseNUMA -XX:+CMSParallelRemarkEnabled -XX:MaxTenuringThreshold=15 -XX:MaxGCPauseMillis=30 -XX:GCPauseIntervalMillis=150 -XX:+UseAdaptiveGCBoundary -XX:-UseGCOverheadLimit -XX:+UseBiasedLocking -XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=15 -Dfml.ignorePatchDiscrepancies=true -Dfml.ignoreInvalidMinecraftCertificates=true -XX:+UseFastAccessorMethods -XX:+UseCompressedOops -XX:+OptimizeStringConcat -XX:+AggressiveOpts -XX:ReservedCodeCacheSize=2048m -XX:+UseCodeCacheFlushing -XX:SoftRefLRUPolicyMSPerMB=10000 -XX:ParallelGCThreads=10";
directives : content: loc,if in loc
hi_java_servlet,default:""
example:
hi_java_servlet hi/jhello;
directives : content : http,srv,loc,if in loc ,if in srv
hi_java_servlet_cache_expires,default:300s
example:
hi_java_servlet_cache_expires 300s;
directives : content : http,srv,loc,if in loc ,if in srv
hi_java_servlet_cache_size,default:10
example:
hi_java_servlet_cache_size 10;
directives : content: http,srv,if in srv
hi_java_version,default:8
example:
hi_java_version 8;
directives : content: loc,if in loc
hi_php_script,default: ""
example:
location ~ \.php$ {
hi_php_script php;
}
or
location / {
hi_php_script php/index.php;
}
directives : content: loc,if in loc
hi_qjs_script,default: ""
example:
location ~ \.js$ {
hi_qjs_script qjs;
}
or
location / {
hi_qjs_script qjs/index.js;
}
directives : content: http,srv,if in srv
hi_qjs_memory_limit ,default: 1024m
example:
hi_qjs_memory_limit 1024m;
directives : content: http,srv,if in srv
hi_qjs_stack_limit ,default: 8m
example:
hi_qjs_stack_limit 8m;
directives : content: http,srv,if in srv
hi_qjs_ctx_called_limit,default: 10240
example:
hi_qjs_ctx_called_limit 10240;
directives : content: loc if in loc
hi_subrequest, default : ""
example:
location ^~ /sub {
hi_subrequest '/query';
hi_lua_content 'hi_res:header("Content-Type",hi_req:get_form("__subrequest_content_type__"))\nhi_res:status(tonumber(hi_req:get_form("__subrequest_status__")))\nhi_res:content(hi_req:get_form("__subrequest_body__"))';
}
location ^~ /query {
internal;
proxy_pass http://http://hq.sinajs.cn/;
proxy_set_header Accept-Encoding '';
}
# curl -i http://localhost/sub?list=sh601006
ngx_http_autoblacklist_module directives
directives : content: http,srv,loc,if in loc ,if in srv
autoblacklist, default : "off"
autoblacklist_size, default : 1024
autoblacklist_limit, default : 30
autoblacklist_expires, default : 86400s
example:
autoblacklist on|off;
autoblacklist_size 1024;
autoblacklist_expires 86400s;
autoblacklist_limit 30;
nginx.conf