在編譯了lua-nginx-module的nginx上,可以方便地使用shared dict特性,在不reload配置文件的情況下實現配置同步。
由於shared dict使用一塊共享內存,因此所有worker均可讀寫,也就不存在一致性的問題。
屏蔽user-agent並屏蔽日誌
1 2 3 4 5 6 7 8 |
if ($http_user_agent ~* (^badbot/useragent$)) { rewrite (.*) /badbot break; } location = /badbot { access_log off; return 403; } |
不屏蔽user-agent(允許其訪問),但屏蔽日誌
1 2 3 4 5 6 7 |
server { set $is_spider 1; if ($http_user_agent ~* "bot|spider|Bot|Disqus|WebIndex|YunGuanCe") { set $is_spider 0; } access_log /var/log/nginx/access.log combined if=$is_spider; } |
按uri屏蔽日誌(可以和上面的按user-agent用同一個變量來同時過濾uri和user-agent)
1 2 3 4 5 6 7 8 9 10 11 |
map $request $loggable { ~/favicon.ico 0; ~/images/* 0; ~/js/* 0; ~/css/* 0; default 1; } server { access_log /var/log/nginx/access.log combined if=$loggable; } |
按mime type設置緩存時間
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
map $sent_http_content_type $cacheable_types { "text/css" "max-age=14400"; "text/plain" "max-age=86400"; "image/jpeg" "max-age=86400"; "image/png" "max-age=86400"; "image/gif" "max-age=86400"; "image/x-icon" "max-age=86400"; "application/x-7z-compressed" "max-age=864000"; "application/x-javascript" "max-age=86400"; "application/json" "max-age=86400"; "application/x-bittorrent" "max-age=864000"; default ""; } server { location / { root "/var/www/html/"; add_header "Cache-Control" $cacheable_types; } } |
簡單的無狀態cookie challenge(需要lua-nginx-module)
crawlers塊中可以手動填寫要屏蔽的IP
將其中的s改成隨機字符串+時間戳可以變成有狀態版本(需使用redis/memcached/shared memory存儲生成的隨機字符串)
將set-cookie改成通過js生成cookie可以變成javascript challenge,注意要在js里加上瀏覽器上下文判斷,如var cookie=location.protocol?cookie:””; 或者DOM操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
geo $crawlers{ 1.2.3.0/24 1; 4.5.6.7 1; default 0; } server { location ~ \.php { set $_c 0; if ($http_user_agent ~* "bad.guy/123") { set $_c 1; } if ($crawlers){ set $_c 1; } if ($_c){ access_log off; access_by_lua_block { local expires = 90 local s = ngx.time() local cob = tonumber(ngx.var.cookie_cob) if cob == nil then cob=0 end local coa = ngx.md5("saltsalt" .. ngx.var.remote_addr .. "saltsalt" .. cob) if s - cob > expires or ngx.var.cookie_coa ~= coa then coa = ngx.md5("saltsalt" .. ngx.var.remote_addr .. "saltsalt" .. s) ngx.header["Set-Cookie"] = {"coa=" .. coa .."; path=/; domain=.example.com; HttpOnly", "cob=" .. s.."; path=/; domain=.example.com; HttpOnly"} ngx.header["Content-Type"] = "text/html" ngx.say("<meta http-equiv ='refresh' content='0'>"); ngx.exit(200) end } } # fastcgi_pass } } |
植入cookie
需要注意的是使用ngx.time()產生秒級的時間,用來做隨機數種子可能會衝突,因此建議加上另外的隨機變量(如下面的例子用的是客戶端的ip) 可以使用ngx.now()產生毫秒精度時間
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
local modname = "util" local _M = { _VERSION = '0.01' } local mt = { __index = _M } function _M.random_str(l, seed, r) local s = r or 'abcdefghijklmnhopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789=+-' local ret ='' -- os.time() is precise to second math.randomseed(os.time() * 1000 + ngx.crc32_short(seed or "")) for i=1 ,l do local pos = math.random(1, string.len(s)) ret = ret .. string.sub(s, pos, pos) end return ret end function _M.plant_cookie(k, h) local ck = require "resty.cookie" local cookie, err = ck:new() if not cookie then ngx.log(ngx.ERR, "ERROR PLANTING COOKIE", err) return end local _, err = cookie:get(k) if _ then return end local ok, err = cookie:set({ key = k, value = _M.random_str(32, ngx.var.remote_addr, '0123456789abcdef'), path = "/", domain = h or ngx.var.http_host, httponly = true, expires= 'Thu, 31-Dec-37 23:55:55 GMT', max_age = 2147483647 }) end return _M |
1 2 3 4 5 6 |
location / { access_by_lua ' local _ = require("util") _.plant_cookie("cookie_name",".example.come") '; } |
本文原載於《21天從零開始做修Windows電腦專家:入門到精通》一書
某一次重啟之後,發現筆記本的wifi無法連接了,顯示為紅叉。
在Windows10的設置里提示,沒有在您的計算機上找到無線網卡,之類的。首先確認無線網卡驅動正常,為了保險起見,還回滾了一次驅動(因為曾經出現過Win10自動更新後驅動跪了的情況)。
那麼是怎麼回事呢?
萬能的谷歌告訴我們,在操作系統層處理無線協議的服務是WLAN AutoConfig。
WLAN AutoConfig的服務名稱是wlansvc,我們使用sc查詢其運行狀態:
1 2 3 4 5 6 7 8 9 10 |
> sc query wlansvc SERVICE_NAME: wlansvc TYPE : 20 WIN32_SHARE_PROCESS STATE : 1 STOPPED (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN) WIN32_EXIT_CODE : 1068 (0x42c) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0 |
嘿夥計你瞧,它掛了:) 錯誤碼是1068。如果你在「服務」控制台中嘗試啟動它,會提示
不要使用Win8或以上系統自帶的驅動!
我懷疑寫THX TruStudio那群坑比是硬編碼設備名稱的……裝了Win10的新驅動(6.0.11.800)之後,聲卡的名稱變成了VIA HD Audio,而在6.0.10.1900之前,是VIA HighDefination Audio。
諾就是這貨↓
因此我們只能用這個2013年發佈的6.0.10.1900版本驅動。我在這裡傳了一份備用:http://pan.baidu.com/s/1nt9XJqL
One Line: Do not use the driver shipped with Windows!
Maybe the guys writing THX TruStudio hardcoded device name. The newest driver from Win10(6.0.11.800) gives me the sound card name as VIA HD Audio,but before 6.0.10.1900, this was VIA HighDefination Audio.
So let’s just use the ancient driver 6.0.10.1900 (or before) released in year 2013. Here’s a mirror:http://pan.baidu.com/s/1nt9XJqL