1.課程介紹--
2.openresty介紹
官網:https://openresty.org/cn/
openresty的目標是讓你的Web服務直接跑在Nginx服務內部,充分利用Nginx的非阻塞I/O模型夫啊,不僅僅對HTTP客戶端請求撇眯,甚至對遠程后端諸如MySQL熊榛,PostgreSQL,Memcached以及Redis等都進行一致的高性能響應逸雹。
3.openresty常用架構
負載均衡:
LVS+HAProxy將流量轉發(fā)給核心Nginx1和核心Nginx2梆砸,即實現(xiàn)了流量的負載均衡
單機閉環(huán):
所有想要的數據都能從本服務器直接獲取休蟹,在大多數時候無需通過網絡去其他服務器獲取
分布式閉環(huán):
單機閉環(huán)會遇到如下兩個主要問題:
1.數據不一致(比如沒有采用主從架構導致不同服務器數據不一致)
2.遇到存儲瓶頸(磁盤或者內存遇到了天花板)赂弓。
解決數據不一致的比較好的辦法是采用主從或者分布式集中存儲哪轿;而遇到存儲瓶頸就需要進行按照業(yè)務鍵進行分片杨耙,將數據分散到多臺服務器珊膜。
接入網關:
接入網關也可以叫做接入層剔氏,即接收到流量多入口谈跛,在入口我們進行如下事情
4.openresty下載與安裝
windows安裝:直接解壓安裝币旧,啟動時,只需要執(zhí)行nignx.exe
linux安裝centOS6.5
1.解壓:tar -xzvf openresty-VERSION.tar.gz
2.配置:進入openresty-VERSION/目錄鳍刷,然后輸入以下命令配置
./configure
默認—prefix=/usr/local/openresty程序會被安裝到/usr/local/openresty目錄输瓜。
3.安裝
make&&make install
注意:openresty依賴庫有:perl5.6.1+,libreadline北戏,libpcre嗜愈,libssl蠕嫁。所以我們需要先安裝好這些依賴庫
yum install redline-devel pure-devel openssl-level perl gcc
4.驗證:
關閉防火墻,訪問http://外網IP
5.lua介紹與下載安裝
lua語法介紹
lua是一種輕量小巧的腳本語言迟赃,用標準C語言編寫并以源代碼形式開放,其設計目的是為了嵌入應用程序中酌媒,從而為應用程序提供靈活的擴展和定制功能。官網:http://www.lua.org/
1.CentOS下安裝lua
tar zxf lua-5.3.4.tar.gz
cd lua-5.3.4
make linux test
make install
查看lua版本:lua -v
6.lua語法-數據類型與變量定義
2.helloworld
1.交互模式雨席,輸入lua
2.腳本式陡厘,創(chuàng)建一個以lua結尾的文件,例如hello.lua文件內容print(“hello world”)
3.lua數據類型與變量
lua中有8個基本類型分別為:nil,boolean,number,string,userdata,function,thread和table
數據類型 描述
nil 這個最簡單谤饭,只有值nil屬于該類,表示一個無效值(在條件表達式中相當于false)
boolean 包含兩個值:false和true
number 表示雙精度類型的實浮點數
string 字符串由一對雙引號或單引號來表示
function 由C或Lua編寫的函數
userdata 表示任意存儲在變量中的C數據結構
thread 表示執(zhí)行的獨立線路,用于執(zhí)行協(xié)同程序
table Lua中的表(table)其實是一個“關聯(lián)數組”(associative arrays)辟汰,數組的索引可以是數字或者字符串帖汞。在Lua里,table的創(chuàng)建是通過“構造表達式”來完成催首,最簡單構造表達式是{},用來創(chuàng)建一個空表秧耗。
Lua變量有三種類型:全局變量,局部變量尺锚,表中的域
Lua中變量全是全局變量,那怕是語句塊或是函數里伐厌,除非用local顯式聲明為局部變量。
局部變量的作用域為從聲明位置開始到所在語句塊結束。
變量的默認值均為nil画饥。
--單行注釋
--[[
多行注釋
--]]
7.lua語法-運算符
1.賦值運算符
—賦值str=“hello”..”world” —..lua中的字符連接
a,b=10,20 —a=10,b=20
c,d,e=1,2
2.算術運算符
下表列出了lua語言中的常用算術運算符,設定A的值為10,B的值為20:
+ 加法
- 減法
* 乘法
/ 除法
% 取余
^ 乘冪
- 負號
3.關系運算符
下表列出了lua語言中的常用關系運算符艰额,設定A的值為10,B的值為20:
操作符 描述
== 等于
~= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
4.邏輯運算符
and 邏輯與操作符狱意,若A為false,則返回A,否則返回B。
or 邏輯或操作符,若A為true,則返回A,否則返回B砚亭。
not 邏輯非操作符,與邏輯運算結果相反,如果條件為true,邏輯非為false曹体。
5.其它運算符
.. 連接兩個字符串
# 一元運算符,返回字符串或表的長度
str=“helloworld”
print(#str) —得到10
8.lua語法-流程控制
1.條件
2.循環(huán)
--while循環(huán)
a=10
while(a>0)
do
print(a)
a = a -1
end
--repeat until:重復執(zhí)行循環(huán),直到指定的條件為真時為止
b=10
repeat
print(b)
b=b-1
until(b<1)
--for循環(huán)
for a=1,10,1 do
print(a)
end
9.lua語法-數組與泛型for
— 數組大小不固定,下標是從1開始绘趋。
arr={“aaa”,”bbb”,”ccc”}
for index=1,#arr do
print(arr[index])
end
—泛型for
for i,v in impairs(arr) do
print(i,v)
end
10.lua語法-函數介紹
—函數
function fun(a,b,c)
return a,b,c
end
value1,value2,value3 = fun(1,2,3,4,5)
print(value1,value2,value3)
11.lua語法-table與模塊垦江,包介紹
mytable={} —聲明一個table
mytable.first=“tom”
mytable.second=“james”
print(mytable[1])
print(mytable.first)
print(mytable[“second”])
模塊類似于一個封裝庫,從5.1開始吧慢,Lua加入了標準的模塊管理機制
module={}
module.index=1
function module.sum(a,b)
return a+b
end
—引入模塊
require “module”
print(module.index)
print(module.sum(10,20))
12.openresty快速入門
1.helloworld
openresty1.9.3.1及以下版本底哗,請使用content_by_lua命令:在openresty1.9.3.2以上,content_by_lua改成了content_by_lua_block.可使用nginx -V命令查看版本號
location / {
#root html;
#index index.html index.htm;
default_type text/html;
content_by_lua_block{
ngx.say(“hello world”);
}
}
我們也可以使用content_by_lua_file來引入一個lua文件
location /{
#root html;
#index index.html index.htm;
default_type text/html;
content_by_lua_file /usr/local/openresty/nginx/conf/my.lua;
}
13.openresty獲取http請求信息
1.獲取uri參數
獲取一個uri有兩個方法:ngx.req.get_uri_args,ngx.req.get_post_args,二者主要的區(qū)別是參數來源有區(qū)別
--獲取get請求參數
local arg=ngx.req.get_uri_args()
for k,v in pairs(arg) do
ngx.say(“[GET] key:”,k,” v:”,v)
ngx.say(“換行符”)
end
—獲取post請求時炼列,請求參數
ngx.req.read_body() —解析body參數之前一定要先讀取body
local arg = ngx.req.get_post_args()
for k,v in pairs(args) do
ngx.say(“[POST] key:”,k,” v:”,v)
ngx.say(“<br>”)
end
2.獲取header
—獲取header
local headers = ngx.req.get_headers()
for k,v in pairs(headers) do
ngx.say(“[header] name;”,k,” v:”,v)
ngx.say(“<br>”)
end
3.獲取body
--獲取body信息
local data =ngx.req.get_body_data()
ngx.say(data)
ngx.req.get_body_data()請求體,會偶爾出現(xiàn)讀取不到直接返回nil的情況。如果請求體尚未被讀取,請先調用ngx.req.read_body(或打開lua_need_request_body選項強制本模塊讀取請求體,詞方法不推薦)
14.openresty操作redis
—連接redis
github上的redis連接代碼只是一個示例代碼,生產環(huán)境并發(fā)量過大,可能會崩潰的。
生產環(huán)境redis連接代碼:http://wiki.jikexueyuan.com/project/openresty/redis/out_package.html
15.商品詳情頁方案介紹
16.twemproxy+redis環(huán)境搭建介紹
Twemproxy是一個Twitter開發(fā)的一個redis代理proxy玩裙,Twemproxy通過引入一個代理層,可以將其后端的多臺Redis或Memcached實例進行統(tǒng)一管理與分配鸯檬,使應用程序只需在Twemproxy上進行操作决侈,而不用關心后面具體有多少個真實的Redis或Memcached存儲,簡單的說喧务,就是有了Twemproxy赖歌,客戶端不直接訪問Redis服務器,而是通過twemproxy間接訪問功茴。
Twenproxy特性:
1.支持失敗節(jié)點自動刪除
2.支持設置HashTag
3.減少與redis的直接連接數
4.自動分片到后端多個redis實例上
5.避免單點問題
6.支持狀態(tài)監(jiān)控
7.使用pipeline處理請求和響應
8.并不是支持所有redis命令
示例:
示例中使用一個twemproxy+兩臺redis(未做主從)
實際部署中需要使用keepalived解決twemproxy單點問題庐冯,并且需要做redis主從
192.168.93.134 twemproxy
192.168.93.133 redis
192.168.93.132 redis
192.168.93.134操作
1.安裝autoconf
wget [http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz](http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz)
tar -zxvf autoconf-2.69.tar.gz
cd autoconf-2.69
./configure && make && make install
2.安裝automake
wget [http://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz](http://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz)
tar -zxvf automake-1.15.tar.gz
cd automake-1.15
3.安裝libtool
wget [https://ftp.gnu.org/gnu/libtool/libtool-2.4.6.tar.gz] (https://ftp.gnu.org/gnu/libtool/libtool-2.4.6.tar.gz)
tar -zxvf lib tool-2.4.6.tar.gz
cd lib tool-2.4.6
./configure && make && make install
4.安裝twemproxy
wget [https://github.com/twitter/twemproxy/archive/master.zip](https://github.com/twitter/twemproxy/archive/master.zip)
unzip master
cd twemproxy-master
aclocal
autoreconf -f -i -Wall,no-obsolete
mkdir /usr/local/twemproxy
./configure --prefix=/usr/local/twemproxy/
make && make install
5.配置twemproxy
將twemproxy-master下的conf目錄復制到/usr/local/twemproxy下
cp -r ./conf/usr/local/twemproxy/
cd /usr/local/twemproxy
修改conf目錄下nutcracker.yml文件內容
alpha:
listen:192.168.93.134:22121
hash:fnv1a_64
distribution:ketama
atuo_eject_hosts:true
redis:true
server_retry_timeout:2000
server_failure_limit:1
servers:
-192.168.93.133:6379:1
-192.168.93.134:6379:1
啟動twemproxy
注意192.168.93.133與192.168.93.134上的redis要啟動
并需要關閉防火墻service iptables stop
6.測試
17.openresty模版渲染介紹
導入lua-resty-template
下載:http://luarocks.org/modules/bungle/lua-resty-template
將template.lua文件復制到openresty/lualib/resty/目錄下
示例
nginx.conf
設置模版路徑:set $template_root /usr/local/openresty/nginx/html/remplates;
設置mimeType類型:default_type text/html;
導入lua文件:content_by_lua_file /usr/local/openresty/nginx/conf/*.lua
lua腳本文件
local template = require “rest.template”
content={
message = “Hello,World!”,
names = {“james”,”fox”,”tony"}
}
template.render(“demo.html”,content);
18.商品詳情頁展示
Java生成靜態(tài)頁面放到nginx目錄下(使用freemarker)
local template = require "resty.template" --調用模版
local redis = require “resty.redis_iresty”
local red = redis:new()
local msg = red:get("num")
if ngx.null == msg then
return ngx.say("獲取庫存失敗")
end
local context = {
title = "京東商品",
-- 從redis中獲取庫存信息坎穿,在頁面中顯示
num = msg
}
local request_uri = ngx.var.request_uri
template.render(string.sub(request_uri,2),context);