nginx是个小巧灵活的服务器,因此,不免缺少一些功能,在配置过程中带来不便,因此需要安装几个常用的第三方模块

HttpSetMiscModule

http://wiki.nginx.org/HttpSetMiscModule

https://github.com/agentzh/set-misc-nginx-module/archive/v0.24.tar.gz

其中常用的指令是set_escape_uri 可以转义和反转义url,在重定向并且带返回url的时候常用到,比如弹出验证码,当验证码填写正确后,调回原有页面,那么需要一下配置。

if ( -f /usr/local/nginx/conf/catchbot/blacklist/$remote_addr )
{
set_escape_uri $myuri $request_uri;
rewrite “^((?!/captcha/).)*$” /captcha/?captcha_uri= $myuri redirect;
}

HttpSubModule

http://wiki.nginx.org/HttpSubModule

内置,不需下载,默认不编译

其中常用指令是 sub_filter , 作用是在html中做个字符串替换,可以在所有的页面上家一条引用的js,或者全站公告等。

location / {
sub_filter </head>
‘</head><script language=”javascript” src=”$script”></script>’;
sub_filter_once on;
}

EchoModule

https://github.com/agentzh/echo-nginx-module/archive/v0.51.tar.gz

echo一些变量,调试方便

安装模块

http://www.ttlsa.com/nginx/how-to-install-nginx-third-modules/

由于需要,要分析出每个用户都浏览了哪些文章,然后统计出每个文章在那个时间被哪个用户浏览过,其实可以通过php程序实现,但是为了不增加php的压力,可以采用nginx日志方式来记录。

这就需要在日志中记录用户id和文章id了,默认的格式中,没有用户id这个变量,那么需要在cookie里提取这个变量,在cookie里保存了auth字符串,虽然与用户是以一一对应的,但是找到对应关系比较困难,所以需要在cookie里冗余保存一个uid的明文。

cookie实质上是一个字符串,在cookie字符串中提取uid,可用正则表达式匹配,“uid=(\S+)(;.*|$)” 即可,$1 就是uid了。接下来要找到articleid,这个可以从url中提取nginx里预制了许多变量$uri,$request之类,从$request中提取articeid,使用正则表达式匹配  $request ~* “/article/([0-9]+)\.html” , 注意request 包括了 GET 和HTTP 1.1 所以不能匹配 ^和 $ ,这个问题纠结了很久。

记录自定义日志的格式需要指定一下,在http域中声明 log_format uid ‘xxx$remote_addr [$time_local] “$request” $uid $articleid’;
这里uid 和articleid 都是自定义变量 自定义变量要赋值

set $uid “0″;
set $flag “”;
set $articleid “0″;
if ( $http_cookie ~* “uid=(\S+)(;.*|$)”){
set $uid $1;
set $flag “${flag}1″;
}
if ( $request ~* “/article/([0-9]+)\.html”) {
set $articleid $1;
set $flag “${flag}1″;
}

最后是条件记录,即只有访问文章详细页的时候才记录日志

access_log 语句如果在if中声明,那么这个if必须在location里,新建一个location只放access_log语句的话,会破坏现有路由,所以要在原有的location里添加,添加在 location ~ .*\.(php|php5)?$ { 中

在location里

if ( $request ~* “/article/([0-9]+)\.html”) {
access_log /home/wwwlogs/nginx/uid.log uid;
}

重启nginx即可。