国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

小需求推動新語言快速學(xué)習(xí):nginx lua 根據(jù) user_agent 顯示不同的頁面

DevTalking / 1264人閱讀

摘要:一個小小的需求,可能會遇到很多問題,但是搜索相關(guān)的關(guān)鍵字,就能快速實現(xiàn)出來,完成一個小目標,事半功倍。下面開始一個小需求一個地址有兩套頁面,需要在后端根據(jù)瀏覽器的來顯示不同的頁面。而的結(jié)果在個并發(fā)的時候,失敗的請求數(shù)依舊是。

之前做一次分享 如何快速學(xué)習(xí)一門新的語言的直播分享 但是那是以實現(xiàn)一個后端框架的角度來講的,道理想通,我們要以實際的需求出發(fā)。一個小小的需求,可能會遇到很多問題,但是搜索相關(guān)的關(guān)鍵字,就能快速實現(xiàn)出來,完成一個小目標,事半功倍。

死記硬背手冊,太枯燥了,反正我是看不下去,不如直接來個小項目。下面開始:

一個小需求

pc、mobile 一個地址有兩套頁面,需要在后端根據(jù)瀏覽器的 user_agent 來顯示不同的頁面。
通過 php 來做,當然可以,但是活動頁面訪問量一般都比較大,想優(yōu)化些,所以想嘗試下 lua。

nginx 安裝 lua-nginx-module

可以直接上 openresty,不過有時候就是想折騰。
安裝的步驟 https://mengkang.net/994.html (如果你想實踐的話再看吧)

lua demo 腳本
-- 判斷是否是手機瀏覽器
function isMobile(userAgent)
    -- 99% 前三個都能匹配上吧
    local mobile = {
        "phone", "android", "mobile", "itouch", "ipod", "symbian", "htc", "palmos", "blackberry", "opera mini", "windows ce", "nokia", "fennec",
        "hiptop", "kindle", "mot", "webos", "samsung", "sonyericsson", "wap", "avantgo", "eudoraweb", "minimo", "netfront", "teleca"
    }
    userAgent = string.lower(userAgent)

    for i, v in ipairs(mobile) do
        if string.match(userAgent, v) then
            return true
        end
    end

    return false
end

-- 根據(jù)id + 瀏覽器類型展示活動頁面
function showPromotionHtml(id, isMobile)
    local path = "/data/www/mengkang/demo/promotion/"
    local filename

    if isMobile then
        path = path .. "mobile"
    else
        path = path .. "pc"
    end

    filename = path .. "/" .. id .. ".html"

    if file_exists(filename) then
        local file = io.open(filename,"r")
        io.input(file)
        print(io.read("*a"))
        io.close(file)
    else
        print("文件不存在: " .. string.gsub(filename, "/data/www/mengkang/demo", ""))
    end
end

-- 判斷文件是否存在
function file_exists(path)
    local file = io.open(path, "rb")
    if file then file:close() end
    return file ~= nil
end

local id = 1
local userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36"
showPromotionHtml(id, isMobile(userAgent))
小結(jié)

作為一個 lua 菜鳥,通過這個小需求我查了哪些資料

變量的定義
函數(shù)的寫法
循環(huán)的了解
判斷邏輯的寫法
注釋的寫法
文件 i/o
字符串拼接 ..
字符串查找 string.match
字符串轉(zhuǎn)小寫 string.lower

稍微調(diào)整適配 nginx lua 模塊
-- 判斷是否是手機瀏覽器
function isMobile(userAgent)
    -- 99% 前三個都能匹配上吧
    local mobile = {
        "phone", "android", "mobile", "itouch", "ipod", "symbian", "htc", "palmos", "blackberry", "opera mini", "windows ce", "nokia", "fennec",
        "hiptop", "kindle", "mot", "webos", "samsung", "sonyericsson", "wap", "avantgo", "eudoraweb", "minimo", "netfront", "teleca"
    }
    userAgent = string.lower(userAgent)

    for i, v in ipairs(mobile) do
        if string.match(userAgent, v) then
            return true
        end
    end

    return false
end

-- 根據(jù)id + 瀏覽器類型展示活動頁面
function showPromotionHtml(id, isMobile)
    local path = "/data/www/mengkang/demo/promotion/"
    local filename

    if isMobile then
        path = path .. "mobile"
    else
        path = path .. "pc"
    end

    filename = path .. "/" .. id .. ".html"

    if file_exists(filename) then
        local file = io.open(filename,"r")
        io.input(file)
        ngx.say(io.read("*a"))
        io.close(file)
    else
        ngx.say("file not found : " .. string.gsub(filename, "/data/www/mengkang/demo", ""))
    end
end

-- 判斷文件是否存在
function file_exists(path)
    local file = io.open(path, "rb")
    if file then file:close() end
    return file ~= nil
end

local id = ngx.var.id
local userAgent = ngx.req.get_headers().user_agent
showPromotionHtml(id, isMobile(userAgent))
nginx 配置
server
{
    listen       80;
    server_name mengkang.net

    location ~ /promotion/(d+)
    {
        set $id $1;
        default_type "text/html";
        content_by_lua_file /data/www/lua/1.lua;
    }
}
演示地址

