Nginx tips
internal
指令.
只能用于location
上下文;
表示只能是内部请求可以访问该location
;
每个内部请求最多只能跳转10
次, 超过限制次数, 会在error_log
中打印500错误.
关闭日志
nginx 关闭某个server 块的access_log
和error_log
, 特别注意关闭error_log
的用法.
|
|
last
和break
的区别
break和last都能阻止继续执行后面的rewrite指令, last对于重写后的URI会重新匹配location, 而break不会重新匹配location.
last: 停止当前这个请求, 并根据rewrite匹配的规则重新发起一个内部请求. 新请求又从第一阶段开始执行.
break: 相对last, 重写完URI后, break并不会重新发起一个请求, 而只是跳过当前的rewrite阶段, 并执行本请求location后续的执行阶段.
请求头字段不能使用下划线
nginx默认request的header的中包含_
时, 会自动忽略掉.
解决方法是: 在nginx里的nginx.conf
配置文件中的http部分中添加如下配置:
|
|
另外不建议开启, 因为可能会存在安全风险.
理解ngx_http_stub_status_module
模块引入的几个参数
|
|
ngx-http-proxy-module
模块引入的缓存功能的缓存文件说明
|
|
理解$proxy_add_x_forwarded_for
|
|
这么理解:
用户请求前端nginx, 前端nginx设置的proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for
指令, 把用户IP(即$remote_addr
)赋值给x-forwarded-for
头传递给kong,
kong nginx设置的proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for
指令,把前端的IP(即$remote_addr
)追加给x-forwarded-for
头, 以逗号分隔, 传递给后端服务.
这样后端看到的x-forwarded-for
头的值就是两个IP了, 用户ip和前端ip.
去掉用户请求uri结尾的/
|
|
map指令用法
map指令是由ngx_http_map_module
模块提供的, 默认情况下安装nginx都会安装该模块.
map 的主要作用是创建自定义变量, 通过使用nginx的内置变量, 去匹配某些特定规则, 如果匹配成功则设置某个值给自定义变量. 而这个自定义变量又可以作于他用.
场景:
匹配请求url的参数, 如果参数是debug则设置$foo = 1
, 默认设置$foo = 0
|
|
解释:
$args
是nginx内置变量, 就是获取的请求 url 的参数. 如果$args
匹配到debug,
那么$foo
的值会被设为1
, 如果$args
一个都匹配不到$foo
就是default
定义的值,
这里就是0
.
另一个例子:
|
|
通过以上代码来说明map
的一些用法:
map
只能用于http
上下文;
只有变量slice_store
在使用的时候才会被赋值, 所以即使有很多条map语句,
对于没有使用该变量的清气来说也不会产生任何额外开销;
由上一条说明可知$channel
变量可以在之后再定义;
hostnames
是map的一个参数, 并不是作为channel
变量的值存在的;
参数hostnames
必须在map块的第一行,
hostnames
表明channel
变量的值可以是有前缀或者是有后缀的域名,
比如channel
变量的值如果是: *.example.com on
或者是example.* off
等,
那么slice_store
变量的值就是on
或off
,
如果channel
变量值是*.example.com ""
或者channel
变量没有值,
那么slice_store
变量值将是default
的值off
.
location指令详解
|
|
[ = | ~ | ~* | ^~ ]
释疑
[ = | ~ | ~* | ^~ ]
表示location
后有如下5种修饰符的情况:
=
: 后面的uri
是字符串, 对请求的uri
做精确匹配(不匹配请求uri
的参数), 该location
被匹配到后终止继续匹配.^~
:uri
是字符串, 修饰符由一个非符号^
和一个正则符号~
组成, 表示本location
匹配完成后, 不继续匹配正则表达式的location
.~
:uri
是正则表达式, 对请求的uri
做正则匹配, 大小写敏感.~*
:uri
是正则表达式, 对请求的uri
做正则匹配, 大小写不敏感.没有修饰符
:location
后uri
前没有任何修饰符,uri
是字符串, 对请求的uri
做字符串前缀匹配, 匹配到一个字符串最长的location
, 然后继续匹配正则表达式的location
.
匹配顺序说明
如果在同一个上下文配置块内有多个location block
, 针对上面介绍的5种类型location
, Nginx
的匹配顺序为:
首先匹配uri
是字符串的location
, 包括没有修饰符
的、修饰符是=
和^~
的, 这3三种location
按照在配置文件出现的先后顺序依次匹配;
如果遇到=
修饰符的并且匹配上了, 就立刻终止继续匹配;
否则将这3种location
全部匹配一遍, 匹配完成后, 如果修饰符是^~
的某个uri
字符串最长的location
匹配上了, 则终止继续匹配;
否则记录下匹配到的没有修饰符的uri
字符串最长的location
, 并继续匹配修饰符是~
和~*
的location
, 这2种location
按照在配置文件中出现的先后顺序依次匹配, 匹配上就马上终止继续匹配;
如果都没有匹配上, 则使用之前记录下来的没有修饰符的uri
字符串前缀最长的那个location
.