nginx中的多路分支 - nginx map

引言 在 NGINX 中常用一种 “比较变量” 的手法,在编程语言中称为 “多路分支” (Case statement),也就是 nginx map,需要注意的一点是,太低版本 NGINX MAP 中只能使用单变量 Before version 0.9.0 only a single variable could be specified in the first parameter. [1] 下面将了解下 nginx map 的具体使用方式 nginx map使用 Nginx 配置主要是声明性的,这同样应用于 MAP 指令,NGINX MAP 是定义在 http{} 级别,最大的特点是仅在引用时进行处理, 如果请求未触及使用 NGINX MAP 变量的配置部分,则不会执行该 map 变量查找。换句话来理解,当在上下文 server, Location, if 等中使用结果变量时(指定的不是计算结果,而是在需要时计算该结果的公式),才会被使用,在 NGINX 需要使用该变量之前,NGINX MAP 不会给请求增加任何开销。 NGINX MAP 用于根据另一个变量的值创建一个变量,如下所示: conf map $variable_to_check $variable_to_set { "check_if_variable_matches_me" "variable_matches_checked_value"; default "no_match"; } 在上面的例子中, 变量 $variable_to_set 的被设置的结果为:如果 $variable_to_check 值为 “check_if_variable_matches_me”, 那么 $variable_to_set 将被设置为值 “variable_matches_checked_value” , 否则将设置为 “no_match”。...

 ·  · 

修改ingress-nginx中default backend默认状态码

什么是 default backend default backend 是 ingress-nginx 中的一个服务,主要用于处理 nginx controller 无法识别的而请求的服务 主要提供了两个接口 /healthz that returns 200 /that returns 404 如何改default backend 状态码 需求:修改 default backend 状态码 404 为 403 原理:nginx-controller 启动时指定了一个 default backend 容器,如下所示 bash 1 2 3 4 5 6 7 8 9 10 11 12 containers: - args: - /nginx-ingress-controller # 这里指的是 default-backend 的名称 {namespace_name}/{service_name} - --default-backend-service=$(POD_NAMESPACE)/ingress-nginx-ext-defaultbackend - --publish-service=$(POD_NAMESPACE)/ingress-nginx-ext-controller - --election-id=ingress-controller-leader - --ingress-class=nginx-yewu-ext - --configmap=$(POD_NAMESPACE)/ingress-nginx-ext-controller - --validating-webhook=:8443 - --validating-webhook-certificate=/usr/local/certificates/cert - --validating-webhook-key=/usr/local/certificates/key 通常情况下在通过定义配置文件方式改变是不容易做的,ingress-nginx 提供了一种自定义方式 “custom-error-pages“ 可以完成 ,完成后该 defaultBackend 支持使用 X-code方式自定义任意的错误页即错误码。...

 ·  · 

踩坑nginx proxy_pass GET 参数传递

场景 在配置代理后,GET 请求的变量全部失效,配置如下 conf location /fw { proxy_pass http://127.0.0.1:2952; } 我的需求是,/fw/ 的都发往 2952端口,但实际情况是404,原因为“在没有指定 URI 的情况下,在1.12版本后会传递原有的URI” 这时会导致一个404错误,因为我的后端接口本身就是 /fw/xxx/ 会出现重复 接下来做了一个变量传递 conf location ~* /fw/(?<section>.*) { proxy_pass http://127.0.0.1:2952/fw/$section; } 这时存在一个问题,就是 GET 请求的变量无法传递过去 解决 nginx 官方给出一个样例,说明了,存在某种情况下,nginx 不会确定请求 URI 中的部分参数 使用正则表达式时 在 localtion 名称内 例如,在这个场景下,proxy_pass 就会忽略原有的请求的URI,而将拼接后的请求转发 conf location /name/ { rewrite /name/([^/]+) /users?name=$1 break; proxy_pass http://127.0.0.1; } 那么这服务我遇到的问题,nginx官方给出了使用方式 当在 proxy_pass 中需要变量,可以使用 $request_uri; 另外也可以使用 $is_args$args 参数 来保证原有的请求参数被传递 conf location ~* /fw/(?<section>.*) { proxy_pass http://127.0.0.1:2952/fw/$section$is_args$args; } $is_args...

 ·  · 

解决nginx在docker中报错 [rewrite or internal redirection cycle while internally redirecting to "/index.html]

vue项目部署在裸机Linux上运行正常,部署在docker中nginx出现下列错误 text 1 Nginx "rewrite or internal redirection cycle while internally redirecting to "/index.html" 表现在用户界面 500 Internal Server Error 原因:nginx配置路径不对,改成正确的后恢复

 ·  · 

使nginx支持分布式追踪

Background NGINX 是一个通用且流行的应用程序。也是最流行的 Web 服务器,它可用于提供静态文件内容,但也通常与其他服务一起用作分布式系统中的组件,在其中它用作反向代理、负载均衡 或 API 网关。 分布式追踪 distributed tracing 是一种可用于分析与监控应用程序的机制,将追踪在从源到目的的整个过程中的单个请求,这与仅通过单个应用程序域来追踪请求的形式不同。 换句话说,我们可以说分布式追踪是对跨多个系统的多个请求的拼接。拼接通常由一个或多个相关 ID 完成,并且跟踪通常是一组记录的、跨所有系统的结构化日志事件,存储在一个中心位置。 在这种背景的情况下, OpenTracing 应运而生。OpenTracing 是一个与应用供应商无关的 API,它可帮助开发人员轻松地跟踪单一请求的域。目前有多种开源产品都支持 OpenTracing(例如,Jaeger, skywalking 等),并将其作为一种检测分布式追踪的标准化方法。 本文将围绕,从0到1实现在nginx配置分布式追踪的架构的简单实例说明。本文实例使用的组件为 nginx v1.22 jaeger-all-in-on v1.38 nginx-opentracing v1.22 jaeger-client-cpp v0.9 源码构建nginx-opentracing 准备nginx-opentracing nginx-opentracing 仓库中可以看到,官方为每个nginx版本都提供了一个编译好的动态库(Nginx1.19.13+),我们可以直接拿来使用这个动态库,如果你想将这个利用Nginx 提供的编译参数 --add-module=/path/to/module 构建为nginx的内置功能的话,可能会出现一些问题,例如下面的一些错误: text 1 ngx_http_opentracing_module.so/config was found bash 1 2 3 /root/nginx-opentracing-0.25.0/opentracing//src/ngx_http_opentracing_module.cpp In file included from /root/nginx-opentracing-0.25.0/opentracing//src/ngx_http_opentracing_module.cpp:1:0: /root/nginx-opentracing-0.25.0/opentracing//src/load_tracer.h:3:38: fatal error: opentracing/dynamic_load.h: No such file or directory 根据 issue 中查询得知 nginx-opentracing 需要嵌入到nginx中,是需要一些 opentracing-cpp 因为对c++不熟,尝试调试很久还是上面的错误,故直接使用了官方提供的动态库。...

 ·  ·