nginx配置笔记
1.0. nginx配置
nginx
配置说简单也简单,说复杂也复杂,入门简单,精通难(怎么感觉有点像javascript
?),主要是nginx
自身有很多专属的语法和命令以及让人捉摸不透的运行规则,不系统的学习一下很容易出错,有时候即使工作很多年的同学想配置一些特殊场景时可能也会折腾半天才能搞定。
一个nginx配置文件大体长下面这样,绝大部分配置都写在http
里面(省略了很多默认配置):
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
root html;
index index.html index.htm;
}
location /test {
proxy_pass https://wangmiaozero.cn;
}
}
}
一般开发者需要经常打交道的大部分配置都在server
和location
里面。
一些注意事项:
- 注释采用
#
; - 所有配置必须以
;
结尾,不写会报错; - 每个命令注意允许使用的上下文,例如有些命令可以写在
http
、server
、location
等多个上下文,有的则只能出现在某一种上下文里面;
常见命令简要说明:
include
:引入外部文件,当配置文件较多时可以分开写在不同文件,然后一次性引入即可,例如include servers/*;
default_type
:设置默认内容类型;server_name
:域名,支持空格配置多个;listen
:监听端口;proxy_pass
:转发;root
:指定根目录;rewrite
:重写;
1.1. location配置
location粗略看只有4种配置:精确匹配、^~开头匹配、正则匹配、/匹配,细分有7种,优先级从高到低依次是:
=
:精确匹配,优先级最高;/test/aaa/bbb.html
:完整路径匹配,如果访问路径和location配置完全相等,那么这条配置自然会优先匹配,它的优先级仅次于精确匹配;^~ /test
开头:匹配以/test
开头的地址,如果匹配成功会停止向后继续搜索;~
:区分大小写的正则匹配,如果匹配成功会停止向后继续搜索;~*
:不区分大小写的正则匹配,如果匹配成功会停止向后继续搜索,2种正则匹配优先级相同;/test
:匹配以/test
开头的地址,匹配成功后还会继续往后匹配,直至结束,以最后一个匹配为准;/
:匹配以/
开头的地址,由于任何地址都是以/
开头,所以所有地址都会命中这个规则,但它优先级最低,一般放在最后做backup;
记住以下2点就可以了
- 整体优先级:
精确匹配
>完整路径匹配
>^~
> 正则匹配 >/
起始路径 >/
; - 除了
/
开头配置是匹配成功还会继续往后匹配之外,其它所有配置都是成功就立即停止; - 不同类型的规则,不管先后顺序如何,始终按照上述优先级来;
- 同种类型的规则则分情况不同:
- 多个正则之间、多个
^~
之间,第一个匹配生效,与顺序有关;- 都是/开头时,最长匹配生效,和先后顺序无关;
关于正则写法,除了开头结尾不需要/
之外,和JS
的正则差不多,要实现精确匹配的话也需要^
和$
配合,例如:
# 访问 /ggg/test/aaa/bbb.txt时返回222
# 访问 /test/aaa/bbb.txt时返回111
location ~ ^/test/aaa/.*\.txt$ {
return 200 '111';
}
location ~ /test/aaa/.*\.txt$ {
return 200 '222';
}
所以,可以把^~
看成一种特殊的正则,只不过它的优先级高于正则,^~
能实现的,普通正则一定也能实现:
# 下面2中效果完全相同,唯一不同是优先级不同
# 访问 /test/aaa/bbb.txt 时返回222
location ~ ^/test/aaa/ {
return 200 '111';
}
location ^~ /test/aaa/ {
return 200 '222';
}
1.2. 测试
示例一,访问/hello.json
时,第二个生效(返回222
):
location /hello.json {
default_type text/html;
return 200 '111';
}
location =/hello.json {
default_type text/html;
return 200 '222';
}
示例二,访问/test/aaa/bbb.json
时,第二个生效(返回222
):
# 虽然222在后面,但是由于^~优先级更高,所以第二个生效
location ~ /test/aaa {
return 200 '111';
}
location ^~ /test/aaa {
return 200 '222';
}
示例三,访问/test/aaa/bbb.json
时,第1个生效(返回111
):
# 多个正则之间,第一个匹配生效,与顺序有关
# 虽然越往后匹配越精确,但是由于是正则,匹配到第一个就停止匹配
location ~ / {
return 200 '111';
}
location ~ /test/aaa {
return 200 '222';
}
location ~ /test/aaa/.*\.(gif|jpg|jpeg)$ {
return 200 '333';
}