Конфиг nginx для многих клиентских проектов - PullRequest
2 голосов
/ 15 октября 2019

У нас около 30+ клиентских проектов (некоторые из них являются vue-проектами, а другие - статическими html-проектами), у каждого проекта есть отдельный корневой каталог.

На данный момент nginx настроен так, как и у каждого проекта location.

 location ^~ /workspaces/ {
     root    /var/www/workspace/;
     index   index.html index.htm;
 }

 location ^~ /offical/ {
     root    /var/www/official/;
     index   index.html index.htm;
 }

...

Каждый раз, когда выпускается новый клиентский проект, новый location добавляется в файл nginx. Боюсь, что слишком много location в файле nginx повлияет на эффективность nginx.

Как мне упростить конфигурационный файл nginx для всех клиентских проектов. Например, с одним местоположением location ^~ /web/, затем поместите все проекты в веб-путь.

Ответы [ 2 ]

4 голосов
/ 18 октября 2019

Лучшая практика

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

Производительность

Однако сС точки зрения производительности, nginx уже очень эффективен для таких распространенных случаев, что вам не нужно беспокоиться о наличии нескольких дополнительных директив location или server_name:

  • location

    Я бы предположил, что поиск на основе префикса location будет выполняться в дереве поиска на основе префикса - https://en.wikipedia.org/wiki/Trie - например, он будет очень эффективным,где, по сути, каждый входной символ в URL-адресе будет проверен только один раз, а каждый уровень в дереве будет иметь только определенное ограниченное количество ветвей.

    Если вы вместо этого перейдете на использование регулярных выраженийподход, то это будет заметно медленнее (по крайней мере, из анализа производительности, вы, вероятно, не заметите никакой разницы в реальном использовании), потому что тогда каждое регулярное выражениеНеобходимо будет переоценить n, возможно, для всего ввода, пока не будет найдено совпадение;сложность, кратная числу регулярных выражений, умноженная на размер входного URL.

  • server_name

    Если вместо этого перейти к * Определение на основе server, основанное на спецификациях не-регулярных выражений server_name, тогда сопоставление будет выполняться с помощью хеш-таблицы, которая также является очень эффективной операцией, где поиск будет занимать постоянное время дажена бесконечном количестве отдельных server определений.

Сравнение

Какой из них более эффективен, location или server_name? Трудно сказать наверняка, не вдаваясь в подробности;но я полагаю, что поиск по хешу будет более дружественным, если речь идет о предсказании ветвления ЦП - https://en.wikipedia.org/wiki/Branch_predictor; но это действительно влияет на засорение, вам не нужно беспокоиться об этих видахвещей для веб-приложения. Однако я по-прежнему рекомендую перейти на серверную конфигурацию из соображений безопасности, даже если дополнительные преимущества производительности незначительны.

tl; dr:

tl; dr: nginx ужевысокоэффективен для вашего варианта использования, как есть, и никакой дальнейшей оптимизации не требуется;лучшее, что вы могли бы сделать, - это убедиться, что вы не используете директивы location на основе регулярных выражений (либо вообще, либо используете модификатор ^~ для своих директив location на основе префиксов), поскольку они будутмедленнее, чем префиксные;также было бы целесообразно переключиться на серверную конфигурацию для дополнительной безопасности.

Ссылки

1 голос
/ 24 октября 2019

Я обычно использую динамические vhosts для ngninx. Поэтому вы можете создать обслуживающий каталог, например, /var/www/ и внутри определить каталог, например, для каждого домена клиентских проектов, которые вы хотите развернуть.

/var/www/domain.tld
/var/www/subdomain.domain.tld
/var/www/otherproject.tld
/var/www/project.tld/public

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

server {                                                                                                                                                                                                                                   
# SSL configuration                                                                                                                                                                                                                      
listen 443 ssl http2 default_server; # managed by Certbot                                                                                                                                                                                
listen [::]:443 ssl http2 default_server;                                                                                                                                                                                                

set $basepath "/var/www";                                                                                                                                                                                                                

server_name ~^(\w+\.)?(?<base>\w+\.\w+)$;                                                                                                                                                                                                

if ( -d $basepath/$host) {                                                                                                                                                                                                               
  set $rootpath $basepath/$host;                                                                                                                                                                                                         
}                                                                                                                                                                                                                                        
if ( -d $basepath/$host/public ) {                                                                                                                                                                                                       
  set $rootpath $basepath/$host/public;                                                                                                                                                                                                  
}                                                                                                                                                                                                                                        
if ( !-d $basepath/$host ) {                                                                                                                                                                                                             
  set $rootpath $basepath/$base;                                                                                                                                                                                                         
  return 301 https://$base$request_uri;                                                                                                                                                                                                  
}                                                                                                                                                                                                                                        

root $rootpath;

access_log "/var/log/nginx/${host}.access.log";                                                                                                                                                                                          
error_log "/var/log/nginx/error.log" debug;                                                                                                                                                                                              

index index.php index.html index.htm index.nginx-debian.html;                                                                                                                                                                            

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

Это сначала устанавливает базовый путь равным /var/www, а затем пытается упорядочить каталоги в этом базовом пути. Если каталог с доменом, из которого осуществляется доступ к проекту, существует и обслуживает их оттуда, если внутри находится общая папка, этот вариант предпочтителен. Если оба недоступны, он перенаправляет на другой определенный URL.

Более того, для каждого хоста генерируется отдельный access.log. К сожалению, для error.log это не работает, поэтому все ошибки собираются в общий error.log.

для конкретных файлов, которые можно затем отфильтровать по расширениям и т. Д., Чтобы указать как онив приведенном выше примере PHP -файлы подаются с использованием php7.2-fpm.

...