Openresty和Tengine基於 Nginx 的兩個衍生版本,某種意義上他們都和淘寶有關係,前者是前淘寶工程師agentzh主導開發的,後者是淘寶的一個開源項目;javascript
Openresty的最大特色是引入了ngx_lua模塊,支持使用lua開發插件;css
Tengine的特色是融入了因淘寶自身的一些業務帶來的新功能;html
tengine官方網站:http://tengine.taobao.org/index_cn.htmljava
在 Nginx官方版本的基礎上增長的一些定製模塊以下:mysql
一、支持動態加載模塊:經過加載so文件實現,不用再從新編譯整個項目了,配置以下:nginx
dso {
load ngx_http_lua_module.so;
load ngx_http_memcached_module.so;
}
二、ngx_proc_daytime_module模塊,這個模塊容許開一個獨立的服務進程,該模塊自己並未實現具體的業務邏輯,而是構建了一個TCP Server框架,等待開發者來實現本身的業務;程序員
三、ngx_http_concat_module模塊,用於合併多個文件的響應;redis
四、ngx_http_upstream_session_sticky_module模塊,該模塊是一個負載均衡模塊,經過cookie實現客戶端與後端服務器的會話保持, 在必定條件下能夠保證同一個客戶端訪問的都是同一個後端服務器。sql
五、ngx_http_upstream_check_module模塊,用於檢查upstream上游服務器的健康情況,以下是一個配置的例子:shell
upstream cluster1 { # simple round-robin server 192.168.0.1:80; server 192.168.0.2:80; check interval=3000 rise=2 fall=5 timeout=1000 type=http; check_http_send "HEAD / HTTP/1.0\r\n\r\n"; check_http_expect_alive http_2xx http_3xx; }
六、trim filter模塊,用於刪除 html,內嵌 javascript 和 css 中的註釋以及重複的空白符,例如:
location / {
trim on;
trim_js on;
trim_css on;
}
七、ngx_http_headers_module模塊,支持根據Content-Type來設置過時時間,例如:
expires_by_types 24h text/html; expires_by_types modified +24h text/xml; expires_by_types @15h30m text/xml; expires_by_types 0 text/xml; expires_by_types -1 text/xml; expires_by_types epoch text/xml;
八、ngx_http_limit_req_module模塊,限制訪問
九、擴展了ngx_http_log_module模塊,支持syslog和pipe;
openresty官方網站:http://openresty.org/cn/index.html
agentzh本身對openresty的介紹:http://blog.zoomquiet.org/pyblosxom/oss/openresty-intro-2012-03-06-01-13.html
agentzh(章亦春)的openresty開源項目(基於nginx),經過各類插件、模塊,極大的擴展了nginx能幹的事情,而lua擴展更是能夠用來定製很是複雜的業務邏輯。做者給nginx賦予的這些新的特性,使openresty在業務開發上變得更加簡單,對程序員更加友好,開發者能夠在不須要對nginx源碼熟悉的狀況下就直接使用一些高級特性,好比並發subrequest、dns異步解析、對第三方數據庫(如mysql、redis、memcached)等的訪問。
先簡單看一下openresty擴展的模塊:
瀏覽一下上述模塊,有幾個特色:
一、經過upstream機制已經能夠支持對mysql、redis、postgreSQL、memcached 等數據庫的訪問(全都是異步無阻塞的);
二、跟lua擴展有關的模塊,提供給lua腳本調用的庫,api很是豐富,涉及各類的操做;
ngx_lua模塊的原理:
一、每一個worker(工做進程)建立一個Lua VM,worker內全部協程共享VM;
二、將Nginx I/O原語封裝後注入 Lua VM,容許Lua代碼直接訪問;
三、每一個外部請求都由一個Lua協程處理,協程之間數據隔離;
四、Lua代碼調用I/O操做等異步接口時,會掛起當前協程(並保護上下文數據),而不阻塞worker;
五、I/O等異步操做完成時還原相關協程上下文數據,並繼續運行;
ngx_lua 模塊提供的指令和API等:
指令名稱 | 說明 |
lua_use_default_type | 是否使用default_type指令定義的Content-Type默認值 |
lua_code_cache | *_by_lua_file文件是否cache |
lua_regex_cache_max_entries | |
lua_regex_match_limit | |
lua_package_path | 用Lua寫的lua外部庫路徑(.lua文件) |
lua_package_cpath | 用C寫的lua外部庫路徑(.so文件) |
init_by_lua | master進程啓動時掛載的lua代碼 |
init_by_lua_file | |
init_worker_by_lua | worker進程啓動時掛載的lua代碼,經常使用來執行一些定時器任務 |
init_worker_by_lua_file | |
set_by_lua | 設置變量 |
set_by_lua_file | |
content_by_lua | handler模塊 |
content_by_lua_file | |
rewrite_by_lua | |
rewrite_by_lua_file | |
access_by_lua | |
access_by_lua_file | |
header_filter_by_lua | header filter模塊 |
header_filter_by_lua_file | |
body_filter_by_lua | body filter模塊,ngx.arg[1]表明輸入的chunk,ngx.arg[2]表明當前chunk是否爲last |
body_filter_by_lua_file | |
log_by_lua | |
log_by_lua_file | |
lua_need_request_body | 是否讀請求體,跟ngx.req.read_body()函數做用相似 |
lua_shared_dict | 建立全局共享的table(多個worker進程共享) |
lua_socket_connect_timeout | TCP/unix 域socket對象connect方法的超時時間 |
lua_socket_send_timeout | TCP/unix 域socket對象send方法的超時時間 |
lua_socket_send_lowat | 設置cosocket send buffer的low water值 |
lua_socket_read_timeout | TCP/unix 域socket對象receive方法的超時時間 |
lua_socket_buffer_size | cosocket讀buffer大小 |
lua_socket_pool_size | cosocket鏈接池大小 |
lua_socket_keepalive_timeout | cosocket長鏈接超時時間 |
lua_socket_log_errors | 是否打開cosocket錯誤日誌 |
lua_ssl_ciphers | |
lua_ssl_crl | |
lua_ssl_protocols | |
lua_ssl_trusted_certificate | |
lua_ssl_verify_depth | |
lua_http10_buffering | |
rewrite_by_lua_no_postpone | |
lua_transform_underscores_in_response_headers | |
lua_check_client_abort | 是否監視client提早關閉請求的事件,若是打開監視,會調用ngx.on_abort()註冊的回調 |
lua_max_pending_timers | |
lua_max_running_timers |
table | 說明 |
ngx.arg | 指令參數,如跟在content_by_lua_file後面的參數 |
ngx.var | 變量,ngx.var.VARIABLE引用某個變量 |
ngx.ctx | 請求的lua上下文 |
ngx.header | 響應頭,ngx.header.HEADER引用某個頭 |
ngx.status | 響應碼 |
API | 說明 |
ngx.log | 輸出到error.log |
等價於 ngx.log(ngx.NOTICE, ...) | |
ngx.send_headers | 發送響應頭 |
ngx.headers_sent | 響應頭是否已發送 |
ngx.resp.get_headers | 獲取響應頭 |
ngx.timer.at | 註冊定時器事件 |
ngx.is_subrequest | 當前請求是不是子請求 |
ngx.location.capture | 發佈一個子請求 |
ngx.location.capture_multi | 發佈多個子請求 |
ngx.exec | |
ngx.redirect | |
ngx.print | 輸出響應 |
ngx.say | 輸出響應,自動添加'\n' |
ngx.flush | 刷新響應 |
ngx.exit | 結束請求 |
ngx.eof | |
ngx.sleep | 無阻塞的休眠(使用定時器實現) |
ngx.get_phase | |
ngx.on_abort | 註冊client斷開請求時的回調函數 |
ndk.set_var.DIRECTIVE | |
ngx.req.start_time | 請求的開始時間 |
ngx.req.http_version | 請求的HTTP版本號 |
ngx.req.raw_header | 請求頭(包括請求行) |
ngx.req.get_method | 請求方法 |
ngx.req.set_method | 請求方法重載 |
ngx.req.set_uri | 請求URL重寫 |
ngx.req.set_uri_args | |
ngx.req.get_uri_args | 獲取請求參數 |
ngx.req.get_post_args | 獲取請求表單 |
ngx.req.get_headers | 獲取請求頭 |
ngx.req.set_header | |
ngx.req.clear_header | |
ngx.req.read_body | 讀取請求體 |
ngx.req.discard_body | 扔掉請求體 |
ngx.req.get_body_data | |
ngx.req.get_body_file | |
ngx.req.set_body_data | |
ngx.req.set_body_file | |
ngx.req.init_body | |
ngx.req.append_body | |
ngx.req.finish_body | |
ngx.req.socket | |
ngx.escape_uri | 字符串的url編碼 |
ngx.unescape_uri | 字符串url解碼 |
ngx.encode_args | 將table編碼爲一個參數字符串 |
ngx.decode_args | 將參數字符串編碼爲一個table |
ngx.encode_base64 | 字符串的base64編碼 |
ngx.decode_base64 | 字符串的base64解碼 |
ngx.crc32_short | 字符串的crs32_short哈希 |
ngx.crc32_long | 字符串的crs32_long哈希 |
ngx.hmac_sha1 | 字符串的hmac_sha1哈希 |
ngx.md5 | 返回16進制MD5 |
ngx.md5_bin | 返回2進制MD5 |
ngx.sha1_bin | 返回2進制sha1哈希值 |
ngx.quote_sql_str | SQL語句轉義 |
ngx.today | 返回當前日期 |
ngx.time | 返回UNIX時間戳 |
ngx.now | 返回當前時間 |
ngx.update_time | 刷新時間後再返回 |
ngx.localtime | |
ngx.utctime | |
ngx.cookie_time | 返回的時間可用於cookie值 |
ngx.http_time | 返回的時間可用於HTTP頭 |
ngx.parse_http_time | 解析HTTP頭的時間 |
ngx.re.match | |
ngx.re.find | |
ngx.re.gmatch | |
ngx.re.sub | |
ngx.re.gsub | |
ngx.shared.DICT | |
ngx.shared.DICT.get | |
ngx.shared.DICT.get_stale | |
ngx.shared.DICT.set | |
ngx.shared.DICT.safe_set | |
ngx.shared.DICT.add | |
ngx.shared.DICT.safe_add | |
ngx.shared.DICT.replace | |
ngx.shared.DICT.delete | |
ngx.shared.DICT.incr | |
ngx.shared.DICT.flush_all | |
ngx.shared.DICT.flush_expired | |
ngx.shared.DICT.get_keys | |
ngx.socket.udp | |
udpsock:setpeername | |
udpsock:send | |
udpsock:receive | |
udpsock:close | |
udpsock:settimeout | |
ngx.socket.tcp | |
tcpsock:connect | |
tcpsock:sslhandshake | |
tcpsock:send | |
tcpsock:receive | |
tcpsock:receiveuntil | |
tcpsock:close | |
tcpsock:settimeout | |
tcpsock:setoption | |
tcpsock:setkeepalive | |
tcpsock:getreusedtimes | |
ngx.socket.connect | |
ngx.thread.spawn | |
ngx.thread.wait | |
ngx.thread.kill | |
coroutine.create | |
coroutine.resume | |
coroutine.yield | |
coroutine.wrap | |
coroutine.running | |
coroutine.status | |
ngx.config.debug | 編譯時是否有 --with-debug選項 |
ngx.config.prefix | 編譯時的 --prefix選項 |
ngx.config.nginx_version | 返回nginx版本號 |
ngx.config.nginx_configure | 返回編譯時 ./configure的命令行選項 |
ngx.config.ngx_lua_version | 返回ngx_lua模塊版本號 |
ngx.worker.exiting | 當前worker進程是否正在關閉(如reload、shutdown期間) |
ngx.worker.pid | 返回當前worker進程的pid |
常量 | 說明 |
Core constants | ngx.OK (0) ngx.ERROR (-1) ngx.AGAIN (-2) ngx.DONE (-4) ngx.DECLINED (-5) ngx.nil |
HTTP method constants | ngx.HTTP_GET ngx.HTTP_HEAD ngx.HTTP_PUT ngx.HTTP_POST ngx.HTTP_DELETE ngx.HTTP_OPTIONS ngx.HTTP_MKCOL ngx.HTTP_COPY ngx.HTTP_MOVE ngx.HTTP_PROPFIND ngx.HTTP_PROPPATCH ngx.HTTP_LOCK ngx.HTTP_UNLOCK ngx.HTTP_PATCH ngx.HTTP_TRACE |
HTTP status constants | ngx.HTTP_OK (200) ngx.HTTP_CREATED (201) ngx.HTTP_SPECIAL_RESPONSE (300) ngx.HTTP_MOVED_PERMANENTLY (301) ngx.HTTP_MOVED_TEMPORARILY (302) ngx.HTTP_SEE_OTHER (303) ngx.HTTP_NOT_MODIFIED (304) ngx.HTTP_BAD_REQUEST (400) ngx.HTTP_UNAUTHORIZED (401) ngx.HTTP_FORBIDDEN (403) ngx.HTTP_NOT_FOUND (404) ngx.HTTP_NOT_ALLOWED (405) ngx.HTTP_GONE (410) ngx.HTTP_INTERNAL_SERVER_ERROR (500) ngx.HTTP_METHOD_NOT_IMPLEMENTED (501) ngx.HTTP_SERVICE_UNAVAILABLE (503) ngx.HTTP_GATEWAY_TIMEOUT (504) |
Nginx log level constants | ngx.STDERR ngx.EMERG ngx.ALERT ngx.CRIT ngx.ERR ngx.WARN ngx.NOTICE ngx.INFO ngx.DEBUG |