Настройка виртуального сервера 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;
}
Источники
Связанные темы
Оптимизация запросов в Postgresql
Использование модуля pg_stat_statements в postgresql
Оптимизация производительности
Compression and Decompression Nginx