[转帖]nginx的map指令

nginx,map,指令 · 浏览次数 : 0

小编点评

**ngx_http_map_module 模块** ngx_http_map_module 模块是一个用于创建自定义变量的模块。它允许您使用 `map` 指令对请求中的变量进行匹配,并设置或获取这些变量的值。 **主要功能:** - 创建自定义变量 - 使用 `nginx` 内置变量作为匹配规则 - 在页面输出中使用自定义变量 **使用方法:** ```nginx map $uri $match { ~^/www/(.*) http://www.wzj.com/; ~http://m.haibakeji.com/ http://harbor.wzj.com/; ~http://nginx.wzj.com/ http://nginx.wzj.com; } ``` **示例:** 该示例定义了匹配 `/www/` 和 `/m.haibakeji.com` 的规则,并为匹配的请求设置 `Access-Control-Allow-Origin` 指令。 **其他特性:** - `map` 指令允许您使用各种数据类型作为变量,包括字符串、数字、布尔值和对象。 - 在 `map` 中,您可以使用正则表达式进行匹配。 - 您可以使用 `default` 指令指定默认值。 **注意:** - `map` 指令只能用于 `map` 指令中。 - `map` 指令的匹配优先级从左到右。 - 您可以使用 `$1`、`$2` 等变量引用匹配的第一个和第二个字符。

正文

一    ngx_http_map_module模块

  1. 1) map 指令是由 'ngx_http_map_module 模块'提供的,默认情况下安装 nginx 都会'安装'该模块.
  2. 2) map 的主要作用是'创建自定义变量',通过使用 nginx 的'内置'变量,去'匹配'某些特定规则;如果匹配成功则设置某个值给自定义变量,而这个'自定义变量'又可以'用作他用'

  1. 强调:和'内置变量'才能玩出'花样'
  2. 说明:'string'一般我们会用'nginx的内置变量'来代替,不会直接写'裸值',便于'动态'
  3. 补充:已知'set、map、正则命名补获(?<name>.*)'三种方式来'设置变量'

1)正则扩展 

2)正则注意事项

3)nginx的命名补获 

 4)补充

①    简单案例

  1. map $args $foo {
  2. default 0;
  3. debug 1;
  4. }
  5. 变量解读:$args 是nginx'内置[inner]'变量,$foo是我们自定义的'普通[common]'变量
  6. 附加:$args 这个变量等于'请求行中(GET请求)的参数',例如foo=123&bar=wzj;
  7. 效果:如果 $args '匹配到 debug' 那么 $foo 的值会'被设为 1 ';如果 $args 一个都'匹配不到' $foo 就是'default 定义的值',在这里就是 0
  8. 大白话:类似于一个'if/else'判断,设置'变量值'

②  案例一:nginx开启websocket代理功能

  1. http {
  2. ...
  3. # 是否是'websocket'
  4. map $http_upgrade $connection_upgrade {
  5. default upgrade;
  6. '' close;
  7. }
  8. location /v1/kind {
  9. proxy_set_header Upgrade $http_upgrade;
  10. proxy_set_header Connection $connection_upgrade;
  11. # proxy_set_header Connection "upgrade"; -->对比二者的区别?
  12. ...
  13. }
  14. }

websocket协议为什么HTTP Upgrade的时候需要Connection: upgrade ?

WebSocket为什么需要Connection和Upgrade两个header?

nginx支持websocket反向代理

③  案例二:后端代理切不同的版本、或者兰绿发布

  1. upstream upstream_k8s {
  2. server ip:port;
  3. ...
  4. }
  5. upstream upstream_default {
  6. server ip:port
  7. }
  8. # zone是存储区域
  9. limit_req_zone $client_real_ip zone=A:100m rate=1000r/s
  10. limit_conn_zone $client_real_ip zone=B:100m;
  11. # 变量必须是nginx的内置变量吗? -->'非必须'
  12. map $COOKIE_k8s_flag $k8s {
  13. # 等待匹配的字符串可以不加引号
  14. k8s1 upstream_k8s;
  15. # 说明:upstream_default和upstream_k8s与前面的映射
  16. deafult upstream_default;
  17. }
  18. location /k8s {
  19. limit_req zone=A burst=10000 nodelay;
  20. limit_conn B 1000;
  21. # 注意引入方式
  22. proxy_pass https://${k8s};
  23. ...
  24. }

