Достаточно простое объяснение конфигурации Nginx Location

задняя часть внешний интерфейс Nginx
Достаточно простое объяснение конфигурации Nginx Location

предисловие

Местоположение — это очень важная конфигурация в Nginx. В этой статье основное внимание уделяется настройке местоположения и некоторым мерам предосторожности.

грамматика

Что касается местоположения, вот простой пример конфигурации:

http { 
  server {
      listen 80;
    	server_name www.yayujs.com;
    	location / {
      	root /home/www/ts/;
	      index index.html;
    	}
  }
}

примерно означает, что при посещенииwww.yayujs.comиз80порт, возвращение/home/www/ts/index.htmlдокумент.

Давайте посмотрим на конкретный синтаксис Location:

location [ = | ~ | ~* | ^~ ] uri { ... }

Обратите внимание на квадратные скобки[ = | ~ | ~* | ^~ ]|Содержимое с разделителями представляет синтаксис, который вы можете использовать, где:

  • =Указывает на точное совпадение, например:
location = /test {
  return 200 "hello";
}

# /test ok
# /test/ not ok
# /test2 not ok
# /test/2 not ok
  • ~Указывает на регулярное соответствие с учетом регистра, например:
location ~ ^/test$ {
  [ configuration ] 
}

# /test ok
# /Test not ok
# /test/ not ok
# /test2 not ok
  • ~*Указывает на регулярное соответствие без учета регистра.
location ~* ^/test$ {     
	[ configuration ] 
}

# /test ok
# /Test ok
# /test/ not ok
# /test2 not ok
  • ^~Указывает, что uri начинается со строки
location ^~ /images/ {    
	[ configuration ] 
}

# /images/1.gif ok

И когда вы не используете эти синтаксисы и просто пишете uri:

/Указывает на общее совпадение:

location / {     
	[ configuration ] 
}

# /index.html ok
location /test {
    [ configuration ] 
}

# /test ok
# /test2 ok
# /test/ ok

соответствующий заказ

При наличии нескольких местоположений их соответствующие ссылки на порядокОфициальная документация Nginxэто:

Расположение может быть определено строкой префикса или регулярным выражением.Регулярные выражения указываются с предшествующим модификатором «~*» (для совпадения без учета регистра) или модификатором «~» (для сопоставления с учетом регистра). .Чтобы найти местоположение, соответствующее заданному запросу, nginx сначала проверяет местоположения, определенные с помощью строк префикса (префиксные местоположения).Среди них выбирается и запоминается местоположение с самым длинным совпадающим префиксом.Затем проверяются регулярные выражения, в порядке их появление в конфигурационном файле.Поиск регулярных выражений прекращается на первом совпадении и используется соответствующая конфигурация.Если совпадения с регулярным выражением не найдено, то используется конфигурация расположения префикса, запомненная ранее.

Если самое длинное совпадающее место префикса имеет модификатор «^~», то регулярные выражения не проверяются.

Также с помощью модификатора «=» можно определить точное совпадение URI и местоположения. Если найдено точное совпадение, поиск прекращается. Например, если часто встречается запрос «/», определение «location = /» ускорит обработку этих запросов, так как поиск прекращается сразу после первого сравнения, такая локация не может явно содержать вложенных локаций.

После перевода это:

Существует два определения местоположения:

  • строка префикса
  • Регулярное выражение (регулярное выражение), которому конкретно предшествует~*и~модификатор

И порядок сопоставления мест таков:

  1. Проверьте местоположения, используя строку префикса, выберите самое длинное совпадение среди местоположений, используя строку префикса, и сохраните результат.
  2. Если он соответствует=URI модификатора, немедленно прекратите сопоставление
  3. Если он соответствует^~URI модификатора, он также сразу перестает соответствовать.
  4. Затем проверьте регулярное выражение в порядке файла определения и остановитесь, если оно соответствует
  5. Если регулярное выражение не совпадает, используйте ранее сохраненную строку префикса.

Подводя итог еще раз:

По порядку порядок строки префикса не важен, он определяется в соответствии с длиной совпадения, а регулярное выражение определяется в соответствии с порядком.

в приоритете,=модификатор самый высокий,^~Второй — обычный, а последний — соответствие строки префикса.

Рассмотрим несколько простых примеров:

server {
    location /doc {
        [ configuration A ] 
    }
    location /docu {
        [ configuration B ] 
    }
}

# 请求 /document 使用 configuration B
# 虽然 /doc 也能匹配到,但在顺序上,前缀字符串顺序不重要,按照匹配长度来确定
server {
    location ~ ^/doc {
        [ configuration A ] 
    }
    location ~ ^/docu {
        [ configuration B ] 
    }
}

# 请求 /document 使用 configuration A
# 虽然 ~ ^/docu 也能匹配到,但正则表达式则按照定义顺序
server {
    location ^~ /doc {
        [ configuration A ] 
    }
    location ~ ^/docu {
        [ configuration B ] 
    }
}

# 请求 /document 使用 configuration A
# 虽然 ~ ^/docu 也能匹配到,但 ^~ 的优先级更高
server {
    location /document {
        [ configuration A ] 
    }
    location ~ ^/docu {
        [ configuration B ] 
    }
}

# 请求 /document 使用 configuration B
# 虽然 /document 也能匹配到,但正则的优先级更高

Разница между корнем и псевдонимом

Когда мы устанавливаем это такrootкогда:

location /i/ {
    root /data/w3;
}

по запросу/i/top.gif,/data/w3/i/top.gifбудет возвращен.

Когда мы устанавливаем это такaliasкогда:

location /i/ {
    alias /data/w3/images/;
}

по запросу/i/top.gif,/data/w3/images/top.gifбудет возвращен.

На первый взгляд они очень похожи, но если присмотреться, то можно увидеть разницу между ними.root + locationпока используется псевдонимaliasзаменятьlocation, поэтому последний путь в корне имеет/i/, а последний путь в алиасе не имеет/i/.

Итак, если вы определяете путь, используя псевдоним, например:

location /images/ {
    alias /data/w3/images/;
}

На самом деле использование root было бы лучше:

location /images/ {
    root /data/w3;
}

корень на сервере и местоположении

root можно использовать как на сервере, так и в локации, например:

http { 
  server {
      listen 80;
    	server_name www.yayujs.com;
    	root /home/www/website/;
    	location / {
      	root /home/www/ts/;
	      index index.html;
    	}
  }
}

Если оба присутствуют, что является приоритетным?

Проще говоря, это принцип близости.Если расположение может совпадать, используется корневая конфигурация в расположении, а корень на сервере игнорируется.Если расположение не совпадает, используется корневая конфигурация на сервере.

серия статей

Серия по созданию блога — это единственная серия практических руководств, которые я написал до сих пор, объясняя, как использовать VuePress для создания блога и развертывания его на GitHub, Gitee, персональных серверах и других платформах.

  1. Статья, которая поможет вам создать блог с помощью VuePress + GitHub Pages
  2. Учебник, который научит вас синхронизировать код GitHub и Gitee.
  3. Еще не используете GitHub Actions? проверить это
  4. Как Gitee автоматически развертывает страницы? Все еще используйте GitHub Actions!
  5. Интерфейсная команда Linux

WeChat: «mqyqingfeng», добавьте меня в единственную читательскую аудиторию Xianyu.

Если есть какие-либо ошибки или неточности, пожалуйста, поправьте меня, большое спасибо. Если вам это нравится или у вас есть вдохновение, вы можете стать звездой, что также является поощрением для автора.