`
cloudtech
  • 浏览: 4617350 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

NGINX加载动态库相关问题

 
阅读更多



1.目的:一个handler的功能可以随着业务变化不断修改,如果静态编译的话nginx本身要经常编译,稳定性得不到保证。

所以在需要的点上先写好一个稳定的handler,然后由它来加载动态库,以后的维护就放在动态库中,只编译动态库。虽然损失百分之几的性能,

但可维护性大大增加。


2.方法:在read_conf事件处理函数中根据配置加载动态库并将句柄保存到loc_conf中,然后在每次请求的时候获取这个句柄调用。

read_conf时:

ngx_test_loc_conf_t *cglcf;
cglcf = ngx_http_conf_get_module_loc_conf(cf, ngx_module_test);
char dllpath[4096] = {0};
memcpy(dllpath, cglcf->ecdata.data, cglcf->ecdata.len);
cglcf->dllHandle = dlopen(dllpath, RTLD_LAZY);
if (cglcf->dllHandle == NULL) {
printf("could not load %s: %s\n", dlerror(), dllpath);
}

然后在主进程hadler中:

ngx_test_loc_conf_t *cglcf;
cglcf = ngx_http_get_module_loc_conf(r, ngx_module_test);

void * handle = cglcf->dllHandle;
if (handle != NULL) {

ngx_int_t(*func)(ngx_http_request_t *, ngx_buf_t * buf) = dlsym(handle, "ngx_test_dll_handler");
func(r, buf);

}

句柄不需要关闭,等nginx重启时释放。

3.开始在动态库的ngx_test_dll_handler中直接处理request的输出和申请内存池,但是这是个错误的思想,在主进程的handelr中将request和out

传给动态库,在动态库函数中仅从 request中获取内容和对out.buf数据进行修改。其它所有输出,转发等控制链还是在主进程的hander。

而且这是统一的通用流程,写好以后基本不需要修改。需要修改的就是对request和out.buf的控制。

最后主进程handler改成:

ngx_chain_t out;
ngx_buf_t *buf;
buf = ngx_pcalloc(r->pool, sizeof (ngx_buf_t));
if (buf == NULL) {
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Failed to allocate response buffer.");
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
out.buf = buf;
out.next = NULL;

ngx_int_t(*func)(ngx_http_request_t *, ngx_chain_t *) = dlsym(handle, "ngx_test_dll_handler");
func(r, &out);

ngx_int_t rc;
rc = ngx_http_send_header(r);
if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
return rc;
}
return ngx_http_output_filter(r, &out);

动态库的示例为:

char * content = "This is a demo for axman.";
if (!(r->method & (NGX_HTTP_GET | NGX_HTTP_HEAD))) {
return NGX_HTTP_NOT_ALLOWED;
}
if (r->headers_in.if_modified_since) {
return NGX_HTTP_NOT_MODIFIED;
}

r->headers_out.content_type.len = sizeof ("text/html") - 1;
r->headers_out.content_type.data = (u_char *) "text/html";
r->headers_out.status = NGX_HTTP_OK;

r->headers_out.content_length_n = strlen(content);
if (r->method == NGX_HTTP_HEAD) {
return NGX_OK;
}
out->buf->pos = content;
out->buf->last = content + (strlen(content));
out->buf->memory = 1;
out->buf->last_buf = 1;
return NGX_OK;


4.so文件开始没加-g,调试进不去,编译时别忘记加-g。



分享到:
评论

相关推荐

    nginx-config-editor:自托管的Nginx配置编辑器

    使用动态配置: NGINX=/Applications/MAMP/Library/sbin/nginx CONFIG=/data/vhost node server.js 19年9月4日更新 我最近完成了一些承诺,解决了一些问题 我添加了一个编辑配置按钮。 这只是为Nginx Config Editor...

    针对OpenSSL安全漏洞调整Nginx服务器的方法

    不少服务器使用的Nginx,是静态编译 opensssl,直接将openssl编译到nginx里面去了,这就意味着,单纯升级openssl是没有任何效果,Nginx不会加载外部的 openssl动态链接库的,必须将nginx重新编译才可以根治。...

    redx:动态nginx配置

    redx的主要优点之一是无需重新加载nginx即可更新nginx配置的功能。 这对于具有高度动态拓扑的环境非常有用,在这种拓扑中,每秒都会多次添加/删除后端和前端(即PaaS)。 此外,这允许您在多个 nginx 服务器上拥有...

    ngx_brotli:用于Brotli压缩的NGINX模块

    动态加载 $ cd nginx-1.x.x $ ./configure --with-compat --add-dynamic-module=/path/to/ngx_brotli $ make modules 您将需要使用与Nginx配置完全相同的./configure参数,并在末尾附加--with-compat --add-dynami

    Java面试宝典PLUS.pdf

    包括JavaSE基础(多态、异常处理、常用API、数据类型、IO操作、集合、多线程和并发库、内部类)、JavaSE高级(反射、动态代理、设计模式&回收机制、加载器、JVM基础、GC基础)、JavaWeb基础(JDBC技术、HTTP协议、...

    Dream项目管理系统 v1.1.zip

    Dream后端采用了ThinkPHP,前端采用EasyUI库等主流框架开发而成,中文api说明文档详细。让开发者上手迅速,使用起来得心应手,从而最大程度的缩短开发周期,降低开发成本。   入门说明 普通用户使用时非常简单...

    vagrant-orthanc:Orthanc DICOM服务器的“无家可归”框

    构建 Lastest插件并加载(动态链接) 构建 Lastest插件并加载(动态链接) 构建 Lastest插件并加载(动态链接) 安装PostgreSQL并创建orthanc数据库。 安装nginx并将其用作反向代理以允许(带有请求的HTTP代理...

    Dream项目管理系统 v1.1.rar

    Dream后端采用了ThinkPHP,前端采用EasyUI库等主流框架开发而成,中文api说明文档详细。让开发者上手迅速,使用起来得心应手,从而最大程度的缩短开发周期,降低开发成本。 入门说明 普通用户使用时非常简单,...

    梦赢开源权限管理系统 v2.0.rar

    Winner后端采用了ThinkPHP,前端采用EasyUI库等主流框架开发而成,中文api说明文档详细。让开发者上手迅速,使用起来得心应手,从而最大程度的缩短开发周期,降低开发成本。 入门说明 在二次开发Winner权限...

    梦赢开源权限管理系统 v2.0.zip

    Winner后端采用了ThinkPHP,前端采用EasyUI库等主流框架开发而成,中文api说明文档详细。让开发者上手迅速,使用起来得心应手,从而最大程度的缩短开发周期,降低开发成本。   入门说明 在二次开发Winner权限...

    AnsibleDockerScaler:在非Kubernetesswarm环境下使用Ansible扩展容器

    动态nginx配置 现有Nginx安装上的负载均衡容器(前端) 自动重新加载Nginx 根据当前/所需状态管理容器 自动检测容器IP 自动名称生成(container_1,container_2 ...) 自动清理退出的容器,未使用的图像和未标记...

    多备份数据更新管理器模板设计(C++ Template)

    2)运行时修改一个算法模块(动态库); 为了在执行这些任务时,程序不停(仍使用旧配置或旧模块运行),常见的解决方案包括: 1)增加冗余的配置项或模块句柄的存储空间(所有这些数据打包成一个结构体),程序...

    simegraph:动画.jpg。 一个小的 javascript 库和一些创建高质量动画 jpeg 的视图

    由于动画分为静态图像和动态部分,因此可以在动态部分加载完成之前显示图像。 与 gifv 相比如何 首先,gifv 旨在成为一种视频格式,simegraph JS 不是一种格式,而是一种为照片(静态图像)添加一点动画效果的方法...

    multiple-nextjs-apps:在同一域上运行多个nextjs应用程序的示例

    !!! 请注意 !!! (10/2020)此概念证明已过时。 NextJS现在完全支持设置基本路径。 请参阅: : 我将在可能的情况下尝试更新...2. Nginx配置在nginx配置中,处理了两件事:页面请求和资产前缀请求被发送到正确的应

    收集优秀的编程资源(Java为主).zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

    vikus-viewer:沿着时间,质地和主题探索文化收藏

    VIKUS查看器是一个基于Web的可视化系统,可以在动态画布上排列数千种文化文物,并支持对大型馆藏的主题和时间模式进行探索,同时提供对高分辨率图像的快速访问。文献资料此存储库包含VIKUS Viewer软件HTML,CSS和JS...

    vikus-viewer

    是一个基于Web的可视化系统,可以在动态画布上排列数千种文化文物,并支持对大型馆藏的主题和时间模式进行探索,同时提供对高分辨率图像的快速访问。 文献资料 此存储库包含VIKUS Viewer软件HTML,CSS和JS。首先,您...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【Nginx】Nginx如何配置防止DDOS攻击? 139 限制每秒请求数 139 限制IP连接数 139 白名单设置 139 【数据结构】数组与链表的优缺点 139 【算法】什么是hash? 140 【算法】排序 141 【算法】冒泡排序 141 【算法】...

    百度翻译源码java-awesome-stars:我自己的真棒清单!

    一种预加载器,它在动态链接的程序中钩住对套接字的调用,并通过一个或多个袜子/http 代理重定向它。 未维护的代理链项目的延续。 sf.net 页面当前未更新,请改用 github 发布页面的发布。 - 唯一的密钥生成服务器 -...

    亿级流量电商详情页系统实战-缓存架构+高可用服务架构+微服务架构

    12、大型电商网站的前端页面的核心业务逻辑:完整讲解了大型电商网站的前端页面如何与后端整套系统配合的业务逻辑,包括了动态渲染系统直接渲染首屏的商品基本信息,滚屏时Ajax异步加载分段存储的商品介绍,Ajax异步...

Global site tag (gtag.js) - Google Analytics