精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Openresty的開發閉環初探

開發 開發工具
Nginx 作為現在使用最廣泛的高性能后端服務器,Openresty 為之提供了動態預言的靈活,當性能與靈活走在了一起,無疑對于被之前陷于臃腫架構,苦于提升性能的工程師來說是重大的利好消息。

1. 為什么值得入手?

Nginx 作為現在使用最廣泛的高性能后端服務器,Openresty 為之提供了動態預言的靈活,當性能與靈活走在了一起,無疑對于被之前陷于臃腫架構,苦于提升性能的工程師來說是重大的利好消息,本文就是在這種背景下,將初入這一未知的領域之后的一些經驗與大家分享一下,若有失言之處,歡迎指教。

Openresty的開發閉環初探

2. 安裝

現在除了能在 [Download](http://openresty.org/en/download.html )里面下載源碼來自己編譯安裝,現在連預編譯好的[包](http://openresty.org/en/linux-packages.html)都有了, 安裝也就分分鐘的事了。

3. hello world

/path/to/nginx.conf`, `conftent_by_lua_file 里面的路徑請根據 lua_package_path 調整一下。

  1. ``` 
  2.    location / { 
  3.        content_by_lua_file ../luablib/hello_world.lua; 
  4.    } 
  5.    ``` 
  6.  
  7. /path/to/openresty/lualib/hello_world.lua` 
  8.    ``` 
  9.    ngx.say("Hello World") 
  10.    ``` 

訪問一下, Hello World~.

  1. ``` 
  2.   HTTP/1.1 200 OK 
  3.   Connection: keep-alive 
  4.   Content-Type: application/octet-stream 
  5.   Date: Wed, 11 Jan 2017 07:52:15 GMT 
  6.   Server: openresty/1.11.2.2 
  7.   Transfer-Encoding: chunked 
  8.   Hello World 
  9.   ``` 

基本上早期的 Openresty 相關的開發的路數也就大抵如此了, 將 lua 庫發布到 lualib 之下,將對應的 nginx 的配置文件發布到 nginx/conf 底下,然后 reload 已有的 Openresty 進程(少數需要清空 Openresty shared_dict 數據的情況需要重啟 )。

如果是測試環境的話,那更是簡單了,在 http 段將 lua_code_cache 設為 off , Openresty 不會緩存 lua 腳本,每次執行都會去磁盤上讀取 lua 腳本文件的內容,發布之后就可以直接看效果了(當然如果配置文件修改了,reload 是免不了了)。是不是找到一點當初 apache 寫 php 的感覺呢:)

4. 開發語言 Lua 的大致介紹

環境搭建完畢之后,接下來就是各種試錯了。關于 Lua 的介紹,網上的資料比如:Openresty ***實踐(版本比較多,這里就不放了)寫的都會比較詳細,本文就不在這里過多解釋了,只展示部分基礎的Lua的模樣。

下面對 lua 一些個性有趣的地方做一下分享,可能不會涉及到 lua 語言比較全面或者細節的一些部分,作為補充,讀者可以翻閱官方的< >。

  1. ```lua 
  2.    -- 單行注釋以兩個連字符開頭 
  3.    --[[ 
  4. 行注釋 
  5.    --]] 
  6.    -- 變量賦值 
  7.    num = 13  -- 所有的數字都是雙精度浮點型。 
  8.    s = '單引號字符串' 
  9.    t = "也可以用雙引號" 
  10.    u = [[ 多行的字符串 
  11.           ]] 
  12.    -- 控制流程,和python最明顯的差別可能就是冒號變成了do, ***還得數end的對應 
  13.    -- while 
  14.    while n < 10 do 
  15.      nn = n + 1  -- 不支持 ++ 或 += 運算符。 
  16.    end 
  17.    -- for 
  18.    for i = 0, 9 do 
  19.      print(i) 
  20.    end 
  21.    -- if語句: 
  22.    f n == 0 then 
  23.      print("no hits") 
  24.    elseif n == 1 then 
  25.      print("one hit") 
  26.    else 
  27.      print(n .. " hits") 
  28.    end 
  29.    --只有nil和false為假; 0和 ''均為真! 
  30.    if not aBoolValue then print('false') end 
  31.    -- 循環的另一種結構: 
  32.    repeat 
  33.      print('the way of the future') 
  34.      numnum = num - 1 
  35.    until num == 0 
  36.    -- 函數定義: 
  37.    function add(x, y) 
  38.      return x + y 
  39.    end 
  40.    -- table 用作鍵值對 
  41.    t = {key1 = 'value1'key2 = false
  42.    print(t.key1)  -- 打印 'value1'. 
  43.    -- 使用任何非nil的值作為key: 
  44.    u = {['@!#'] = 'qbert', [{}] = 1729, [6.28] = 'tau'} 
  45.    print(u[6.28])  -- 打印 "tau" 
  46.    -- table用作列表、數組 
  47.    v = {'value1', 'value2', 1.21, 'gigawatts'} 
  48.    for i = 1, #v do  -- #v 是列表的大小 
  49.      print(v[i]) 
  50.    end 
  51.    -- 元表 
  52.    f1 = {a = 1b = 2}  -- 表示一個分數 a/b. 
  53.    f2 = {a = 2b = 3
  54.    -- 這會失?。?nbsp;
  55.    -- s = f1 + f2 
  56.    metafraction = {} 
  57.    function metafraction.__add(f1, f2) 
  58.      local sum = {} 
  59.      sum.b = f1.b * f2.b 
  60.      sum.a = f1.a * f2.b + f2.a * f1.b 
  61.      return sum 
  62.    end 
  63.    setmetatable(f1, metafraction) 
  64.    setmetatable(f2, metafraction) 
  65.    s = f1 + f2  -- 調用在f1的元表上的__add(f1, f2) 方法 
  66.    -- __index、__add等的值,被稱為元方法。 
  67.    -- 這里是一個table元方法的清單: 
  68.    -- __add(a, b)                     for a + b 
  69.    -- __sub(a, b)                     for a - b 
  70.    -- __mul(a, b)                     for a * b 
  71.    -- __div(a, b)                     for a / b 
  72.    -- __mod(a, b)                     for a % b 
  73.    -- __pow(a, b)                     for a ^ b 
  74.    -- __unm(a)                        for -a 
  75.    -- __concat(a, b)                  for a .. b 
  76.    -- __len(a)                        for #a 
  77.    -- __eq(a, b)                      for a == b 
  78.    -- __lt(a, b)                      for a < b 
  79.    -- __le(a, b)                      for a <= b 
  80.    -- __index(a, b)  <fn or a table>  for a.b 
  81.    -- __newindex(a, b, c)             for a.b = c 
  82.    -- __call(a, ...)                  for a(...) 
  83.    ``` 

以上參考了

[learn lua in y minute](https://learnxinyminutes.com/docs/zh-cn/lua-cn/ ) ,做了適當的裁剪來做說明。

4.1 Lua 語言個性的一面

4.1.1 ***道墻: 打印 table

作為 lua 里面唯一標準的數據結構, 直接打印居然只有一個 id 狀的東西,這里說這一點沒有抱怨的意思,只是讓讀者做好倒騰的心理準備,畢竟倒騰一個簡潔語言終歸是有代價的。

了解決定背后的原因,有時候比現成的一步到位的現成方案這也是倒騰的另一面好處吧,這里給出社區里面的[討論](http://luausers.org/wiki/TableSerialization)

舉個例子:

lua 里面一般使用 #table 來獲取 table 的長度,究其原因,lua 對于未定義的變量、table 的鍵,總是返回 nil,而不像 python 里面肯定是拋出異常, 所以 # 來計算 table 長度的時候只會遍歷到***個值為 nil 的地方,畢竟他不能一直嘗試下去,這時候就需要使用 table.maxn 的方式來獲取了。

4.1.2 Good or Bad ? 自動類型轉換

如果你在 python 里面去把一個字符串和數字相加,python 必定以異?;貞?。

  1. ```python 
  2. >>> "a" + 1 
  3. Traceback (most recent call last): 
  4.   File "<stdin>", line 1, in <module> 
  5. TypeError: cannot concatenate 'str' and 'int' objects 
  6. ``` 

但是 Lua 覺得他能搞定。

  1. ```lua 
  2. > = "20" + 10 
  3. 30 
  4. ``` 

如果你覺得 Lua 選擇轉換加號操作符的操作數成數字類型去進行求值顯得不可思議的,下面這種情況下,這種轉換又貌似是可以有點用的了 print("hello" .. 123) ,這時你不用手動去將所有參數手工轉換成字符串類型。

尚沒有定論說這項特性就是一無是處,但是這種依賴語言本身不明顯的特性的代碼筆者是不希望在項目里面去踩雷的。

4.1.3 多返回值

Lua 開始變得越來越與眾不同了:允許函數返回多個結果。

  1. ``` 
  2.     function foo0() end --無返回值 
  3.     function foo1() return 'a' end -- 返回一個結果 
  4.     function foo2() return 'a','b' end -- 返回兩個結果 
  5.     -- 多重賦值時, 函數調用是***一個表達式時 
  6.     -- 保留盡可能多的返回值 
  7.     x, y = foo2()     -- x='a'y='b' 
  8.     x = foo2()        -- x='a', 'b'被丟棄 
  9.     x,y,z = 10,foo2()    -- x=10y='a'z='b' 
  10.     -- 如果多重賦值時,函數調用不是***一個表達式時 
  11.     -- 只產生一個值 
  12.     x, y = foo2(),20   -- x='a'y=20    
  13.     x,y = foo0(), 20, 30 -- x=nily20,30被丟棄,這種情況當函數沒有返回值時,會用nil來補充。 
  14.     x,y,z = foo2() -- x='a'y='b'z=nil, 這種情況函數沒有足夠的返回值時也會用nil來補充。 
  15.     -- 同樣在函數調用、table聲明中 函數調用作為***的表達式,都會竟可能多的填充返回值,如果不是***,則只返回一個 
  16.     print(foo2(), 1)    --> a  1 
  17.     print(1, foo2())    --> 1  a  b 
  18.     t = {foo2(), 1}     --> {'a', 1} 
  19.     t = {1, foo2()}     --> {1, 'a', 'b'} 
  20.     -- 阻止這種參數順序搞事: 
  21.     print(1, (foo2())) -- 1 a 加一層括號,強制只返回一個值 
  22.     ``` 

4.1.4 真個性: 模式匹配

簡潔的 Lua 容不下行數比自己實現語言行數還多的正則表達式實現(無論是 POSIX ,還是 Perl 正則表達式),于是乎有了獨樹一幟的模式與匹配,下面只用模式匹配來做 URL 解碼、編碼功能實現的演示。

  1. ``` 
  2.   -- 解碼 
  3.   function unescape(s) 
  4.     s = string.gsub(s, "+", " ") 
  5.     s = string.gsub(s, "%%(%x%x)", function (h) 
  6.           return string.char(tonumber(h, 16)) 
  7.         end) 
  8.     return s   
  9.   end 
  10.   print(unescape("a%2Bb+%3D+c")) ---> a+b =c 
  11.   cgi = {} 
  12.   function decode(s) 
  13.     for name,value in string.gmatch(s, "([^&=]+)=([^&=]+)") do 
  14.       name = unescape(name) 
  15.       value = unescape(value) 
  16.       cgi[name] = value 
  17.     end 
  18.   end 
  19.   -- 編碼 
  20.   function escape(s) 
  21.     s = string.gsub(s, "[&=+%%%c]", function(c) 
  22.         return string.format("%%%02X", string.byte(c)) 
  23.       end) 
  24.     s = string.gsub(s, " ", "+") 
  25.     return s 
  26.   end   
  27.   function encode(t) 
  28.     local b = {} 
  29.     for k,v in pairs(t) do 
  30.       b[#b+1] = (escape(k) .. "=" .. escape(v)) 
  31.     end 
  32.     return table.concat(b,'&') 
  33.   end 
  34.   ``` 

模式匹配實現的功能是足夠強大,但是工程上是否值得投入還值得商榷,沒有通用性,只此 lua 一家用。

雖然正則表達式也是不好調試,但是至少知道了解的人多,可能到***筆者也不會多深入 lua 的模式匹配,但是如此單純為了減少代碼而放棄正則表達式現成的庫,自己又玩了一套,這也是沒誰了。

4.1.5 與 c 的天然親密

一言不合,就拿 c 寫一個庫給 lua 用,由此可見兩門語言是多么哥倆好了。如果舉個例子的話就是 lua5.1 里面的位操作符,luajit 就是這樣提供的解決方案 [Lua Bit Operations Module](http://bitop.luajit.org ),有興趣的讀者可以下載源碼看一下,完全就是用 lua 的 c api 包裝了 c 里面的位操作符出來用。

除了加了些限制的話(ex. 位移出來的必然是 32 位有符)。lua 除了數據結構上面的過于簡潔外,其他的控制結構、操作符這些語言特性基本該有的都有了,唯獨缺了位操作符。

5.1 為什么當時選擇了不實現位操作符呢?有知道出處或者原因的讀者歡迎留言告知。(順帶一提,lua5.2 里面有官方的 bit32 庫可以用,lua5.3 已經補上了位操作符,另外 Openresty 在 lua 版本的選擇上是選擇停留在 5.1,這點在 github 的 Issue 里面有回答過,且沒有升級的打算)。

4.1.6 雜

  • 只有 nil 、false 為布爾假。
  • lua 中的索引習慣以 1 開始。
  • 沒有整型,所有數字都是浮點數。
  • 當函數的參數是單引號或者雙引號的字符串或者 table 定義的時候,可以省略外面的 () , 所以 require "cookie" 并不是代表 require 是個關鍵字。
  • table[index] 等價于 table [index] 。

5. 構建公司層面完整的 Openresty 生態

5.1 開發助手:成長中的 resty 命令

習慣了動態語言的解釋器的立即反饋,哪怕是熟悉 lua 的同學,初入 Openresty 的時候似乎又想起了編譯->執行->修改的***循環的記憶,因為每次都需要修改配置文件、reload 、測試再如此重復個幾次才能寫對一段函數,resty 命令無疑期待,筆者也希望 resty 命令能夠更加完善、易用。

另外提一個小遺憾,現在 resty 命令不能玩 Openresty 里面的 shared_dict 共享內存, 這可能跟目前 resty 使用的 nginx 配置的模板是固定有關吧。

5.2 環境:可能不再需要重新編譯 Nginx

有過 Nginx 維護開發經驗的同學可能都熟悉這么一個過程,因為多半會做業務的拆分,除了小公司外,基本都不會把一個 Nginx 的所有可選模塊都編譯進去,每次有新的 Nginx 相關的功能的增減,都免不了重新編譯,重新部署上線。

Openresty 是基于 Nginx 的,如果是新增 Nginx 本身的功能,重新編譯增加功能沒什么好說的,如何優雅的更新 Nginx 服務進程,Nginx 有提供方案、各家也有各家的服務可靠性要求,具體怎么辦這里就不贅述了。

5.3 發布部署

Openresty 本身的發布部署跟 Nginx 本身沒有太大的不同,Openresty 本身的發布部署官方也推出了 linux 平臺的預編譯好的包,在這樣的基礎上構建環境就更加便捷。

環境之上,首先是 lua 腳本和 nginx 配置文件的發布,在版本管理之下,加上自動構建的發布平臺,Openresty 的應用分分鐘就可以上線了:)

這個流程本身無關 Openresty ,但是簡而言之一句話,當重復性的東西自動化之后,我們才有精力去解決更有趣的問題,不是么?

5.4 第三方庫的安裝、管理

(1)以前:自己找個第三方庫編譯之后扔到 Openresty 的 lualib 目錄,luajit 是否兼容、是否 lua5.1 兼容都得自己來測試一遍。

(2)之前:對于解決前一個問題,Openresty 是通過給出 lua 里面 Luarocks 的安裝使用來解決的,但是這種方式不能解決上面所說的第二個問題,所以現在這種方式已經不推薦使用了,下面貼一下官網的說明,只做內容收集、展示用, ***的具體說明參見[using luarocks](http://openresty.org/en/using-luarocks.html)。

  1. ``` 
  2. wget http://luarocks.org/releases/luarocks-2.0.13.tar.gz 
  3. tar -xzvf luarocks-2.0.13.tar.gz 
  4. cd luarocks-2.0.13/ 
  5. ./configure --prefix=/usr/local/openresty/luajit \ 
  6.     --with-lua=/usr/local/openresty/luajit/ \ 
  7.     --lua-suffix=jit \ 
  8.     --with-lua-include=/usr/local/openresty/luajit/include/luajit-2.1 
  9. make 
  10. sudo make install 
  11. ``` 

安裝第三方庫示例:

  1. sudo /usr/local/openresty/luajit/luarocks install md5。 

(3)現在:Openresty 提供了解決這兩個問題的完整方案,自己的包管理的規范和倉庫[opm](https://opm.openresty.org/)。

詳細的標準說明, 請移步:https://github.com/openresty/opm#readme, 這里就不多做介紹了。

關于第三方庫的質量,Openresty 官網上也有了專門的[QA頁面](http://qa.openresty.org/),至少保證了第三方庫一些實現的下限,不像 python 里面安裝某些第三方包,比如 aerospike 的,里面安裝 python 客戶端,每次要去網上拉個 c 的客戶端下來之類的稀奇古怪的玩法,期待 opm 未來更加完善。

5.5 關于單元測試

關于自動化測試的話,就筆者的試用經驗而言,感覺還不是特別的順手,官方提供的 Test:Nginx 工具已經提供簡潔強大的功能,但是如果作為 TDD 開發中的測試驅動的工具而言,筆者覺得報錯信息的有效性上面可能是唯一讓人有點覺得有點捉雞的地方,尚不清楚是否是筆者用的有誤——

一般 Test:Nginx 的報錯多半無法幫助調試代碼,還是要走調試、修改的老路子。但是 Test:Nginx 的真正價值筆者覺得是講實例代碼和測試***的結合,由此養成了看每個 Openresty 相關的項目代碼都必先閱讀里面的 Test:Nginx 的測試,當然最多最豐富的還是 Openresty 本身的測試。

舉個實際的例子:

在使用 Test:Nginx 之前,之前對于 Nginx 的日志輸出,一切的測試依據,對于外面的運行環境跑的測試只能通過 http 的請求和返回來做測試的判斷條件,這時候對于一些情況就束手無策了, 比如處理某種錯誤情況可能需要在 log 里面記錄一下,這種測試就無法保證。

另外也有類似[lua-resty-test](https://github.com/membphis/lua-resty-test)這樣通過提供組件的方式來進行,但是我們一旦接觸的了 Test:Nginx 的測試方法之后,這些就顯得相形見絀了,我們舉個實際的例子。

  1. ``` 
  2.    # vim:set ftts=4 sw=4 et fdm=marker
  3.    use Test::Nginx::Socket::Lua; 
  4.    #worker_connections(1014); 
  5.    #master_process_enabled(1); 
  6.    #log_level('warn'); 
  7.    #repeat_each(2); 
  8.    plan tests => repeat_each() * (blocks() * 3 + 0); 
  9.    #no_diff(); 
  10.    no_long_string(); 
  11.    #master_on(); 
  12.    #workers(2); 
  13.    run_tests(); 
  14.    __DATA__ 
  15.    === TEST 1: lpush & lpop 
  16.    --- http_config 
  17.        lua_shared_dict dogs 1m; 
  18.    --- config 
  19.        location = /test { 
  20.            content_by_lua_block { 
  21.                local dogs = ngx.shared.dogs 
  22.                local len, err = dogs:lpush("foo", "bar") 
  23.                if len then 
  24.                    ngx.say("push success") 
  25.                else 
  26.                    ngx.say("push err: ", err) 
  27.                end 
  28.                local val, err = dogs:llen("foo") 
  29.                ngx.say(val, " ", err) 
  30.                local val, err = dogs:lpop("foo") 
  31.                ngx.say(val, " ", err) 
  32.                local val, err = dogs:llen("foo") 
  33.                ngx.say(val, " ", err) 
  34.                local val, err = dogs:lpop("foo") 
  35.                ngx.say(val, " ", err) 
  36.            } 
  37.        } 
  38.    --- request 
  39.    GET /test 
  40.    --- response_body 
  41.    push success 
  42.    1 nil 
  43.    bar nil 
  44.    0 nil 
  45.    nil nil 
  46.    --- no_error_log 
  47.    [error] 
  48.    ``` 

以上是隨便選取的lua-nginx-module的測試文件145-shdict-list.t中的一段做說明,測試文件分為3個部分:

  • __DATA__以上的部分編排測試如何運行,
  • __DATA__作為分隔符,
  • __DATA__以下的是各個測試的說明部分。

測試部分如果具體細分的話,

  • 一般由 ====TEST 1: name 開始到下一個測試的聲明;
  • 然后是配置 nginx 配置的 http_config、config、... 的部分;
  • 接著是模擬請求的部分,基本就是 http 請求報文的設定,功能不限于這里的 request 部分;
  • ***是輸出部分,這時候不僅是 http 報文的 body 部分之類的 http 響應、還有 nginx 的日志的輸出這樣的測試條件。

對于這樣清晰可讀、還能順帶把使用例子寫的清楚的單元測試的框架, pythoner 真的難道不羨慕么?

5.6 關于調試、性能調優

這一塊筆者還沒有深入研究過,所以這里就不多說了,這里就做一下相關知識的鏈接歸納,方便大家整理資料吧。lua 語言本身提供的調試就比較簡潔、加上 Openresty 是嵌入 Nginx 內部的,這就更給排查工作帶來了困難。

(1)[官方的調試頁面]

(http://openresty.org/en/debugging.html )

(2)[官方的性能調優頁面]

(http://openresty.org/en/profiling.html )

(3)[通過systemtap探查在線的Nginx work進程]

(https://github.com/agentzh/nginx-systemtap-toolkit)

(4)[額外的工具庫stap++]

(https://github.com/agentzh/stapxx )

(5)[工具火焰圖Flame Graphs的介紹]

(http://dtrace.org/blogs/brendan/2011/12/16/flame-graphs/ )

(6)[Linux Kernel Performance: Flame Graphs]

(http://dtrace.org/blogs/brendan/2012/03/17/linux-kernel-performance-flame-graphs/ )

【本文是51CTO專欄機構“豈安科技”的原創文章,轉載請通過微信公眾號(bigsec)聯系原作者】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2011-06-16 10:25:29

AndroidAIR

2009-07-08 09:44:54

TDDViual Studi

2012-03-16 13:43:29

2010-10-09 15:01:27

PhoneGapiPhoneAndroid

2014-06-05 14:12:05

SwiftUI學習iOS

2024-06-05 09:22:43

2009-10-30 10:45:45

ScalaEclipseAndroid

2011-08-23 17:52:39

LUAWeb 開發

2016-08-23 14:37:21

2023-12-18 10:15:30

自動駕駛自然語言

2010-08-18 09:23:19

Flash Lite移動應用程序開發

2014-12-17 11:09:39

Hybrid AppWebView裝載頁面

2010-08-03 10:32:42

Android 3.0Android 3.0Android開發

2024-12-06 09:47:13

2016-11-28 09:19:27

2010-08-11 10:58:06

AndroidAndroid NDK

2009-10-15 15:12:39

Equinox服務器端Equinox

2016-10-11 13:48:41

WebGLJavascriptWeb

2011-01-11 11:35:17

jQueryAndroidgoogle

2010-06-03 12:57:06

Hadoop
點贊
收藏

51CTO技術棧公眾號

黄色大片在线看| 成人a v视频| 一级毛片精品毛片| 欧美日韩久久久久| 青青草成人激情在线| 一级做a爰片久久毛片16| 欧美日韩a区| 日韩精品在线观看视频| 国产精品区在线| 黑人极品ⅴideos精品欧美棵| 91视频免费播放| 国产一区二区在线免费| 日韩av一二三区| 成人激情免费视频| 亚洲福利视频网站| 中文字幕第17页| 美女高潮在线观看| 1000部国产精品成人观看| 国产亚洲情侣一区二区无| 亚洲午夜在线播放| 亚洲免费大片| 久久影视电视剧免费网站| 欧美 日本 国产| 久久爱www.| 欧美私人免费视频| 伊人成色综合网| 成人a在线视频免费观看| 久久久久亚洲蜜桃| 国产不卡一区二区在线观看| 伊人精品一区二区三区| 亚洲一区二区伦理| 欧美富婆性猛交| 小嫩苞一区二区三区| 蜜臀91精品国产高清在线观看| 日韩一区二区免费高清| 2025韩国理伦片在线观看| 在线黄色的网站| 午夜国产不卡在线观看视频| 青青视频免费在线| 麻豆最新免费在线视频| 亚洲国产精华液网站w| 麻豆av一区| 天堂8在线视频| 国产成人激情av| 91久色国产| 国产特级黄色片| 精品一区二区三区视频在线观看| 国产成人精品视| 日韩三级一区二区| 久久亚洲不卡| 国产精品久久久久久久av大片| 欧美精品亚洲精品日韩精品| 在线不卡欧美| 午夜精品一区二区三区av| 久久久久免费看| 好看的av在线不卡观看| 久久av在线播放| 欧美xxxx黑人xyx性爽| 你懂的亚洲视频| 久久这里只有精品99| 亚洲波多野结衣| 亚洲成av人片乱码色午夜| 久久久av亚洲男天堂| 国产suv精品一区二区68| 婷婷亚洲综合| 久久99青青精品免费观看| 欧美日韩在线观看成人| 国产综合视频| 91国产一区在线| 中文字幕一区二区人妻视频| 日韩激情av在线| 国产精品中文字幕久久久| 一级黄色短视频| 国产福利一区二区三区视频在线 | 亚洲精品美女久久久| 69亚洲乱人伦| 欧美猛男男男激情videos| 一区二区av在线| 激情无码人妻又粗又大| 一区二区三区在线电影| 国外色69视频在线观看| 亚洲精品中文字幕乱码三区91| 日韩成人午夜电影| 91精品啪在线观看麻豆免费| 刘玥91精选国产在线观看| 久久人人爽人人爽| 亚洲最新在线| av日韩国产| 在线影视一区二区三区| 天堂av.com| 日韩欧美国产大片| 最近中文字幕日韩精品 | 成人性生交大片免费看无遮挡aⅴ| 久久福利影院| 97国产成人精品视频| 最新中文字幕免费| 成人免费观看av| 日韩影视精品| 91九色美女在线视频| 欧美性感一区二区三区| 亚洲乱妇老熟女爽到高潮的片| 亚洲精品456| 欧美巨大黑人极品精男| jizz国产在线观看| 国产成a人亚洲精| 日韩欧美在线观看强乱免费| 国内小视频在线看| 欧美伊人久久大香线蕉综合69| xxxxwww一片| 国产一区三区在线播放| 久久久亚洲影院你懂的| 亚洲视频一区在线播放| 91片黄在线观看| 国产资源第一页| 成人黄色免费短视频| 精品日韩99亚洲| 久久精品亚洲a| 日韩黄色一级片| 久久国产精品久久精品国产| 97caopron在线视频| 欧美午夜免费电影| 三级电影在线看| 一区二区自拍| 亚洲a中文字幕| 1024免费在线视频| 色欧美片视频在线观看在线视频| 中文字幕99页| 你懂的国产精品永久在线| 国产日韩欧美在线看| 免费福利在线观看| 黑人欧美xxxx| 亚洲一区二区三区综合| 自产国语精品视频| 国产主播欧美精品| 北岛玲一区二区三区| 欧美午夜女人视频在线| av黄色一级片| 亚洲激情网址| 鬼打鬼之黄金道士1992林正英| 黄色网页在线免费看| 欧美日韩黄视频| 大吊一区二区三区| 免费人成精品欧美精品| 日韩视频精品| 主播大秀视频在线观看一区二区| 亚洲三级黄色在线观看| 丁香六月婷婷综合| 久久综合九色综合久久久精品综合| 亚洲人成无码网站久久99热国产| 88久久精品| 国模吧一区二区三区| 动漫av一区二区三区| 亚洲丶国产丶欧美一区二区三区| 超碰人人cao| 在线精品亚洲| 精品国产综合区久久久久久| 草草视频在线| 亚洲精品一区二区三区婷婷月| 国产又大又黄视频| 国产偷国产偷亚洲高清人白洁 | 福利在线视频网站| 久久久久久久久久久国产精品| 久久精品国产精品亚洲色婷婷| 青草影院在线观看| 国产日韩亚洲| 免费观看成人在线| 国偷自产一区二区免费视频| 亚洲欧美制服综合另类| 亚洲自拍一区在线观看| 国产欧美日韩在线观看| 污污网站在线观看视频| 国产精品毛片一区二区在线看| 亚洲aaa激情| 国产美女高潮在线观看| 亚洲欧美国产另类| 91高潮大合集爽到抽搐| 一区二区欧美在线观看| 捆绑裸体绳奴bdsm亚洲| 日韩国产精品久久| 综合操久久久| 久久1电影院| 国产精品久久久久久久久久三级| 日本高清视频在线观看| 精品欧美一区二区三区精品久久| 亚洲第一精品在线观看 | 日本丰满少妇一区二区三区| 亚洲天堂岛国片| 国产成人精品亚洲日本在线桃色| 国产一区二区网| 欧美呦呦网站| 成人三级在线| 国产成人免费9x9x人网站视频| 久久影视免费观看| 四虎成人免费在线| 欧美一区二区三区四区在线观看| 尤物视频在线观看国产| 中文字幕的久久| 污污内射在线观看一区二区少妇 | 91久久在线观看| 精精国产xxx在线视频app| 色综合亚洲精品激情狠狠| 好男人在线视频www| 欧美日韩一区在线| 日本熟妇一区二区| 国产精品久久久久9999吃药| 少妇一级淫片免费放播放| 毛片不卡一区二区| 乱人伦xxxx国语对白| 亚洲香蕉av| 日本在线观看一区二区| 红杏视频成人| 91gao视频| 成人做爰免费视频免费看| 97国产精品视频人人做人人爱| 色开心亚洲综合| 亚洲免费福利视频| 免费的黄色av| 欧美一卡二卡三卡| 亚洲一区二区色| 日本黄色一区二区| 日韩成人一区二区三区| 亚洲欧美视频在线观看视频| 亚洲AV无码成人精品区明星换面 | 国产精品视频免费一区| **精品中文字幕一区二区三区| 人九九综合九九宗合| 超碰在线99| 欧美激情二区三区| 成人免费高清| 久久天堂av综合合色| 欧美日韩在线精品一区二区三区激情综| 精品国产91乱码一区二区三区 | 久久亚洲精品人成综合网| 日本精品视频在线| 一区二区电影免费观看| 97免费视频在线播放| 91视频欧美| 97视频在线观看网址| brazzers在线观看| 久久久免费在线观看| 青青在线视频| 欧美激情a∨在线视频播放| 亚洲精品天堂| 欧美大成色www永久网站婷| 尤物视频在线看| 久久91亚洲精品中文字幕奶水 | 亚洲免费毛片网站| 182在线观看视频| 亚洲欧美日本韩国| 欧美性猛交xxxxx少妇| 亚洲精品国久久99热| 欧美日韩在线视频免费播放| 一区二区三区免费看视频| 欧美日韩精品在线观看视频| 一区二区三区四区蜜桃 | 激情五月***国产精品| 欧美视频在线观看视频 | 9久久婷婷国产综合精品性色| 久久久久看片| 国产wwwxx| 精品无人码麻豆乱码1区2区| 午夜国产福利在线观看| 国产一区二区91| 精品国产一区在线| 国产欧美一区二区精品性色超碰| 中国1级黄色片| 一区二区三区高清| 国产精品免费av一区二区| 色综合久久天天综合网| 伊人免费在线观看| 日韩欧美一级片| 头脑特工队2免费完整版在线观看| 亚洲色图第一页| 免费人成在线观看播放视频| 欧美日韩第一视频| 国产免费不卡| 91精品久久久久久久久久久久久| 日韩免费精品| 久久香蕉综合色| 婷婷综合亚洲| 国产午夜福利100集发布| 老牛影视一区二区三区| 中文字幕在线视频一区二区三区| 成人黄页在线观看| 日韩视频在线观看免费视频| 亚洲人吸女人奶水| 中文字幕精品三级久久久| 欧美日韩在线电影| 成人午夜精品福利免费| 国产亚洲精品久久久优势| 黄网站在线播放| 26uuu国产精品视频| 欧美一区二区三区婷婷| 国产伦精品一区二区三区照片91| 久久av资源| www.男人天堂网| 男女视频一区二区| 朝桐光av一区二区三区| 亚洲欧美一区二区在线观看| 亚洲视频免费播放| 欧美精品久久天天躁| 水中色av综合| 欧美麻豆久久久久久中文| free欧美| 国产精品香蕉视屏| 爽成人777777婷婷| 91好吊色国产欧美日韩在线| 狠狠久久亚洲欧美| 性猛交娇小69hd| 亚洲444eee在线观看| 国产精品高潮呻吟av| 亚洲午夜未满十八勿入免费观看全集| 污片视频在线免费观看| 国产美女搞久久| 免费精品国产| 久久久久久免费看| 国产精品中文欧美| 少妇高潮惨叫久久久久| 色偷偷一区二区三区| 秋霞网一区二区| 久久99国产精品自在自在app| 欧美一级做一级爱a做片性| 日韩视频在线播放| 性娇小13――14欧美| 亚洲精品第二页| 一区二区三区四区在线播放| 国产口爆吞精一区二区| 中文字幕日韩av综合精品| 美女福利一区二区| 麻豆av福利av久久av| 国产一区二区三区的电影 | 亚洲高清视频网站| 大胆人体色综合| 免费欧美网站| 中文字幕乱码免费| 黑人巨大精品欧美一区| 成人高潮免费视频| 欧美猛男男办公室激情| a天堂中文在线88| 国产在线一区二区三区| 99精品综合| 亚洲制服中文字幕| 亚洲乱码日产精品bd| a视频免费在线观看| 米奇精品一区二区三区在线观看| 精品视频国内| 天天做天天躁天天躁| 风间由美性色一区二区三区| 欧美精品一级片| 精品国产不卡一区二区三区| а√天堂中文资源在线bt| 精品在线一区| 日日夜夜精品免费视频| 1024手机在线观看你懂的| 欧美日韩在线播放三区四区| 麻豆传媒在线免费看| **亚洲第一综合导航网站| 欧美精品一区二区三区久久久竹菊| 爱情岛论坛亚洲自拍| 亚洲mv在线观看| 国产视频二区在线观看| 国产一区二中文字幕在线看| 亚洲电影在线一区二区三区| 日本美女视频网站| 日韩欧美在线免费观看| 国产小视频免费在线网址| 国产女同一区二区| 国产综合自拍| 六月婷婷七月丁香| 欧美狂野另类xxxxoooo| 污污视频在线看| 欧美1o一11sex性hdhd| 奇米影视7777精品一区二区| 91porn在线视频| 亚洲国产天堂久久综合网| 欧美日韩在线精品一区二区三区激情综合| 亚洲国产婷婷香蕉久久久久久99| 国产一区二区三区免费在线观看 | 一本在线高清不卡dvd| 成人高清免费在线播放| 亚洲在线www| 久久久久.com| 欧洲猛交xxxx乱大交3| 国产视频在线观看一区二区| a屁视频一区二区三区四区| 欧美做受777cos| 久久综合九色欧美综合狠狠| 91精品国自产| 2019日本中文字幕| 国产精品国产三级国产在线观看 | 噜噜噜天天躁狠狠躁夜夜精品| 苍井空浴缸大战猛男120分钟| 亚洲丝袜制服诱惑| 欧美zzoo| 99久久99久久精品国产片| 天堂一区二区在线| 五月天婷婷丁香| 精品国模在线视频| 免费看av成人| 香蕉视频1024|