能配置nginx的正则是运维的一项基本要求,同其他很多应用一样,linux下的正则都是依赖pcre进行的。而pcre安装包里也提供了一相应的工具用于测试正则是否正确,该工具就是pcretest 。

平时在nginx书写正则规则时,常用到的一些正则符号如下表:

nginx-pcretest

而最近在对一台老版本的centos 测试主机上的nginx书写正则规则时,发现([0-9]+)-([0-9]+)可以正常使用,但是换成(d+)-(d+)却不能使用(神奇了,在另一台却是好的) 。为了定位问题,首先对rewrite语句进行pcretest测试,发现规则没有问题,但是nginx就是没生效。

pcretest的用法如下:

 1# pcretest
 2PCRE version 6.6 06-Feb-2006
 3re> /(d+)-(d+)/
 4data> 123-456
 50: 123-456
 61: 123
 72: 456
 8data> 1-2
 90: 1-2
101: 1
112: 2
12data> 23-45
130: 23-45
141: 23
152: 45

输入完命令后,在re>后输入要测试的正则表达式,在data>后输入要被处理的文本,回车后显示的就是$0,$1,$2等各部分显示的值 。

通过pcretest测试完后,发现rewrite没有问题,再通过ldd工具,查看下nginx调用到的lib库文件:

 1# ldd /opt/nginx/sbin/nginx
 2linux-gate.so.1 => (0x0076c000)
 3libpthread.so.0 => /lib/libpthread.so.0 (0×00594000)
 4libcrypt.so.1 => /lib/libcrypt.so.1 (0x001b9000)
 5libpcre.so.0 => /usr/local/lib/libpcre.so.0 (0x00bcb000)
 6libcrypto.so.6 => /lib/libcrypto.so.6 (0×02704000)
 7libz.so.1 => /usr/lib/libz.so.1 (0x005ad000)
 8libc.so.6 => /lib/libc.so.6 (0x0041f000)
 9/lib/ld-linux.so.2 (0x0081c000)
10libdl.so.2 => /lib/libdl.so.2 (0x0058e000)

正则有问题,重点看libpcre库了 。发现使用的/usr/local/lib/libpcre.so.0 ,不属于任何包,这个库从路径上盾应该是手工编译的。不过为了进一步确定是否为rpm包安装,还可以用rpm命令进行进一步的检测:

1# rpm -qf /usr/local/lib/libpcre.so.0.0.1
2file /usr/local/lib/libpcre.so.0.0.1 is not owned by any package

查询下目前系统rpm安装时用到的pcre包的路径:

 1# rpm -ql pcre-6.6-6.el5_6.1
 2/lib/libpcre.so.0
 3/lib/libpcre.so.0.0.1
 4/usr/bin/pcregrep
 5/usr/bin/pcretest
 6/usr/lib/libpcrecpp.so.0
 7/usr/lib/libpcrecpp.so.0.0.0
 8/usr/lib/libpcreposix.so.0
 9/usr/lib/libpcreposix.so.0.0.0
10/usr/share/doc/pcre-6.6
11/usr/share/doc/pcre-6.6/AUTHORS
12/usr/share/doc/pcre-6.6/LICENCE
13/usr/share/man/man1/pcregrep.1.gz
14/usr/share/man/man1/pcretest.1.gz

所以,该问题,应该是nginx调用到的pcre lib文件被别人给清掉或删掉了。所以解决该问题就非常简单了,要么将系统rpm安装的软链接到相应的路径,要么重新安装pcre到/usr/lib/local。

1[root@test ]# ln -s /lib/libpcre.so.0.0.1 /usr/local/lib/

重新安装后,也可以到pcre安装后的bin目录查看,同时会有pcretest会成生。

1[root@back bin]# ls
2pcre-config  pcregrep  pcretest
3[root@back bin]# pwd
4/usr/local/pcre/bin
5[root@back bin]#