在编译了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