④  案例三:跨域名访问

  1. # 这些配置可以写在 http{} 或者 server{} 都是'支持'的
  2. add_header Access-Control-Allow-Origin "http://www.wzj.com";
  3. add_header Access-Control-Allow-Methods "POST, GET, PUT, OPTIONS, DELETE";
  4. add_header Access-Control-Max-Age "3600";
  5. add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
  6. 1) 上面的配置'只允许' http://www.wzj.com 跨域访问
  7. 2) 如果要支持'所有域名'都可以跨域调用该站, 不过'不推荐'这样做,因为'不安全'
  8. add_header Access-Control-Allow-Origin "*";
  9. ++++++++++++++"不想允许所有,但是又需要允许多个域名,那么就需要用到 map"++++++++++++++
  10. 需求: 使用 map 来实现允许'多个域名跨域'访问的问题
  11. map $http_origin $corsHost {
  12. default 0;
  13. "~http://www.wzj.com" http://www.wzj.com;
  14. "~http://m.haibakeji.com" http://harbor.wzj.com;
  15. "~http://nginx.wzj.com" http://nginx.wzj.com;
  16. }
  17. server{
  18. listen 80;
  19. server_name www.wzj.com;
  20. root /nginx;
  21. location /
  22. {
  23. add_header Access-Control-Allow-Origin $corsHost;
  24. ...
  25. }
  26. }

⑤  map相关调试

  1. 需求:使用源变量'通常是 nginx 内置变量'匹配一些规则,创建自定义变量,然后在页面输出. 这通常在'调试'的时候非常有用
  2. 复制代码
  3. http {
  4. map $uri $match {
  5. # 说明:default可以'省略'
  6. ~^/www/(.*) http://www.wzj.com/;
  7. }
  8. server {
  9. listen 8080;
  10. server_name harbor.wzj.com;
  11. location /www {
  12. default_type text/plain;
  13. echo uri: $uri;
  14. echo match: $match;
  15. echo capture: $1;
  16. echo new: $match$1;
  17. }

⑥  map性能问题

⑦  匹配优先级

map相关参考 

</article>

与[转帖]nginx的map指令相似的内容:

[转帖]nginx的map指令

一 ngx_http_map_module模块 1) map 指令是由 'ngx_http_map_module 模块'提供的,默认情况下安装 nginx 都会'安装'该模块. 2) map 的主要作用是'创建自定义变量',通过使用 nginx 的'内置'变量,去'匹配'某些特定规则;如果匹配成功则

【转帖】nginx变量使用方法详解-4

https://www.diewufeiyang.com/post/578.html 在设置了“取处理程序”的情况下,Nginx 变量也可以选择将其值容器用作缓存,这样在多次读取变量的时候,就只需要调用“取处理程序”计算一次。我们下面就来看一个这样的例子: Bash map $args $foo {

[转帖]nginx中map使用方法

场景: 匹配请求 url 的参数,如果参数是 debug 则设置 $foo = 1 ,默认设置 $foo = 0 map $args $foo { default 0; debug 1;} $args 是nginx内置变量,就是获取的请求 url 的参数。 如果 $args 匹配到 debug 那么

[转帖]Nginx代理获取后端用户真实IP

https://www.cnblogs.com/paul8339/p/15740137.html nginx代理后想获取用户的真实IP, 1.在http 模块内增加map模块参数: map $http_x_forwarded_for $clientRealIp { "" $remote_addr;

[转帖]nginx的proxy_next_upstream使用中的一个坑

https://zhuanlan.zhihu.com/p/35803906 今天线上系统出了点问题,机房的电信出口突然不通了,原本以为能自动切换的nginx配置,居然没有生效,导致了业务告警,手工紧急处理了才解决了。 当时的设想是,如果这个服务的访问,出现了500或者超时的情况,会自动重试到下一个服

[转帖]nginx的重试机制 proxy_next_upstream

https://blog.csdn.net/xiao__gui/article/details/89441162 https://zhuanlan.zhihu.com/p/35803906 https://www.cnblogs.com/powerwu/articles/9791295.html h

[转帖]nginx的ip_hash算法

概念 根据用户请求的ip,利用算法映射成hash值,分配到特定的tomcat服务器中。主要是为了实现负载均衡,只要用户ip固定,则hash值固定,特定用户只能访问特定服务器,解决了session的问题。 源码分析 ip_hash算法的处理代码位于src\http\modules\ngx_http_u

[转帖]nginx的Mainline version、Stable version、Legacy version的版本区别

https://blog.csdn.net/zwjzwj520520/article/details/62883317 Nginx官网提供了三个类型的版本Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版Stable version:最新稳定版,生

[转帖]NGINX的一些SEO优化常用配置

https://www.jianshu.com/p/e55073e5ebc7 官方文档:http://nginx.org/en/docs/ 常用模块: ngx_http_core_module ngx_http_rewrite_module ngx_http_proxy_module ngx_htt

[转帖]Nginx的热加载

https://www.zhihu.com/question/531861487/answer/2850763798 有websocket 时并不能立即生效.. 这段时间在 Reddit 看到一个讨论,为什么 NGINX 不支持热加载?乍看之下很反常识,作为世界第一大 Web 服务器,不支持热加载?