nginx 如何添加 substitutions_filter 模块,subs_filter 指令多次替换
发布于 作者:苏南大叔 来源:程序如此灵动~本篇文章继续讲述nginx
的反代功能,广大读者已经知道了,nginx
可以使用sub_filter
指令,替换返回内容中的文本。但是,这样做有个限制就是:仅仅可以设置一组替换值。那么,当如果有两组甚至N组数据需要替换呢?当然,如果使用php
之类的后端语言处理的话,这事儿根本就不能算得上是事儿。但是,这里是单纯的使用nginx
来处理这种事情。
那么这个需求的答案就是:substitutions_filter
模块,这个模块并不是nginx
官方自带的,是属于第三方模块。所以,这里需要重新编译nginx
。
本文中的测试环境是:centos7.5
,宝塔 5.9.0
,nginx 1.14
,substitutions_filter 0.64
。
寻找nginx
源码位置
本文的写作环境是基于centos7.5
下面的宝塔5.9.0
的。那么nginx
的代码,也是由宝塔提供的。那么通过查找得知:宝塔的nginx
的源码位置为:/www/server/nginx/src/
。记下这个路径。如果说为啥断定这个目录是nginx
的源码目录,大家可以看看,这个目录下面,是不是有个makefile
文件,这是很明显的标志的。
查看nginx
的编译参数
因为大家都知道nginx
的编译选项不同,最终得到的可执行文件,也是有较大区别的。所以,这里,查看nginx
的编译选项,还是非常有必要的。查看的方式很简单。代码如下:
nginx -V
注意这里的是-V
,不是-v
。是大写字母V
,否则得不到详细的编译参数信息。
返回值类似如下:
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)
built with OpenSSL 1.0.2l 25 May 2017
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/www/server/nginx --with-openssl=/www/server/nginx/src/openssl --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --add-module=/www/server/nginx/src/nginx-http-concat --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-stream --with-stream_ssl_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-pcre=pcre-8.40 --with-ld-opt=-ljemalloc
上述内容中的configure arguments
后面的值,就是苏南大叔的目标字符串。记下这些选项,备用。
下载subs
模块代码
substitutions_filter_module
项目地址是:
截至到发稿,这个最新版本是0.6.4
。貌似作者好几年没有更新代码了。
cd <nginx_src_folder>
git clone git://github.com/yaoweibin/ngx_http_substitutions_filter_module.git
./configure <原有的configure arguments> --add-module=<nginx_src_folder>/ngx_http_substitutions_filter_module
make&&make install
注意替换<原有的configure arguments>
为真实得到的原有配置项目。替换<nginx_src_folder>
为你的真实源码目录,在本文中,此值为:/www/server/nginx/src/
。
如果是第二次安装,可能需要的清理命令是:
cd /www/server/nginx/src/ make clean rm -rf ngx_http_substitutions_filter_module/
比如对于苏南大叔来说,命令行应该是这样的:
cd /www/server/nginx/src/
git clone git://github.com/yaoweibin/ngx_http_substitutions_filter_module.git
./configure --user=www --group=www --prefix=/www/server/nginx --with-openssl=/www/server/nginx/src/openssl --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --add-module=/www/server/nginx/src/nginx-http-concat --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-stream --with-stream_ssl_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-pcre=pcre-8.40 --with-ld-opt=-ljemalloc --add-module=/www/server/nginx/src/ngx_http_substitutions_filter_module
make&&make install
在configure
的时候,一定要注意查看输出的日志,可能因为会有些参数不合适,需要被删除掉。如果是严格按照nginx -V
取得的编译参数,一般来说,不会有问题的。
编译的过程比较漫长,经过极其漫长的等待后,苏南大叔在/www/server/nginx/src/objs/
下面,发现了新生成的nginx
文件。
nginx
如何生效
正常来说,install
之后就可以生效了。
make install
生效后的nginx
位置是:/www/server/nginx/sbin/nginx
。
没生效的话,补救措施
但是,如果没有生效,我们还可以手工操作一下。
第一步:通过which
命令,可以获得当前nginx
的位置。注意得到的路径值可能有出入。
which nginx
返回值:
/usr/bin/nginx
第二步:手工替换nginx
:
systemctl stop nginx
rm -rf /usr/bin/nginx_old
mv /usr/bin/nginx /usr/bin/nginx_old
cp /www/server/nginx/src/objs/nginx /usr/bin/
systemctl start nginx
使用范例
新的指令为subs_filter
,完全对标的是:sub_filter
。那么,就可以在nginx
的配置中,多次设置subs_filter
即可。在配置中,还可以使用正则表达式和变量。
subs_filter_types text/html text/css text/xml;
subs_filter st(\d*).example.com $1.example.com ir;
subs_filter a.example.com s.example.com;
subs_filter http://$host https://$host;
在这里,苏南大叔推荐您再回头看看nginx
设置代理的方法。
结论
nginx
添加了 substitutions_filter
模块之后,就可以愉快地使用 subs_filter
指令多次替换文本了。但是,这个就是最终的答案了么?不,因为,你会发现对于某些被代理的网站,你的文本替换,会失败的。那么,这究竟是为什么呢?
请查看苏南大叔的后续文章,了解sub_filter
和subs_filter
替换失败的处理方案。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。