https://mengkang.net/promotion/1
https://mengkang.net/promotio...
切換 user_agent 即可看到,不同的 pc 和 mobile 兩個版本的頁面

和 php 性能對比 nginx 配置
rewrite ^/promotion2/(.*)$  /demo/promotion.php last;
php 代碼

也就是說訪問 http://mengkang.net/promotion/1 和 http://mengkang.net/promotion2/1 是一樣的結(jié)果

配置說明

雙核4G
nginx 配置一致
php 版本:7.0.11
php-fpm 配置:

pm = dynamic
pm.max_children = 10
pm.start_servers = 4
pm.min_spare_servers = 4
pm.max_spare_servers = 10
php 壓測結(jié)果
ab -n 1000 -c 100 http://mengkang.net/promotion2/1
Requests per second:    3105.21 [#/sec] (mean)
Time per request:       32.204 [ms] (mean)

ab -n 4000 -c 400 http://mengkang.net/promotion2/1
Requests per second:    3361.87 [#/sec] (mean)
Time per request:       118.981 [ms] (mean)
Complete requests:      4000
Failed requests:        259

ab -n 8000 -c 800 http://mengkang.net/promotion2/1
Requests per second:    3358.20 [#/sec] (mean)
Time per request:       238.223 [ms] (mean)
Complete requests:      8000
Failed requests:        654

ab -n 10000 -c 1000 http://mengkang.net/promotion2/1
Requests per second:    3275.30 [#/sec] (mean)
Time per request:       305.315 [ms] (mean)
Complete requests:      10000
Failed requests:        9150
lua 壓測結(jié)果
ab -n 1000 -c 100 http://mengkang.net/promotion/1
Requests per second:    6014.89 [#/sec] (mean)
Time per request:       16.625 [ms] (mean)

ab -n 4000 -c 400 http://mengkang.net/promotion/1
Complete requests:      4000
Failed requests:        0
Requests per second:    6190.57 [#/sec] (mean)
Time per request:       64.614 [ms] (mean)

ab -n 8000 -c 800 http://mengkang.net/promotion/1
Complete requests:      8000
Failed requests:        0
Requests per second:    7046.66 [#/sec] (mean)
Time per request:       113.529 [ms] (mean

ab -n 10000 -c 1000 http://mengkang.net/promotion/1
Complete requests:      10000
Failed requests:        0
Requests per second:    5670.38 [#/sec] (mean)
Time per request:       176.355 [ms] (mean)
對比可見

PHP qps 在 3000左右,nginx_lua qps 在 7000 左右。qps 提升了1倍多,而且響應(yīng)時間更短,而且 php 在 400 個并發(fā)的時候開始出現(xiàn)比較多的失敗請求,吞吐率開始下降。而 lua 的結(jié)果在 1000 個并發(fā)的時候,失敗的請求數(shù)依舊是0。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/25875.html

相關(guān)文章

  • 需求推動新語快速學(xué)習(xí)nginx lua 根據(jù) user_agent 顯示不同頁面

    摘要:一個小小的需求,可能會遇到很多問題,但是搜索相關(guān)的關(guān)鍵字,就能快速實現(xiàn)出來,完成一個小目標,事半功倍。下面開始一個小需求一個地址有兩套頁面,需要在后端根據(jù)瀏覽器的來顯示不同的頁面。而的結(jié)果在個并發(fā)的時候,失敗的請求數(shù)依舊是。 之前做一次分享 如何快速學(xué)習(xí)一門新的語言的直播分享 但是那是以實現(xiàn)一個后端框架的角度來講的,道理想通,我們要以實際的需求出發(fā)。一個小小的需求,可能會遇到很多問題...

    Gemini 評論0 收藏0
  • 如何學(xué)習(xí)一門新語或框架

    摘要:簡評新的語言層出不窮,等等。原作者分享了以下幾點先掌握語言,再學(xué)習(xí)框架有些朋友傾向于學(xué)習(xí)框架,比如。比如說這段代碼方式實現(xiàn)一些東西在功能實現(xiàn)的同時找到編程語言的樂趣,給編程語言找到具體的應(yīng)用場景。 簡評:新的語言層出不窮,Dart, Go, Kotlin, Elixir 等等。極光日報曾經(jīng)分享過一篇文章 —— 不同編程語言的學(xué)習(xí)曲線。挑戰(zhàn)學(xué)習(xí)曲線這事兒可能太難,但有些小技巧能幫助我們快...

    TANKING 評論0 收藏0
  • 再見,Python!你好,Go語

    摘要:語言誕生于谷歌,由計算機領(lǐng)域的三位宗師級大牛和寫成。作者華為云技術(shù)宅基地鏈接谷歌前員工認為,比起大家熟悉的,語言其實有很多優(yōu)良特性,很多時候都可以代替,他已經(jīng)在很多任務(wù)中使用語言替代了。 Go 語言誕生于谷歌,由計算機領(lǐng)域的三位宗師級大牛 Rob Pike、Ken Thompson 和 Robert Griesemer 寫成。由于出身名門,Go 在誕生之初就吸引了大批開發(fā)者的關(guān)注。誕生...

    zhaot 評論0 收藏0

發(fā)表評論

0條評論

DevTalking

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<