nginx正则与pcretest
能配置nginx的正则是运维的一项基本要求,同其他很多应用一样,linux下的正则都是依赖pcre进行的。而pcre安装包里也提供了一相应的工具用于测试正则是否正确,该工具就是pcretest 。
平时在nginx书写正则规则时,常用到的一些正则符号如下表:
而最近在对一台老版本的centos 测试主机上的nginx书写正则规则时,发现([0-9]+)-([0-9]+)可以正常使用,但是换成(d+)-(d+)却不能使用(神奇了,在另一台却是好的) 。为了定位问题,首先对rewrite语句进行pcretest测试,发现规则没有问题,但是nginx就是没生效。
pcretest的用法如下:
# pcretest PCRE version 6.6 06-Feb-2006 re> /(d+)-(d+)/ data> 123-456 0: 123-456 1: 123 2: 456 data> 1-2 0: 1-2 1: 1 2: 2 data> 23-45 0: 23-45 1: 23 2: 45
输入完命令后,在re>后输入要测试的正则表达式,在data>后输入要被处理的文本,回车后显示的就是$0,$1,$2等各部分显示的值 。
通过pcretest测试完后,发现rewrite没有问题,再通过ldd工具,查看下nginx调用到的lib库文件:
# ldd /opt/nginx/sbin/nginx linux-gate.so.1 => (0x0076c000) libpthread.so.0 => /lib/libpthread.so.0 (0×00594000) libcrypt.so.1 => /lib/libcrypt.so.1 (0x001b9000) libpcre.so.0 => /usr/local/lib/libpcre.so.0 (0x00bcb000) libcrypto.so.6 => /lib/libcrypto.so.6 (0×02704000) libz.so.1 => /usr/lib/libz.so.1 (0x005ad000) libc.so.6 => /lib/libc.so.6 (0x0041f000) /lib/ld-linux.so.2 (0x0081c000) libdl.so.2 => /lib/libdl.so.2 (0x0058e000)
正则有问题,重点看libpcre库了 。发现使用的/usr/local/lib/libpcre.so.0 ,不属于任何包,这个库从路径上盾应该是手工编译的。不过为了进一步确定是否为rpm包安装,还可以用rpm命令进行进一步的检测:
# rpm -qf /usr/local/lib/libpcre.so.0.0.1 file /usr/local/lib/libpcre.so.0.0.1 is not owned by any package
查询下目前系统rpm安装时用到的pcre包的路径:
# rpm -ql pcre-6.6-6.el5_6.1 /lib/libpcre.so.0 /lib/libpcre.so.0.0.1 /usr/bin/pcregrep /usr/bin/pcretest /usr/lib/libpcrecpp.so.0 /usr/lib/libpcrecpp.so.0.0.0 /usr/lib/libpcreposix.so.0 /usr/lib/libpcreposix.so.0.0.0 /usr/share/doc/pcre-6.6 /usr/share/doc/pcre-6.6/AUTHORS /usr/share/doc/pcre-6.6/LICENCE /usr/share/man/man1/pcregrep.1.gz /usr/share/man/man1/pcretest.1.gz
所以,该问题,应该是nginx调用到的pcre lib文件被别人给清掉或删掉了。所以解决该问题就非常简单了,要么将系统rpm安装的软链接到相应的路径,要么重新安装pcre到/usr/lib/local。
[root@test ]# ln -s /lib/libpcre.so.0.0.1 /usr/local/lib/
重新安装后,也可以到pcre安装后的bin目录查看,同时会有pcretest会成生。
[root@back bin]# ls pcre-config pcregrep pcretest [root@back bin]# pwd /usr/local/pcre/bin [root@back bin]#
本站的发展离不开您的资助,金额随意,欢迎来赏!
You can donate through PayPal.My paypal id: itybku@139.comPaypal page: https://www.paypal.me/361way
You can donate through PayPal.My paypal id: itybku@139.comPaypal page: https://www.paypal.me/361way
近期评论