nginx配置
nginx的server块
如何让server_name生效
server块如果都没有设置为default_server,那么会取第一个server作为default_server
如果存在default_server,同时另外的server配置了server_name,则server_name未匹配时会访问不了
server中的location块
location块的优先级
- = 精确匹配,优先级最高
- ^~, 最佳前缀匹配(先匹配最长路径,且不再考虑正则匹配)
- ~ / ~*,正则匹配(~区分大小写 ~*不区分大小写),正则匹配是有顺序的,先匹配上的正则会忽略后续的正则,慎用
- / 斜杠开头 普通前缀匹配(优先级最低)
location的匹配步骤
精确匹配 -> 前缀匹配 -> 正则匹配,前缀匹配如果没有发现最佳前缀匹配,则还需要看正则匹配,如果又发现了正则匹配,那么正则匹配优先级更高,
当一个请求进入 Nginx 时,它会经历以下“心理路程”:
- 精确检查: 先看有没有
=定义的精确匹配。如果有,直接成交,收工。 - 前缀搜寻: 扫描所有非正则(这里包括普通前缀匹配和带了^~修饰符的最佳前缀匹配)的
location(即普通的location /abc/)。它会记住最长的那个匹配项。 - 封顶拦截: 如果搜到的最长匹配项带有
^~修饰符,OK,Nginx 觉得够了,直接用它,跳过后面的正则检查。 - 正则漫游(关键点): 如果最长匹配项只是普通前缀(没带
^~),Nginx 会暂时把这个结果“存进草稿箱”,然后开始从头到尾扫描正则表达式。
- 只要匹配到一个正则,就立即使用该正则,抛弃刚才“草稿箱”里的前缀匹配。
- 顺序很重要: 如果有多个正则都能匹配,谁写在前面谁赢。
- 兜底方案: 如果所有的正则都匹配失败,Nginx 才会回过头,使用刚才“草稿箱”里存的那个最长前缀匹配。
修改配置后怎么生效
shell
# 先测试语法是否ok
# 如果看到: syntax is ok 和 test is successful,说明配置没问题
nginx -t
# 热重载
nginx -s reload