当前位置: 首页 > news >正文

做门户网站广告贵州住房建设厅网站

做门户网站广告,贵州住房建设厅网站,上海建筑建材业网电话,青岛市黄岛区城市建设局网站目录 1. 缘起2. 解决方案2.1 保留指定模块的上下文信息2.2 获取指定模块的上下文信息2.3 设置指定模块的上下文信息2.4 设置模块上下文是否需要继承标记2.5 对openrety lua代码的支持 1. 缘起 nginx提供了非常棒的功能#xff0c;命名location#xff0c;如文章nginx的locati… 目录 1. 缘起2. 解决方案2.1 保留指定模块的上下文信息2.2 获取指定模块的上下文信息2.3 设置指定模块的上下文信息2.4 设置模块上下文是否需要继承标记2.5 对openrety lua代码的支持 1. 缘起 nginx提供了非常棒的功能命名location如文章nginx的location匹配规则中描述有时候我们可以通过lua脚本在openresty中或者自研nginx插件模块根据相应的业务规则将某些请求转发到特定的命名location中执行相应的业务逻辑。 假设我们的location配置如下 location / {content_by_lua_block { local uri ngx.var.uri if string.match(uri, %.mp4$) then ngx.exec(mp4) elseif string.match(uri, %.flv$) thenngx.exec(flv)elsengx.exit(ngx.HTTP_NOT_FOUND)end}}location mp4 {internal;mp4; # 开启mp4流媒体功能root ./html;}location flv {internal;flv; # 开启flv流媒体功能root ./html;}那么nginx会在匹配到以.mp4为后缀的uri时候将请求转发到mp4的location当匹配到.flv为后缀的uri时候将请求转发到flv的location否则响应404。当然大家可能认为好像没有必要那么复杂直接用[[nginx的location匹配规则]]中说的那样直接用location匹配也可以达到以上目的。本案例只是一个简化的情况如果是在一个提供多租户服务的CDN系统中一个边缘cachecache前端可以用nginx来提供需要配置成千上万的域名每个域名都会有不同的location规则如果每个域名都配置一个server那么会给nginx带来比较大的配置加载的负担我们一般的实现是只有一个server一个location匹配所有客户的域名和location然后通过lua程序将用户的请求根据动态配置信息转发到几个预先设置好的location中提供不同的服务譬如MP4流媒体locationflv流媒体location大文件下载location等等。   这种情况下不一定每个客户的mp4文件都是以mp4为后缀的flv文件是以flv为后缀的而是需要根据客户的在线配置需求动态配置的所以可以通过lua程序根据来源域名匹配到相应的规则然后将请求动态转发到对应的命名location中。   然而在实践中我们发现nginx的命名转发功能会把http模块的上下文信息清空导致在命名location中ngx_http_reqeust_t对象获取不到转发前的模块上下文从而使转发前和转发后的上下文信息无法传递带来一些困扰。nginx的原生代码如下 ngx_int_t ngx_http_named_location(ngx_http_request_t *r, ngx_str_t *name) {ngx_http_core_srv_conf_t *cscf;ngx_http_core_loc_conf_t **clcfp;ngx_http_core_main_conf_t *cmcf;r-main-count;r-uri_changes--;if (r-uri_changes 0) {ngx_log_error(NGX_LOG_ERR, r-connection-log, 0,rewrite or internal redirection cycle while redirect to named location \%V\, name);ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);return NGX_DONE;}if (r-uri.len 0) {ngx_log_error(NGX_LOG_ERR, r-connection-log, 0,empty URI in redirect to named location \%V\, name);ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);return NGX_DONE;}cscf ngx_http_get_module_srv_conf(r, ngx_http_core_module);if (cscf-named_locations) {for (clcfp cscf-named_locations; *clcfp; clcfp) {ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r-connection-log, 0,test location: \%V\, (*clcfp)-name);if (name-len ! (*clcfp)-name.len|| ngx_strncmp(name-data, (*clcfp)-name.data, name-len) ! 0){continue;}ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r-connection-log, 0,using location: %V \%V?%V\,name, r-uri, r-args);r-internal 1;r-content_handler NULL;r-uri_changed 0;r-loc_conf (*clcfp)-loc_conf;/* clear the modules contexts *//* 清理本request的所有模块的上下文 */ngx_memzero(r-ctx, sizeof(void *) * ngx_http_max_module);ngx_http_update_location_config(r);cmcf ngx_http_get_module_main_conf(r, ngx_http_core_module);r-phase_handler cmcf-phase_engine.location_rewrite_index;r-write_event_handler ngx_http_core_run_phases;ngx_http_core_run_phases(r);return NGX_DONE;}}ngx_log_error(NGX_LOG_ERR, r-connection-log, 0,could not find named location \%V\, name);ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);return NGX_DONE; }上述代码中,有一行代码 ngx_memzero(r-ctx, sizeof(void *) * ngx_http_max_module);它负责清理当前http request的所有模块的上下文信息从而导致转发前设置的上下文信息在转发后再去获取的时候就变成了NULL。 2. 解决方案 2.1 保留指定模块的上下文信息 将函数ngx_http_named_location中的这行代码 ngx_memzero(r-ctx, sizeof(void *) * ngx_http_max_module);改成 /* clear only the modules contexts which are not derivable */for (i 0; i ngx_http_max_module; i){if ( ((uintptr_t)r-ctx[i] (uintptr_t)0x01u) 0 ){r-ctx[i] NULL;}意思是如果http request的某个ctx元素中保存的指针地址如果最低位是0才清理上下文否则保留上下文信息。因为在系统中指针地址至少是按4byte对齐的所以最低的两位一定是0我们这里就是用最低位的0来表示是否需要在命名location跳转的时候保留对应模块的保留上下文信息。 2.2 获取指定模块的上下文信息 如上文描述由于上下文指针地址中的值可能复用的一个标记位实际值不是对应的真正的上下文内存地址所以需要对原先获取模块上下文信息的宏定义进行改造原来为 #define ngx_http_get_module_ctx(r, module) (r)-ctx[module.ctx_index]改成 #define ngx_http_get_module_ctx(r, module) \(void*)((uintptr_t)(r)-ctx[module.ctx_index] ~(uintptr_t)1u)2.3 设置指定模块的上下文信息 原生的设定上下文代码如下 #define ngx_http_set_ctx(r, c, module) r-ctx[module.ctx_index] c;这块沿用原生的代码不用更改。 2.4 设置模块上下文是否需要继承标记 代码如下 #define ngx_http_set_ctx_derivable(r,module) \r-ctx[module.ctx_index] (void*) \((uintptr_t)ngx_http_get_module_ctx(r,module) | (uintptr_t)1u)#define ngx_http_unset_ctx_derivable(r,module) \r-ctx[module.ctx_index] (void*) \((uintptr_t)ngx_http_get_module_ctx(r,module) ~(uintptr_t)1u)程序逻辑需要设定某个模块可以被named location跳转继承那么就调用 ngx_http_set_ctx_derivable(r, module_name)emps;  反之则调用 ngx_http_unset_ctx_derivable(r, module_name)2.5 对openrety lua代码的支持 以上代码修改完成后已经可以完美支持nginx的c插件模块的上下文的继承设置了但是对于openresty lua代码我们还需要对openresty开放相关的接口或者如果希望强制openresty lua模块每次在named location跳转的时候都需要继承上下文信息那么可以修改ngx_http_lua_handle_exec代码如下 static ngx_int_t ngx_http_lua_handle_exec(lua_State *L, ngx_http_request_t *r,ngx_http_lua_ctx_t *ctx) {ngx_int_t rc;ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r-connection-log, 0,lua thread initiated internal redirect to %V,ctx-exec_uri);ngx_http_lua_cleanup_pending_operation(ctx-cur_co_ctx);ngx_http_lua_probe_coroutine_done(r, ctx-cur_co_ctx-co, 1);ctx-cur_co_ctx-co_status NGX_HTTP_LUA_CO_DEAD;if (r-filter_finalize) {ngx_http_set_ctx(r, ctx, ngx_http_lua_module);}ngx_http_lua_request_cleanup(ctx, 1 /* forcible */);if (ctx-exec_uri.data[0] ) {if (ctx-exec_args.len 0) {ngx_log_error(NGX_LOG_WARN, r-connection-log, 0,query strings %V ignored when execing named location %V,ctx-exec_args, ctx-exec_uri);}r-write_event_handler ngx_http_request_empty_handler;#if 1if (r-read_event_handler ngx_http_lua_rd_check_broken_connection) {/* resume the read event handler */r-read_event_handler ngx_http_block_reading;} #endif/* 设置lua模块的ctx在named_location跳转的时候保持原始的ctx */ngx_http_set_ctx_derivable(r, ngx_http_lua_module);rc ngx_http_named_location(r, ctx-exec_uri);if (rc NGX_ERROR || rc NGX_HTTP_SPECIAL_RESPONSE) {return rc;} ......return NGX_DONE; }
http://www.zqtcl.cn/news/19105/

