zoukankan      html  css  js  c++  java
  • nginx使用replace-filter-nginx-module实现内容替换

    有时候我们想对响应(例如PHP接口)返回的内容做些字符串,虽然可以使用各语言代码相关方法(例如PHP的str_replace)进行替换,但是在nginx层面替换是更方便的,无需修改代码。

    约定:本文源代码目录统一放在:/root/soft/src 里。

    开始安装

    安装sregex运行库

    安装此模块需要先安装 sregex 运行库:

    $ git clone https://github.com/agentzh/sregex
    $ cd sregex
    $ make
    $ make install
    

    软链接:

    $ ln -sv /usr/local/lib/libsregex.so.0.0.1 /lib64/libsregex.so.0
    

    安装 replace-filter-nginx-module

    然后获取 replace-filter-nginx-module 模块,并解压,无需安装:

    $ cd /root/soft/src
    $ git clone https://github.com/agentzh/replace-filter-nginx-module
    

    获取Nginx源码:

    $ wget http://nginx.org/download/nginx-1.12.2.tar.gz
    $ tar zxvf nginx-1.12.2.tar.gz
    

    这里采用静态编译的方式安装模块,需要重新编译 nginx 。获取 nginx 上一次编译参数:

    $ nginx -V
    nginx version: nginx/1.12.2
    built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) 
    built with OpenSSL 1.0.1e-fips 11 Feb 2013
    TLS SNI support enabled
    configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --with-ld-opt=-ljemalloc --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module 
    

    这里添加 replace-filter-nginx-module 模块:

    --add-module=/root/soft/src/replace-filter-nginx-module
    

    最终编译命令:

    cd nginx-1.12.2
    
    $  ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --with-ld-opt=-ljemalloc --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --add-module=/root/soft/src/replace-filter-nginx-module-0.01rc5
     
    $ make
    

    由于这里是升级nginx,所以千万不要make install,不然就真的覆盖了。这里先备份一下。 接下来手动替换二进制文件:

    $ cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
    $ cp -rfp ./objs/nginx /usr/local/nginx/sbin/
    

    测试是否可行:

    $ nginx -v
    nginx version: nginx/1.12.2
    

    配置是否正常:

    $ /usr/local/nginx/sbin/nginx -t
    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
    

    测试

    这里测试的是:把接口返回的 img.test.com 换成 media.test.com

    修改: /usr/local/nginx/conf/vhost/test.com.conf

    location ~ [^/].php(/|$)
    {
        # comment try_files $uri =404; to enable pathinfo
        try_files $uri =404;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
    

    为:

    location ~ [^/].php(/|$)
    {
        replace_filter 'img.test.com' 'media.test.com' g;
        replace_filter_types application/json;
        
        # comment try_files $uri =404; to enable pathinfo
        try_files $uri =404;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi.conf;
    

    注意需要添加replace_filter_types

    保存后检查配置是否ok:

    $ /usr/local/nginx/sbin/nginx -t
    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
    

    然后热重启:

    # 升级完成第一次需要重启
    $ service nginx restart 
     
    # 热重启
    $ /usr/local/nginx/sbin/nginx -s reload
    

    编译动态模块

    replace-filter-nginx-module 支持以动态模块方式加载,详见:https://github.com/openresty/replace-filter-nginx-module#installation 。Nginx版本需要 >=1.9.11

    $  ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --with-ld-opt=-ljemalloc --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module 
    --add-dynamic-module=/root/soft/src/replace-filter-nginx-module
    
    $ make -j2
    $ make install
    

    相比静态编译,参数--add-module改成了--add-dynamic-module

    编译成功后,会把模块安装在nginx/modules/目录。查看:

    $ ls /usr/local/nginx/modules/
    ngx_http_replace_filter_module.so
    

    接下来我们需要在nginx.conf配置中加入以下内容,实现动态调用模块:

    load_module /usr/local/nginx/modules/ngx_http_replace_filter_module.so; 
    

    注意:load_module指令不能放在 http{} 里面:

    worker_processes  1;
    
    load_module xxx;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    events {
        worker_connections  1024;
    }
    
    http {
    
    }
    

    接下来可以按上面的 测试 小节测试。唯一不同的是无需使用service nginx restart重启Nginx,直接使用nginx -s reload热重启就行了。

    参考

    1、已安装nginx动态添加模块
    http://coolnull.com/4245.html
    2、LNMP平滑升级nginx并安装ngx_lua模块教程
    http://www.mamicode.com/info-detail-1110824.html
    3、openresty/replace-filter-nginx-module: Streaming regular expression replacement in response bodies
    https://github.com/openresty/replace-filter-nginx-module#synopsis
    4、比ngx_http_substitutions_filter_module 更强大的替换模块sregex的replace-filter-nginx-module
    https://www.cnblogs.com/archoncap/p/4973009.html
    5、Nginx编译安装Lua - 飞鸿影~ - 博客园
    https://www.cnblogs.com/52fhy/p/10164553.html

  • 相关阅读:
    MOSS中的User的Title, LoginName, DisplayName, SID之间的关系
    如何在Network Monitor中高亮间隔时间过长的帧?
    SharePoint服务器如果需要安装杀毒软件, 需要注意什么?
    如何查看SQL Profiler? 如何查看SQL死锁?
    什么是Telnet
    The name or security ID (SID) of the domain specified is inconsistent with the trust information for that domain.
    Windows SharePoint Service 3.0的某个Web Application无搜索结果
    网络连接不上, 有TCP错误, 如果操作系统是Windows Server 2003, 请尝试一下这里
    在WinDBG中查看内存的命令
    The virtual machine could not be started because the hypervisor is not running
  • 原文地址:https://www.cnblogs.com/52fhy/p/7956099.html
Copyright © 2011-2022 走看看