Nginx — рецепты

Решил собирать на этой странице всяческие полезные настройки, с которыми пришлось повозиться.

Но, прежде чем приступить, хочу Вам предложить освежить знания о том, как nginx обрабатывает запрос:

Синтаксис:

location [ = | ~ | ~* | ^~ ] uri { ... }
location { } @ name { ... }
= полное строковые совпадение, например = / исключительно для корня, и даже файлы в корне уже сюда не подходят (приоритет максимальный)
^~ требуется совпадение только начала строки, например ^~ /img/ считается не регулярным выражением (приоритет высокий)
~* регулярное выражение без учета регистра (приоритет средний)
~ регулярное выражение с учетом регистра (приоритет ниже среднего)
не указан например "location / {" или "location /data/ {" (приоритет минимальный)

Примеры специально расположенные в обратном порядке приоритетов:

# Данная конфигурация сопоставляется с любым запросом, в котором есть /data/ например /foo/data/bar
location /data/ {
    return 200 "data on $uri";
}
# Совпадает с любым запросом, начинающимся с /, однако после всех регулярных выражений.
location / {
    return 200 "root is $document_root on $uri";
}
# Соответствует запросам /api и /api/ но если файл doc.txt не найден, то nginx сделает 
# внутренний запрос словно клиент запросил /info.gif (см. ниже регулярку с gif)
location ~ ^/api(|/)$ {
    try_files /doc.txt /info.gif;
}
# Совпадает с любым запросом, начинающимся с  /img/ и затем поиск прекращается,
# в этом примере нет регулярных выражений.
location ^~ /img/ {
    try_files $uri =404;
}
# Совпадает с любым запросом заканчивающимся на png, ico, gif, jpgили jpeg. Однако, все
# запросы /img/ будут обработаны в предыдущем location
location ~* \.(png|ico|gif|jpg|jpeg)$ {
    try_files $uri =404;
}
# Если совпадает точно с запросом /
location = / {
    index README.md;
}
# Произойдет поиск файла /my.js и если его нет, заново начнется поиск, словно клиент запросил файл /my.php
location = /my.js {
    try_files $uri /my.php$is_args$args;
}

Как проверить существование файла в директории и если файла нет - выдать 404

location ^~ /dir/ {
     try_files $uri =404;
}

Как проверить существование файла в директории и если файла нет - показать файл по умолчанию

location ^~ /dir/ {
     try_files $uri /images/default.gif;
}

*выше описанные способы можно совместить:

location ^~ /dir/ {
     try_files $uri /images/default.gif =404;
}

Как проверить существование файла в директории, а и если файла нет - поискать на другом сайте, и если там нет - выдать 404

location ^~ /dir/ {
    try_files $uri @static_svr1;
}
location @static_svr1 {
   resolver 8.8.8.8;
   proxy_pass http://site.ru$uri;
   proxy_intercept_errors on;
}

Как подгружать файлы определенной директории с другого сервера (по текущему домену)

location ^~ /img/ {
   resolver 8.8.8.8;
   proxy_pass http://site.ru$uri;
   proxy_intercept_errors on;
}

или без dns-resolver:

location ^~ /img/ {
    proxy_pass http://1.9.107.167:80;
    proxy_redirect http://1.9.107.167:80/ /;
    proxy_set_header Host $host;
}

Как подгружать файлы определенной директории с другого сайта

location ^~ /outer/office/users/ {
    proxy_pass http://site.ru:80;
    proxy_redirect default;
}

Как подгружать файлы определенной директории с директории другого проекта

location ^~ /dir/ {
     root /var/www/yandex.ru/;
}

* переопределять root параметр является единственным верным и рабочим способом и никакие try_file не помогут (и не нужны).

Как использовать динамичный роутинг с ограничением (например по расширению файла)

location ~* ^/mobile/(.+)\.(ettf|svg) {
    try_files /$1.$2 @rewrite;
}

Как вернуть код 500 с содержимым

location /500.html {
       return 500 "Whoa! Internal Server Error";
}

Дебагинг

Чтобы убедиться, что поддержка отладки сконфигурирована, необходимо в консоле выполнить команду:

nginx -V | grep "--with-debug"

если результат есть, значит nginx скомпилен с возможностью отладки и теперь для error-лога можно просто указать примечание debug:

server {
    error_log /var/log/nginx/site.ru.error debug;
}

Anti-hotlinking – защита файлов вашего сайта от прямого доступа с других сайтов или сервисов. По этому вопросы у меня отдельная статья »

Не проверялось: Autoindex

Autoindex — это функция, которая включает листинг директорий по http, средствами веб-сервера (конечно, если в директории нет настоящего index-файла).

location /testing {
  autoindex on;
  autoindex_exact_size off;
  autoindex_localtime on;
}

Не проверялось: как проксировать на нужный сервер, используя переменные из Cookies

Ситуация: приложение кладет в куку JSESSIONID значение k3t2, где 3 это номер сервера, 2 это порт 8020. Следовательно необходимо заворачивать клиентов по этим данным.

if ( $cookie_JSESSIONID ~ k(\d)t(\d)$ ) {
     set $i $1;
     set $p $2;
     proxy_pass  "http://10.0.0.${i}:80${p}0";
}

*есть мнение, что в proxy_pass надо задавать url полностью. Т.е. нужно записать все в переменную и только потом proxy_pass http://$my_var

Не проверялось:  под-директории и фронт-контроллеры в них

location /nested {
    alias /var/www/nested/public;
    try_files $uri $uri/ @nested;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
    }
}

location @nested {
    rewrite /nested/(.*)$ /nested/index.php?/$1 last;
}

Декодирование

Nginx имеет возможность декодировать URI, в реальном времени. Например, для того, чтобы найти соответствия “/app/%20/images” вы можете использовать “/app/ /images” для определения местоположения.

Надеюсь Вам пригодятся данные настройки, удачки!

Источники: 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10

Оцени публикацию:
  • 3,15
Оценили человек: 3

Похожие статьи:


Предложения и пожелания:
Ваше имя:
Ваш E-mail:
Сколько будет Οдин + Τри
Главная
X

youtube.com/watch?v=7hFivbgIEqk

При полном или частичном использовании материалов данного сайта, ссылка на сайт "yapro.ru" обязательна как на источник информации.
Автоматический импорт материалов и информации с сайта запрещен.
Copyrights © 2007 - 2019 YaPro.Ru

Главная » Веб-мастеру » Apache »