相关文章:

  • 天津网站建设学习邢台移动网站建设价格
  • 网站的风格与布局的设计方案泰州专门做网站
  • 正黄集团博弘建设官方网站网址在线生成二维码
  • 网站建设注意哪些方面网站制作哪里好薇
  • 北京微网站建设设计服务欧美做受网站视频播放
  • wordpress数据库设置苏州seo推广优化
  • 网站 如何添加备案号建设网站所需材料
  • 大网站网站建设一般需要多少钱
  • 免费电视剧网站大全在线观看常州建设工程信息网
  • 免费培训课程沈阳网站推广优化
  • 猪八戒设计网站官网网站风格确定
  • 特色专业建设验收网站网站关键词排名没有了
  • access 数据库做网站东昌网站建设
  • 任何网站都可以做谷歌推广的吗wordpress锚文字
  • 响应式旅游网站模版网站选择城市怎么做
  • wordpress网站图片加载速度慢wordpress英文评论
  • 合肥网站seo优化排名一级a做片性视频.网站在线观看
  • 嘉兴网站建设定制网站怎么设置404页面
  • 网站模版html58招聘求职找工作
  • 网站seo在线检测wordpress对文章归档
  • 开发网站费用做任务的阅币漫画网站
  • 网站建设公众号小程序开发巢湖seo推广
  • 杭州网站建设维护金融直播间网站开发
  • 外贸企业网站红色风格手机网站 侧边栏导航
  • 班级网站建设的系统概述wordpress 51la
  • 在线装修设计网站网站可以用cdr做吗
  • 营口网站建设网站建设规划书参考模板
  • 网站开发创业上海网站建设信息网
  • 东丽网站建设公司外贸仿牌网站被封的后果
  • 做网站个人怎么签合同wordpress房产中介模板