`
dinic
  • 浏览: 14017 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

nginx单独使用pcre的一个小坑

阅读更多
      在开发做nginx相关开发的过程中,我们有时候会使用到pcre库,或者依赖的库需要使用pcre,这时候就需要注意了。
      pcre在设计的时候考虑到线程安全,提供了内存管理回调函数(pcre_malloc, pcre_free),nginx在封装pcre库的时候替换了默认的回调函数,具体代码在src/core/ngx_regex.c

void                                                                            
ngx_regex_init(void)                                                            
{   
    // 替换回调函数,ngx_regex_malloc会在全局的ngx_pcre_pool上进行内存分配                                                                     
    pcre_malloc = ngx_regex_malloc;                                             
    pcre_free = ngx_regex_free;                                                 
}


接下来看ngx_regex_compile

ngx_int_t                                                                       
ngx_regex_compile(ngx_regex_compile_t *rc)                                      
{                                                                               
    ............

    //ngx_regex_malloc_init会把rc->pool复制给全局ngx_pcre_pool,共ngx_pcre_malloc使用                                                                                
    ngx_regex_malloc_init(rc->pool);                                            
                                                                                
    re = pcre_compile((const char *) rc->pattern.data, (int) rc->options,       
                      &errstr, &erroff, NULL);                                  
                                                                                
    /* ensure that there is no current pool */                                  
    //这里会把ngx_pcre_pool置空
    ngx_regex_malloc_done();

    ...........
}

     到这里,我们已经知道了,如果在我们代码中如果直接使用pcre的接口,会调到ngx_pcre_malloc函数,并且全局的ngx_pcre_pool为空,分配内存失败,就出现“failed to get memory”这类错误。


     修改方法:
   
 void *(origin_pcre_malloc)(size_t);
 void *(origin_pcre_free)(void *);

 origin_pcre_malloc = pcre_malloc;
 origin_pcre_free = pcre_free;

 // 匹配逻辑

 pcre_malloc = origin_pcre_malloc;
 pcre_free = orgin_pcre_free;


分享到:
评论

相关推荐

    nginx 离线安装包 pcre nginx 离线安装包 pcre

    在本例中,我们有一个名为 "pcre2-10.40" 的文件,这是 PCRE 的一个版本。Nginx 的源码包通常以 "nginx-版本号" 的形式命名。 2. **解压文件**:使用 `tar` 命令解压下载的源码包,例如 `tar -zxvf pcre2-10.40.tar...

    Nginx安装包及PCRE安装包及操作步骤

    2. **PCRE**:PCRE 是一个 Perl 兼容的正则表达式库,用于处理和匹配字符串模式。Nginx 使用 PCRE 来解析和执行配置文件中的正则表达式,实现诸如 URL 转发、重写等功能。 接下来,我们将详细讲解如何在 Linux 系统...

    nginx_pcre.rar

    在安装Nginx时,我们通常会下载源码包,如`nginx-1.16.0.tar.gz`,这是一个gzip压缩的tar文件,里面包含有编译和配置Nginx所需的所有源代码。解压后,开发者可以按照指定步骤进行编译和安装,以适应特定的系统环境。...

    nginx源码包(nginx+pcre+openssl+zlib)

    PCRE 是一个库,提供了与 Perl 语言兼容的正则表达式函数。在 Nginx 中,PCRE 用于处理 URL 重写、访问控制和其他基于模式匹配的功能。版本 8.40 可能包含以下改进: 1. **新特性**:添加了新的正则表达式语法或...

    nginx-1.8.1与pcre8.38

    nginx-1.8.1 用来做反向代理,负责均衡。需要与pcre-8.38.tar.gz一起使用。具体安装详见我的博客

    Nginx+openssl+zlib+pcre.rar

    4. **PCRE (Perl Compatible Regular Expressions)**:PCRE是一个Perl语言兼容的正则表达式库,为多种编程语言提供正则表达式支持。在Nginx中,PCRE用于处理URL重写规则和访问控制策略。通过编写正则表达式,管理员...

    nginx、openssl、zlib、pcre最新包

    Nginx作为核心的Web服务器,结合openssl实现加密通信,利用zlib进行数据压缩,借助pcre处理复杂的URL路由,共同构成了一个强大的Web服务架构。对于CentOS这样的Linux发行版,这些软件包的安装和配置过程相对简便,...

    让Nginx支持Rewrite功能,所依赖的PCRE包:pcre_8.35

    提供的文件`pcre_8.35`就是PCRE的一个版本。在编译安装过程中,通常会包含以下步骤: 1. 解压文件:`tar -zxvf pcre_8.35.tar.gz` 2. 进入解压后的目录:`cd pcre_8.35` 3. 配置编译环境:`./configure` 4. 编译...

    nginx安装需要依赖库,zlib 、openssl-fips、nginx、pcre

    然后是`nginx`自身,这是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx以其高效的处理能力、低内存占用和高并发性而闻名。在CentOS上安装Nginx,通常通过以下步骤进行: ``` sudo yum ...

    nginx+pcre+zlib

    Nginx-1.18.0是Nginx的一个版本,它包含了自1.17.9以来的更新和改进,提供了更稳定、更安全的服务。Nginx的核心特性包括事件驱动的架构、静态文件的快速服务、HTTP缓存、以及支持SSL/TLS加密等。通过反向代理,Nginx...

    pcre-8.43.tar.gz [nginx依赖包]

    标题中的“pcre-8.43.tar.gz”是一个开源软件包,名为Perl Compatible Regular Expressions(PCRE)的版本8.43的源代码压缩文件。PCRE是一个C库,它实现了Perl语言风格的正则表达式。在IT领域,正则表达式是用于模式...

    nginx在centos7离线部署所有包(gcc+pcre+openssl+zlib+nginx).zip

    在IT行业中,部署Web服务器是常见的任务之一,Nginx是一个广泛应用的高性能HTTP和反向代理服务器,以其轻量级、稳定性和高并发处理能力而闻名。本教程将详细介绍如何在CentOS 7系统上离线部署Nginx,同时包括了依赖...

    nginx1.8.tar.gz+pcre-8.35.tar.gz

    PCRE是一个开源的库,提供了Perl风格的正则表达式函数,广泛应用于各种编程语言和软件项目中,包括Nginx。Nginx使用PCRE来解析和匹配URL,实现基于URL的路由分发和访问控制。例如,你可以使用正则表达式定义location...

    nginx-1.24.0 pcre2 openssl zlib nginx源码离线安装包和依赖包

    nginx-1.24.0 pcre2 openssl zlib nginx离线安装包和依赖包 示例 ./configure --prefix=/opt/nginx/ --with-pcre=/opt/nginx/pcre2/ --with-zlib=/opt/nginx/zlib/ --with-openssl=/opt/nginx/openssl/

    pcre-8.45,Nginx的http模块使用pcre来解析正则表达式

    PCRE(Perl Compatible Regular Expressions)库是一组函数,使用与Perl 5相同的语法和语义实现正则表达式模式匹配。除了一组POSIX兼容的包装函数外,PCRE还拥有自己的原生API。 Nginx的http模块使用pcre来解析正则...

    nginx-1.2.6+openssl-1.0.2c+pcre-8.36+zlib-1.2.8【nginx全套linux环境搭建包】.rar

    在IT行业中,构建一个高效的Web服务器环境是至关重要的,这里我们关注的是基于Linux系统的Nginx服务器环境搭建。Nginx是一款高性能、轻量级的Web服务器和反向代理服务器,广泛应用于各种高并发场景。本环境搭建包包...

    软件 nginx-1.12.2.tar、pcre-8.37.tar

    Nginx是一个高性能的HTTP和反向代理服务器,常用于Web服务器领域,而PCRE(Perl Compatible Regular Expressions)则是一个强大的正则表达式库,被广泛应用于各种编程语言和软件中,包括Nginx。 **Nginx知识详解:*...

    linux安装nginx,附带依赖包openssl、pcre、zlib

    为了在Linux上成功安装Nginx,我们需要首先安装几个依赖库,包括PCRE(Perl Compatible Regular Expressions)、zlib(用于数据压缩)以及openssl(用于加密和安全通信)。以下是对每个步骤的详细说明: 1. **安装...

    nginx-pcre-zlib-openssl.zip

    Nginx是一款高性能、轻量级的Web...总之,“nginx-pcre-zlib-openssl.zip”是一个为Nginx编译准备的基础包,包含了Nginx运行所需的关键组件。正确地编译和安装这些库是构建一个功能完备且安全的Nginx服务器的第一步。

    nginx搭建所需pcre和zlibrpm包

    例如,使用PCRE,你可以创建复杂的重写规则,将一个URL重定向到另一个URL,或者根据特定模式对请求进行路由。 PCRE-devel包是PCRE的开发库,包含了头文件和库文件,用于编译和链接使用PCRE功能的应用程序,如Nginx...

Global site tag (gtag.js) - Google Analytics