openresty開發系列10--openresty的簡單介紹及安裝
1、Nginx優勢
十幾年前,互聯網沒有這麼火,軟件外包開發,信息化建設,幫助企業作無紙化辦公,收銀系統,工廠erp,c/s架構偏多
Nginx設計爲一個主進程多個工做進程的工做模式,每一個進程是單線程來處理多個鏈接,並且每一個工做進程採用了非阻塞I/O來處理多個鏈接,從而減小了線程上下文切換,從而實現了公認的高性能、高併發;所以在生成環境中會經過把CPU綁定給Nginx工做進程從而提高其性能;另外由於單線程工做模式的特色,內存佔用很是少
Nginx更改配置重啓速度很是快,能夠毫秒級,並且支持不中止Nginx進行升級Nginx版本、動態重載Nginx配置。
Nginx模塊也是很是多,功能也很強勁,不只能夠做爲http負載均衡,Nginx發佈1.9.0版本還支持TCP負載均衡,還能夠很容易的實現內容緩存、web服務器、反向代理、訪問控制等功能。
nginx模塊:rewrite 常常用到的,
2、什麼是ngx_lua
ngx_lua是Nginx的一個模塊,將Lua嵌入到Nginx中,從而可使用Lua來編寫腳本,這樣就可使用Lua編寫應用腳本,部署到Nginx中運行,即Nginx變成了一個Web容器;這樣開發人員就可使用Lua語言開發高性能Web應用了。
網站開發,也有一個重要的腳步語言,javascript,js文件;;;客戶端腳步語言;;;(node.js服務器語言)
網站頁面進行渲染的時候,能夠經過javascript腳本語言 進行一些業務處理
<script>
function hello(){
alert("hello");
}
</script>
腳本文件,還須要一個javascript引擎---解析javascript腳本語言
所有的瀏覽器 都包含 javascript引擎
lua -- javascript 同樣的腳本語言
lua腳本語言 應用 ----> 遊戲開發中
Lua是一種輕量級、可嵌入式的腳本語言,這樣能夠很是容易的嵌入到其餘語言中使用。另外Lua提供了協程併發,即以同步調用的方式進行異步執行,從而實現併發,比起回調機制的併發來講代碼更容易編寫和理解,排查問題也會容易。Lua還提供了閉包機制,函數能夠做爲First Class Value 進行參數傳遞,另外其實現了標記清除垃圾收集。
由於Lua的小巧輕量級,能夠在Nginx中嵌入Lua VM,請求的時候建立一個VM,請求結束的時候回收VM。
ngx_lua模塊的原理:
ngx_lua將Lua嵌入Nginx,可以讓Nginx運行Lua腳本,並且高併發、非堵塞的處理各類請求。Lua內建協程。這樣就可以很是好的將異步回調轉換成順序調用的形式。ngx_lua在Lua中進行的IO操做都會託付給Nginx的事件模型。從而實現非堵塞調用。開發人員可以採用串行的方式編寫代碼,ngx_lua會本身主動的在進行堵塞的IO操做時中斷。保存上下文;而後將IO操做託付給Nginx事件處理機制。在IO操做完畢後,ngx_lua會恢復上下文,程序繼續運行,這些操做都是對用戶程序透明的。
每個NginxWorker進程持有一個Lua解釋器或者LuaJIT實例,被這個Worker處理的所有請求共享這個實例。
每個請求的Context會被Lua輕量級的協程切割,從而保證各個請求是獨立的。 ngx_lua採用"one-coroutine-per-request"的處理模型。對於每個用戶請求,ngx_lua會喚醒一個協程用於執行用戶代碼處理請求,當請求處理完畢這個協程會被銷燬。
每個協程都有一個獨立的全局環境(變量空間),繼承於全局共享的、僅僅讀的"comman data"。因此。被用戶代碼注入全局空間的不論什麼變量都不會影響其它請求的處理。並且這些變量在請求處理完畢後會被釋放,這樣就保證所有的用戶代碼都執行在一個"sandbox"(沙箱),這個沙箱與請求具備一樣的生命週期。 得益於Lua協程的支持。ngx_lua在處理10000個併發請求時僅僅需要很是少的內存。依據測試,ngx_lua處理每個請求僅僅需要2KB的內存,假設使用LuaJIT則會更少。因此ngx_lua很是適合用於實現可擴展的、高併發的服務。
ngx_lua 模塊提供的指令和API
3、ngx_lua安裝
echo模塊
ngx_lua安裝可以經過下載模塊源代碼,編譯Nginx。但是推薦採用openresty。Openresty就是一個打包程序,包括大量的第三方Nginx模塊,比方HttpLuaModule,HttpRedis2Module,HttpEchoModule等。省去下載模塊。並且安裝很方便。
OpenResty將Nginx核心、LuaJIT、許多有用的Lua庫和Nginx第三方模塊打包在一塊兒;這樣開發人員只須要安裝OpenResty,不須要了解Nginx核心和寫複雜的C/C++模塊就能夠,只須要使用Lua語言進行Web應用開發了。
OpenResty提供了一些經常使用的ngx_lua開發模塊:如
lua-resty-memcached
lua-resty-mysql
lua-resty-redis
lua-resty-dns
lua-resty-limit-traffic
lua-resty-template
nginx + lua 就能夠開發出 一些系統
這些模塊涉及到如mysql數據庫、redis、限流、模塊渲染等經常使用功能組件;另外也有不少第三方的ngx_lua組件供咱們使用,對於大部分應用場景來講如今生態環境中的組件已經足夠多了;若是不知足需求也能夠本身去寫來完成本身的需求。
openresty.org/cn官網
應用場景
應用的公司:奇虎360、京東、百度、魅族、知乎、優酷、新浪這些互聯網公司都在使用。
業務場景: WAF、有作 CDN 調度、廣告系統、消息推送系統,API server 網關
3、openresty的下載及安裝
1)下載安裝
centos系統
# yum install readline-devel pcre pcre-devel openssl openssl-devel gcc curl GeoIP-devel
下載源碼包
https://github.com/openresty/openresty/releases
選擇最新版本v1.13.6.1
解壓安裝
# tar -xzvf openresty-1.13.6.1.tar.gz
# cd openresty-1.13.6.1/
##選擇模塊 ./configure --help
# ./configure --with-luajit --with-pcre --with-http_gzip_static_module --with-http_realip_module --with-http_geoip_module --with-http_ssl_module --with-http_stub_status_module
--with-http_gzip_static_module #靜態文件壓縮
--with-http_stub_status_module #監控nginx狀態
--with-http_realip_module #經過這個模塊容許咱們改變客戶端請求頭中客戶端IP地址值(例如X-Real-IP 或 X-Forwarded-For),意義在於可以使得後臺服務器記錄原始客戶端的IP地址
--with-pcre #設置PCRE庫(pcre pcre-devel)
--with-http_ssl_module #使用https協議模塊。(openssl openssl-devel)
--with-http_geoip_module #增長了根據ip得到城市信息,經緯度等模塊 (GeoIP-devel)
# make && make install
2)安裝成功後,默認會在/usr/local/openresty/
目錄下
luajit 是採用C語言寫的Lua代碼的解釋器 ----just in time 即時解析
lualib 是編輯好的lua類庫
nginx,其實咱們openResty就是nginx,只是作了一些模塊化工做;因此啓動openResty就是啓動nginx,咱們能夠到 cd nginx/sbin/,直接運行 ./nginx
3)設置環境變量
# vi /etc/profile
export NGINX_HOME=/usr/local/openresty/nginx
export PATH=$PATH:$NGINX_HOME/sbin
# source /etc/profile ##生效javascript