Openresty 與 Tengine

Openresty 與 Tengine

 

Openresty和Tengine基於 Nginx 的兩個衍生版本,某種意義上他們都和淘寶有關係,前者是前淘寶工程師agentzh主導開發的,後者是淘寶的一個開源項目;javascript

Openresty的最大特色是引入了ngx_lua模塊,支持使用lua開發插件;css

Tengine的特色是融入了因淘寶自身的一些業務帶來的新功能;html

 

Tengine 簡介

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 簡介

 

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擴展的模塊:

 

 

  • LuaJIT                                       luaJIT解釋器
  • StandardLuaInterpreter               標準lua解釋器
  • LuaCjsonLibrary                          json庫
  • LuaNginxModule                       lua接口庫 (該模塊自己用C實現)
  • LuaRdsParserLibrary                   rds格式解析
  • LuaRedisParserLibrary                 redis響應解析庫
  • LuaRestyCoreLibrary                   LuaNginxModule模塊的lua實現
  • LuaRestyDNSLibrary                   dns解析庫
  • LuaRestyLockLibrary                
  • LuaRestyLrucacheLibrary             LRU cache庫
  • LuaRestyMemcachedLibrary     memcached訪問接口
  • LuaRestyMySQLLibrary                mysql訪問接口
  • LuaRestyRedisLibrary                  redis訪問接口
  • LuaRestyStringLibrary                 一些hash函數的接口
  • LuaRestyUploadLibrary              
  • LuaRestyUpstreamHealthcheckLibrary
  • LuaRestyWebSocketLibrary           ws協議解析庫
  • LuaUpstreamNginxModule             擴展了對upstream的支持    

 

 

瀏覽一下上述模塊,有幾個特色:

一、經過upstream機制已經能夠支持對mysql、redis、postgreSQL、memcached 等數據庫的訪問(全都是異步無阻塞的);

二、跟lua擴展有關的模塊,提供給lua腳本調用的庫,api很是豐富,涉及各類的操做;

 


 

ngx_lua 模塊

 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
print 等價於 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
相關文章
相關標籤/搜索