Настройка виртуального сервера Nginx

Настройка виртуального сервера Nginx

    Настройка виртуального сервера Nginx

    Виртуальный сервер добавляется директивой server в контексте http. Директив server может быть несколько.
    В директиву server обычно в начале прописывается директива listen с указанием ip и порта

    http { server { listen 127.0.0.1:8080; server_name example.org www.example.org; } }

    Если директива listen не включена, стандартный порт 80/tcp, 8000/tcp, в зависимости от привилегий суперпользователя.
    В параметре server_name указывается полное имя или регулярное выражение
    Подстановочный знак тильды (~) соответствует говорит об использовании регулярного выражения


    Если указано несколько имен сервера, nginx осуществляет поиск в следующем порядке:
    1. Полное совпадение
    2. Самое длинное имя, которое начинается со звездочки (*)
    3. Самое длинное имя, которое заканчивается звездочкой (*)
    4. Первое совпадение в соответствии с регулярным выражением


    Если nginx не обнаружил имени сервера, запрос будет направлен на сервер по умолчанию
    Сервер по умолчанию, это первая строка listen, если только не указан параметр default_server в одной из директив listen

    server { listen 80 default_server; #... }
    location

    location(место расположения) указывается в виде префикса имени пути или с помощью регулярного выражения, которое соответствует имени пути.

    location /some/path/ { #... } location ~ \.html? { #... }

    В следующем примере будут обслуживаться файлы из каталога data

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

    Директива root указывает путь к файловой системе, в котором выполняется поиск статических файлов для обслуживания
    URI запроса, связанный с местоположением, добавляется к пути, чтобы получить полное имя статического файла для обслуживания. В приведенном выше примере в ответ на запрос /images/example.png NGINX Plus доставляет файл
    /data/images/example.png


    Приоритеты location

    Сначала nginx ищет соответствие на полное имя пути, потом регулярному выражению. Более высокий приоритет отдается регулярному выражению, если только не используется префикс ^~
    Среди строк nginx выбирает наиболее длинную и подходящую
    1. Проверить все строки на соответствие
    2. Если точное совпадение найдено, дальнейший поиск прекращается
    3. Если модификатор ^~ использует самую длинную строку, регулярные выражения не проверяются
    4. Проверка uri на соответствие регулярным выражениям


    Настройка перенаправлений

    Настройка перенаправлений делается в файле /etc/nginx/http.d/ или /etc/nginx/sites_enabled

    return

    Директива return используется для возврата статуса страницы сервера
    Первый параметр код ответа
    Второй параметр url для перенаправления, если используется коды for codes 301, 302, 303, and 307)


    Перенаправление с http на https:

    server { listen 80; netbash.ru www.netbash.ru; return 301 https://$host$request_uri; }

    $host - имя хоста или сервера
    $request_uri - все что после доменного имени

    rewrite

    Формат запроса:
    rewrite ^ https://$host$request_uri? ;
    flag это один из 4-х параметров:
    last - перенаправление в новый location
    permanent - перенаправление, код 301
    redirect - перенаправление, код 302
    break - закончить обработку в текущем location



    Примеры перенаправления

    Перенаправление на другую страницу с подстановкой переменных:

    rewrite ^/(linux)/(.*)$ /mainList/$1/$2 permanent;

    Перенаправление на другую страницу с помощью return:

    location /linux{ return 301 /mainList/linux/; }

    Перенаправление с удалением части url с помощью rewrite:

    rewrite ^/mainList/test/(linux)/(.*) /mainList/$1/$2 permanent;

    Перенаправление в удалением части url с помощью return:

    if ($request_uri ~ "mainList/test/linux/(.*)"){ return 301 /mainList/linux/$1; } Для перенаправления с одного домена на другой: return 302 https://yandex.ru;

    Перенаправление с http на https:

    server { listen 80 default_server; listen [::]:80 default_server; server_name netbash.ru www.netbash.ru; if ($host = netbash.ru) { return 301 https://$host$request_uri; } # managed by Certbot if ($host = www.netbash.ru) { return 301 https://netbash.ru$request_uri; } # managed by Certbot }

    301 код перенаправления, склеивание страниц, указывает поисковику, что исходная страница и новая страница равнозначны.
    302 код перенаправления на другую страницу, поисковик индексирует новую страницу как страницу другого сайта.


    Вместо протокола http или https можно подставлять $scheme
    $scheme - подставляет тот же протокол по которому обращался клиент(http или https)


    Для протокола https необходимо указывать путь к сертификатам


    sub_filter

    ngx_http_sub_module - это модуль, который заменяет одну строку на другую в контексте ответа, в строках можно использовать переменные, директивы наследуются с предыдущего уровня конфигурации, если только на текущем уровне не описываются свои директивы sub_filter.
    контекст: http, server, location

    sub_filter 'NetBash.ru' 'NetBashik.ru'; sub_filter_once on;

    Директива sub_filter_once указывает NGINX последовательно применять директивы sub_filter в пределах местоположения

    error_page

    error_page - указывает как обрабатывать ошибки, какое действие выполнять
    В следующем примере при если страница не найдена, nginx возвращает код ошибки и перенаправляет пользователя на страницу

    location /test { error_page 404 /404.html; }

    Или подобно прокси перенаправляет на другой url меняя при этом код с 404 на 301.

    location /test { error_page 404 =301 https://ya.ru }
    try_files

    Директиву try_files можно использовать для проверки того, существует ли указанный файл или каталог; NGINX выполняет внутреннее перенаправление, если это так, или возвращает указанный код состояния, если это не так.
    Проверяет наличие файлов в указанном порядке и использует первый найденный файл для обработки запросов. Путь к файлу создается из параметра file в соответствии с директивами root и alias. Можно проверить существование каталога, указав косую черту в конце имени, например “$uri/”. Если ни один из файлов не был найден, выполняется внутреннее перенаправление на uri, указанный в последнем параметре.

    location /images/ { try_files $uri /images/default.gif; }
    Проксирование

    Проксирование в отличии от редиректа не переходит на другой url, вместо этого nginx сам выполняет запрос и возвращает ответ. Хорошо подходит для распределения внутренних ресурсов сервера и серверов в локальной сети.
    Здесь запрос с /test/page.html URI будет перенаправлен на http://test.ru/blog/page.html . Если адрес указан без URI или невозможно определить часть URI, подлежащую замене, передается полный URI запроса (возможно, измененный).

    location /test/ { proxy_pass https://test.ru/blog/; }

    Чтобы передать запрос на сервер, не являющийся прокси-сервером HTTP, следует использовать соответствующую директиву **_pass:
    fastcgi_pass передает запрос на сервер FastCGI
    FastCGI uwsgi_pass передает запрос на сервер uwsgi
    scgi_pass передает запрос на сервер SCGI
    memcached_pass передает запрос на сервер memcached


    proxy_set_header

    proxy_set_header - позволяет добавлять и изменять поля заголовка запросов передаваемые проксируемому серверу.
    По умолчанию NGINX переопределяет два поля заголовка в прокси-запросах, “Host” и “Connection”, и устраняет поля заголовка, значения которых являются пустыми строками. “Host” устанавливается в переменную $proxy_host, а “Connection” устанавливается в значение close.


    Пример проксирования запросов из внешней сети на сервер в локальной сети

    location / { proxy_pass http://192.168.1.2:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; }

    На сервере 192.168.1.2:8080 может также работать nginx


    По умолчанию nginx буферизирует запросы от прокси-серверов
    Директива proxy_buffers управляет размером и количеством буферов, выделенных для запроса
    По умолчанию используется 8 буферов, размер которых равен одной странице памяти (либо 4k, либо 8k).
    Увеличение количества буферов позволяет буферизовать дополнительную информацию
    proxy_buffer_size - определяет размер буфера для проксируемых ответов от сервера или максимальный размер данных, который nginx может принять от сервера за один раз
    Значение proxy_buffer_size по умолчанию равно 4K или 8K
    Значение для proxy_buffer_size должно быть не меньше максимально возможного размера HTTP-заголовков ответа, чтобы избежать частой ошибки «502 Bad Gateway»

    location /some/path/ { proxy_buffers 16 4k; proxy_buffer_size 2k; proxy_pass http://localhost:8000; }

    proxy_busy_buffers_size - устанавливает максимальное количество занятых буферов
    Хотя клиент может считывать данные только из одного буфера за раз, буферы помещаются в очередь для отправки фрагментов данных клиенту
    Его минимально допустимое значение равно значению, которое установлено для proxy_buffer_size. Таким образом, если настраивать proxy_buffer_size на более высокое значение, нужно увеличить значение proxy_busy_buffers_size


    proxy_temp_file_write_size - количество данных, которые Nginx будет записывать во временный файл за один раз, если ответ прокси-сервера слишком велик и не помещается в буфер


    Использование proxy с авторизацией:

    location / { proxy_pass http://192.168.1.2/test/; proxy_set_header Authorization "test lskdjfskdf"; ... } Перекинуть часть url на другой сервер: location ~ ^/test/(.*)$ { proxy_pass $scheme://192.168.1.2/$1; }
    Источники
    Последнее изменение: 07.10.2024 13:55


    Связанные темы
    Здесь пока нет комментариев
    Добавлять комментарии могут только авторизованные пользователи

    Авторизоваться
    Я буду рекламой
    Я тоже буду рекламой
    И я
    ВВЕРХ