Настройка nginx server_names_hash_max_size и server_names_hash_bucket_size

Настройка кэширования для fastcgi_pass

Настройка fastcgi_cache аналогична proxy_cache и настройки можно сделать по подобию последнего, заменив proxy_ на fastcgi_. Мы разберем основные настройки без подробностей и комментариев.

Открываем конфиг nginx:

vi /etc/nginx/nginx.conf

Добавляем в секцию http:

http {
    …
    fastcgi_cache_path /var/cache/fastcgi levels=1:2 keys_zone=fastcgi:64m inactive=2h max_size=2g;
    …
}

* обратите внимание, что мы задали другой каталог и keys_zone. Создаем каталог для кэша:

Создаем каталог для кэша:

mkdir /var/cache/fastcgi

chown nginx:nginx /var/cache/fastcgi

Настраиваем хост:

vi /etc/nginx/conf.d/default.conf

    location / {
        if ($http_cookie ~* «.+» ) {
            set $cookie_cache_bypass 1;
        }
        fastcgi_cache_bypass $cookie_cache_bypass;
        fastcgi_pass http://localhost:9000;
        …
        fastcgi_cache all;
        fastcgi_cache_valid 404 502 503 5m;
        fastcgi_cache_valid any 1h;
        fastcgi_cache_use_stale error timeout invalid_header updating;
    }

Проверяем настройки и применяем их:

nginx -t

systemctl restart nginx

Исключения кэширования

Некоторый динамический контент (например, страницы запроса аутентификации) кешировать не нужно. Такой контент можно исключить из кеширования при помощи переменных request_uri, request_method и http_cookie.

Ниже приведен пример настроек, который можно использовать в контексте server{ }.

Чтобы применить переменную $no_cache в соответствующие директивы, поместите следующие строки в location ~ .php$ { }

Директива fastcgi_cache_bypass игнорирует существующий кэш для запросов, связанных с установленными нами ранее условиями. Директива fastcgi_no_cache вообще не будет кэшировать такие запросы.

Другие способы

Установи
правильные значения системных переменных

Размести
корневой каталог Web-сервера на выделенном разделе

Помести
nginx в chroot/jail-окружение

Любая
современная *nix-система позволяет запереть приложение в изолированной
среде исполнения. В Linux для этого можно использовать технологии KVM,
Xen, OpenVZ и VServer, во FreeBSD – Jail, в Solaris – Zones. Если ни одна
из этих технологий не доступна, ты можешь поместить nginx в классический
chroot, который хоть и намного более хрупок, но большинство взломщиков
остановить сможет.

Установи
правила SELinux для защиты nginx

Хорошей
альтернативой изолированным средам исполнения являются локальные системы
обнаружения и предотвращения вторжений, такие как SELinux или AppArmor.
Будучи правильно настроенными, они смогут предотвратить попытки взлома
Web-сервера. По дефолту ни одна из них не настроена для работы в связке с
nginx, однако в рамках проектаSELinuxNginx(http://sf.net/projects/selinuxnginx/)
были созданы правила для SELinux, которые может использовать любой
желающий. Остается только скачать и установить:

Настрой
брандмауэр

Обычно
nginx устанавливают на выделенных машинах, готовых к высокой нагрузке,
поэтому зачастую он остается единственным сетевым сервисом, работающим на
сервере. Чтобы обезопасить сервер, достаточно создать совсем небольшой
набор правил, которые будут открывать 80, 110 и 143-й порты (если,
конечно, nginx должен работать еще и как IMAP/POP3-прокси) и закрывать от
внешнего мира все остальное.

Ограничь
количество соединений с помощью брандмауэра

Для
не слишком нагруженного Web-сайта хорошей идеей будет ограничить
количество попыток соединений с одного IP-адреса в минуту. Это сможет
уберечь тебя от некоторых типов DoS-атак и брутфорса. В Linux это можно
сделать с помощью стандартного iptables/netfilter-модуля state:

Правила
урезают лимит на количество подключений с одного IP в минуту до 15. То же
можно сделать и с помощью pf:

Кроме
лимита на количество последовательных подключений (15 в минуту), данное
правило устанавливает дополнительный лимит на количество одновременных
подключений равный 100.

Настрой
PHP

Если
ты используешь nginx в связке с PHP, не забудь настроить и его. Вот как
должен выглядеть конфигурационный файл /etc/php/php.ini защищенного
сервера:

Анализ
и оптимизация времени TTFB

Код

Давайте посмотрим на базовую реализацию хеш-таблиц в Swift. Постепенно будем наращивать.

Универсальный контейнер, названы два универсальных типа(должно быть)с участием. Мы также определяем два других типа:Используется ли в цепочке пара ключ / значение, иТакое чтоМассив.

Основной массив называется. Метод инициализацииИспользуйте фиксированную емкость, чтобы определить размер массива. Мы также можем использоватьПеременные отслеживают, сколько элементов было добавлено в хеш-таблицу.

Пример создания нового объекта хеш-таблицы:

Хеш-таблица пока ничего не может сделать, поэтому добавим следующую функцию. Сначала добавьте вспомогательный метод для вычисления индекса массива для данного ключа:

Это выполнит расчет, который вы видели ранее: он будетАбсолютное значение определяется по модулю размера массива ведра. Мы поместили его в отдельную функцию, потому что он используется в нескольких разных местах.

Есть четыре основных способа использования хэш-таблиц или словарей:

  • insert a new element

  • Вставить новый элемент

  • Найти элемент

  • Обновить существующие элементы

  • Удалить элемент

Их синтаксис:

Мы также можем использовать Функция выполняет все эти операции:

Это требует трех вспомогательных функций для выполнения фактической работы. Давайте взглянем, Он извлекает объект из хеш-таблицы.

Во-первых, он вызываетПреобразуйте ключи в индексы массива. Это дает нам номер сегмента, но в случае конфликта этот сегмент может использоваться несколькими ключами.Сделайте петлю из этого ведра и сравните ключи один за другим. Если найдено, вернуть соответствующее значение, иначе вернуть。

Код для вставки новых элементов или обновления существующих элементов находитсяв. Это немного сложнее:

Точно так же первый шаг — преобразовать ключ в индекс массива, чтобы найти корзину. Затем продеваем цепочку из бочек. Если мы находим ключ в цепочке, мы обновляем его новым значением. Если ключа нет в цепочке, мы вставляем новую пару ключ / значение в конец цепочки.

Как видите, очень важно поддерживать короткую цепочку (делая хэш-таблицу достаточно большой). Иначе ты в этих …Если время, проведенное в цикле, слишком велико, производительность хеш-таблицы больше не будетO(1), И еще какO(n)。. Удаление аналогично, снова пройдемся по цепочке:

Удаление аналогично, снова пройдемся по цепочке:

Это основные функции хеш-таблиц. Все они работают одинаково: используют его хеш-значение для преобразования ключа в индекс массива, находят сегмент, затем проходят по цепочке этого сегмента и выполняют желаемую операцию.

Попробуйте эти вещи на детской площадке. Должен быть как стандартный Swift Работайте так же.

Проверка кэширования FastCGI

Создайте PHP-файл, который выводит метку времени UNIX.

Внесите в файл:

Затем несколько раз запросите данный файл через curl или веб-браузер.

Если кеширование выполняется должным образом, временная отметка всех запросов будет совпадать (поскольку ответ был кеширован).

Чтобы найти кэш этого запроса, нужно выполнить обратную запись кэша

Можно также добавить заголовок X-Cache, который укажет, что данный запрос был обработан из кеша (X-Cache HIT) или напрямую (X-Cache MISS).

Над директивой server { } внесите:

Перезапустите сервис Nginx  и выполните подробный запрос с помощью curl, чтобы увидеть новый заголовок.

избегать конфронтации

Возникает проблема: поскольку мы используем модуль хеш-значения и размер массива, может случиться так, что двум или более ключам будет присвоен один и тот же индекс массива. Это называется конфликтом.

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

Поскольку наши часы маленькие, легко вступить в конфликт. Например, ключ Индекс массива также равен 3, но мы не хотим перезаписывать значение, уже имеющееся в этом индексе массива.

Обычный способ справиться с конфликтами — использовать цепочку. Массив выглядит так:

В случае ссылок ключи и их значения не хранятся непосредственно в массиве. Вместо этого каждый элемент массива представляет собой список из нуля или более пар ключ / значение. Элементы массива обычно называютсяbuckets(Можно перевести как ведро), список называетсяchains(Можно перевести как цепочка). Здесь 5бочка, Двое из нихбочкаЕстьцепь. Остальные трибочкаВсе пусто.

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

Хеш-ключ Чтобы вычислить индекс массива, равный 3. Поскольку в ведре 3 есть цепочка, мы просматриваем список и находимЗначение ключа. Это делается путем сравнения ключей с помощью сравнения строк. Хеш-таблица проверяет, принадлежит ли ключ последнему элементу в цепочке, и возвращает соответствующее значение.。

Обычный способ реализации этого механизма цепочки — использовать связанный список или другие массивы. Поскольку порядок элементов в цепочке не имеет значения, вы можете рассматривать его как коллекцию, а не как список. (Теперь вы также можете представить себе источник термина «ведро»; мы просто сбрасываем все объекты в ведро вместе.)

Цепочка не должна становиться длиннее, потому что поиск элементов в хеш-таблице станет медленным. В идеале у нас вообще нет цепочки, но избежать конфликтов практически невозможно. Вы можете увеличить вероятность (избежать коллизий), используя высококачественные хэш-функции, чтобы обеспечить достаточное количество сегментов для хеш-таблицы.

Рекомендации и противопоказания

Кэш — это данные не первой свежести

Это важно учитывать, если мы хотим настроить эффективное кэширование средствами nginx. Мы можем столкнуться с различными проблемами, например, неспособность сервера продлить сессию авторизованного пользователя или отображение старой информации на портале с динамично меняющимся контентом

Чтобы избежать данных проблем, настройка nginx должна быть тесно сопряжена с разработкой сайта. Идеальная работа кэша возможна только при полном понимании внутренних механизмах работы портала, такие как, отправка запросов на авторизацию, продление сессии, обновлении контента — программист может написать для этого запрос по определенным URL, для которого администратор NGINX может отключить кэширование.

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

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

Очистка кэша

Соглашение об именах кэша основывается на переменных, которые были применены в директиве fastcgi_cache_key.

Согласно этим переменным, при запросе http://localhost/time.php будут выведены следующие значения:

После хеширования этой строки в MD5 получилось бы следующее:

Это сформирует имя файла кэша в соотношении с подкаталогами, указанными в levels=1:2. Таким образом, первый уровень каталога в этой строке MD5 будет обозначен последним символом строки (в данном случае это символ е). Второму уровню принадлежат следующие после первого уровня 2 символа (18). Таким образом, вся структура каталогов этой кэш-зоны будет выглядеть так:

/etc/nginx/cache/e/18/b777c8adab3ec92cd43756226caf618e

Основываясь на этом формате кеширования, можно создать скрипт очистки кэша в любом удобном языке. В данном руководстве для того используется PHP. Создайте файл:

Внесите в него:

Отправьте POST-запрос на этот файл с URL, который нужно очистить.

Скрипт выдаст true или false в зависимости от того, был очищен кш или нет. Обязательно исключите этот скрипт из  кэширования, а также не забудьте ограничить доступ к нему.

FastCGILinuxNGINXPHPUbuntuVPS

Установка

Пакет
nginx доступен в прекомпилированном виде для любого дистрибутива. Однако
собрав сервер самостоятельно, ты сможешь сделать его более компактным и
надежным, а также получишь возможность изменить строку приветствия
Web-сервера, чтобы отбить несмышленых скрипт-кидди.

Измени
строку приветствия Web-сервера

Скачай
исходники nginx, открой файл src/http/ngx_http_header_filter_module.c и
найди следующие две строки:

Замени
их на что-то вроде этого:

Удали
все неиспользуемые тобой nginx-модули

Некоторая
часть модулей nginx подключается к Web-серверу прямо во время компиляции,
и любой из них таит в себе потенциальную опасность. Возможно, в будущем в
одном из них будет найдена уязвимость, и твой сервер окажется под угрозой.
Отключив ненужные модули, ты сможешь значительно снизить риск
возникновения такой ситуации.

Выполни
сборку с помощью следующих команд:

Так
ты получишь nginx с заранее отключенными (и в большинстве случаев
бесполезными) модулями SSI (Server Side Includes) и Autoindex. Чтобы
узнать, какие модули можно безболезненно выбросить из Web-сервера, запусти
скрипт configure с флагом ‘—help’.

Время ожидания

Лимит времени ожидания может также резко повысить производительность.

Директивы client_body_timeout и client_header_timeout отвечают за интервал времени, на протяжении которого сервер будет ждать тело запроса или заголовок запроса от клиента. Если ни тело или заголовок не были получены, сервер выдаст ошибку 408 (Request time out).

Директива keepalive_timeout устанавливает  лимит времени ожидания Keep-Alive соединения с клиентом. Проще говоря, Nginx закроет соединения с клиентом по истечении этого периода времени.

Директива send_timeout ограничивает время ответа клиенту. Она устанавливается не на всю передачу ответа, а только на две операции чтения; если по истечении этого времени клиент ничего не примет, то Nginx прервет соединение.

Используйте суррогатное управление для изменения поведения CDN

Хотя вы можете отключить кеширование CDN и по-прежнему использовать кеширование браузера с помощью лучше иметь прямой контроль над этим. Большинство CDN будут уважать заголовок, который функционирует точно так же, как , кроме предназначенных только для CDN. Таким образом, вы можете сказать быстро сделать одно, а пользователь — другое.

В NGINX вам придется установить этот заголовок вручную и установить значение вместо использования NGINX директивы.

add_header Surrogate-Control "public, max-age=86400";
add_header Cache-Control "public, max-age=120";

Вы определенно захотите проверить с вашим CDN, чтобы убедиться, что это работает — является довольно новым и не универсальным.

Просмотры:
431

Кэширование Nginx и fastcgi

proxy_cache_path /home/vagrant/Code/ng-cache levels=1:2 keys_zone=ng_cache:10m max_size=10g inactive=60m;
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
fastcgi_cache_path /home/vagrant/Code/ngd-cache levels=1:2 keys_zone=ngd_cache:10m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
add_header NGINX_FASTCGI_CACHE $upstream_cache_status;

server {
    listen 80;
    listen 443 ssl http2;
    server_name nginx-performance.app;
    root "/home/vagrant/Code/project-nginx/public";

    index index.html index.htm index.php;

    charset utf-8;

    proxy_cache ng_cache;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    access_log off;
    error_log  /var/log/nginx/nginx-performance.app-error.log error;

    sendfile off;

    client_max_body_size 100m;

    location ~ .php$ {
        fastcgi_split_path_info ^(.+.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        fastcgi_intercept_errors off;
        fastcgi_buffer_size 16k;
        fastcgi_buffers 4 16k;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;


      fastcgi_cache ngd_cache;
      fastcgi_cache_valid  60m;
    }

    location ~ /.ht {
        deny all;
    }

    ssl_certificate     /etc/nginx/ssl/nginx-performance.app.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx-performance.app.key;
}

Мы открыли файл виртуального хоста Nginx и добавили приведенные выше настройки. Давайте поясним их.

proxy_cache_path /home/vagrant/Code/ng-cache levels=1:2 keys_zone=ng_cache:10m max_size=10g inactive=60m;

Как объяснялось в статье производительность Apache и Nginx: методы оптимизации, proxy_cache_path используется для кеширования статических ресурсов. Таких как изображения, таблицы стилей, файлы JavaScript. Сам путь должен существовать, поэтому необходимо создать эти директории.

levels означает глубину директорий внутри этого пути/папки.

Keys zone –  это имя. Каждый виртуальный хост должен использовать отдельное имя. max_size означает максимальный размер кэша, а inactive — что элементы времени будут храниться в кэше, даже если они не запрашиваются.

После этого времени простоя кэш для ресурса будет снова заполнен.

fastcgi_cache_purge

Это определяет запросы, которые смогут очистить кэш. Nginx (его модуль ngx_http_fastcgi_module) предоставляет полный комплект инструментов для кэширования. Пример использования указанной выше директивы:

fastcgi_cache_path /data/nginx/cache keys_zone=cache_zone:10m;
map $request_method $purge_method {
    PURGE   1;
    default 0;
}

server {
    ...
    location / {
        fastcgi_pass        backend;
        fastcgi_cache       cache_zone;
        fastcgi_cache_key   $uri;
        fastcgi_cache_purge $purge_method;
    }
}

В этом случае запрос PURGE REST сможет удалить данные из кэша.

Мы добавили заголовки Nginx к ответам, чтобы можно было узнать, обслуживался ли ресурс из кэша или нет.

add_header NGINX_FASTCGI_CACHE $upstream_cache_status;

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

Метод fastcgi_cache_methods полезен для кеширования конкретных методов запроса, таких как POST. GET и HEAD.

Активировав приведенную выше конфигурацию, как для статического, так и для динамического контента, мы запустили Locust. Мы подключили к системе 100 параллельных пользователей. Разница в результатах была поразительной. Того напряжения, в котором раньше находился сервер, уже не ощущалось.

Кэширование Nginx принесло несколько значительных улучшений.

Мы видим, что нам удалось сократить время загрузки страницы. Теперь оно составляет меньше секунды!

Мы также протестировали одну страницу галереи, у которой есть дополнительный «багаж» похожих и новых галерей.

Отчет в файле HAR по этому тесту.

Процесс тестирования

Мы установили Locust на наш хост и создали простой  скрипт locustfile.py:

from locust import HttpLocust, TaskSet, task

class UserBehavior(TaskSet):
    @task(1)
    def index(self):
        self.client.get("/")

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    min_wait = 300
    max_wait = 1000

Затем загрузли ngrok на нашу гостевую машину и туннелировали все HTTP-соединения через нее, чтобы можно было протестировать приложение с использованием статического URL-адреса.

После этого мы запустили Locust и подключили к приложению 100 пользователей:

На стороне сервера мы использовали PHP 7.1.10, Nginx 1.13.3 и MySQL 5.7.19, на Ubuntu 16.04.

Метод балансировки

Соединения к серверам для балансировки нагрузки могут распределяться по различным правилам. Существуют несколько методов распределения запросов. Я перечислю основные:

  • round-robin — используется по умолчанию. Веб сервер равномерно распределяет нагрузку на сервера с учетом их весов. Специально указывать этот метод в конфигурации не надо.
  • least-connected — запрос отправляется к серверу с наименьшим количеством активных подключений. В конфигурации данный параметр распределения запросов устанавливается параметром least_conn.
  • ip-hash — используется хэш функция, основанная на клиентском ip адресе, для определения, куда направить следующий запрос. Используется для привязки клиента к одному и тому же серверу. В предыдущих методах один и тот же клиент может попадать на разные серверы.
  • hash — задаёт метод балансировки, при котором соответствие клиента серверу определяется при помощи хэшированного значения ключа. В качестве ключа может использоваться текст, переменные и их комбинации.
  • random — балансировка нагрузки, при которой запрос передаётся случайно выбранному серверу, с учётом весов.

В платной версии существуют дополнительный более продвинутый метод распределения нагрузки — least_time, при котором запрос передаётся серверу с наименьшими средним временем ответа и числом активных соединений с учётом весов серверов.

Пример настройки:

upstream cache-api {
    ip_hash;
    server 10.32.18.6:8080;
    server 10.32.18.7:8080;
    server 10.32.18.8:8080;
}

Отрегулируйте размер хеш-таблицы

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

Хеш-таблицаКоэффициент нагрузкиПроцент используемой в настоящее время емкости. Если в хеш-таблице 3 элемента и 5 сегментов, то коэффициент загрузки равен。

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

Если коэффициент загрузки становится больше 75%, размер хеш-таблицы можно изменить. Код для добавления этого условия предоставляется читателю в качестве упражнения. Помните, что увеличение размера массива ведра изменит индекс массива, на который отображается ключ! Это требует, чтобы вы снова вставили все элементы после изменения размера массива.

6 ответов

12

Список имен , которые nginx обслуживает, хранится в хеш-таблице для быстрого поиска . По мере увеличения количества записей вам нужно увеличить размер хеш-таблицы и /или количество хэш-кодов в таблице.

Учитывая характер вашей установки, я не могу думать о том, чтобы вы могли легко уменьшить количество имен «хранится в таблице. Однако я предлагаю вам не перезапускать nginx, а просто перезагрузить его конфигурацию. Например:

11

Просто некоторые технические детали, которые я вырыл, образуют исходный код:

  • Общая рекомендация состояла бы в том, чтобы обе величины были как можно меньше.
  • Если nginx жалуется, сначала увеличивайте до тех пор, пока он жалуется. Если число превышает некоторое большое число (например, 32769), увеличьте до нескольких значений по умолчанию на вашей платформе, если они жалуются. Если он больше не жалуется, уменьшите до тех пор, пока он не будет жаловаться. Теперь у вас есть лучшая настройка для вашего набора имен серверов (каждому набору server_names может понадобиться другая настройка).
  • Больше означает больше потребляемой памяти (один раз на одного работника или сервера, прокомментируйте, если вы знаете).
  • Больше означает больше циклов процессора (для каждого поиска в домене) и больше передач из основной памяти в кеш.
  • не относится к числу серверов_имя напрямую, если число серверов удваивается, вам может потребоваться увеличить 10 раз или даже больше, чтобы избежать столкновений. Если вы не можете избежать их, вам нужно увеличить .
  • , как говорят, увеличивается до следующей степени в два, из исходного кода, который я бы судил, должно быть достаточно, чтобы сделать его кратным значение по умолчанию, это должно обеспечить оптимальный переход в кеш.
  • Среднее имя домена должно вписываться в 32 байта даже с накладными расходами хэш-массива. Если вы увеличите до 512 байт, он будет вмещать 16 доменных имен с сталкивающимся хеш-ключом. Это не то, что вы хотите, если происходит столкновение . Вы хотите иметь как можно меньше столкновений.
  • Если у вас есть и маленький , вы можете прийти в течение длительного времени загрузки, поскольку nginx попытается найти оптимальный размер хэша в цикле.
  • Если у вас есть больше 10000, будет только «1000» циклов, прежде чем он будет жаловаться.

1

@ Майкл Хэмптон абсолютно прав с его ответом. Эта хеш-таблица построена и скомпилирована во время перезагрузки или перезагрузки, а затем она работает очень быстро. Я думаю, эта таблица хэшей может расти намного больше, не ухудшая производительность. Но я бы предложил использовать размер, который равен двум, например 4096, из-за природы кода C.

1

Увеличьте конфигурацию «server_names_hash_bucket_size» внутри вашего nginx.conf.

У меня было 64 и было изменено на 128.

Проблема решена.

Я не уверен на 100% в вашем случае, но я получал такое же предупреждение, потому что дважды вызывал proxy_set_header для X-Forwarded-Proto:

Это происходило, потому что я включал proxy_params, и он содержит эту строку среди других:

Удаление этой строки из конфигурации моего сайта заставило предупреждение уйти.

-2

Изменить

к

Использование всей цепочки сертификатов

Применяя сертификат в NGINX, необходимо загрузить не только сертификат для домена, но и для всех центров сертификации — как основного, так и промежуточных. В противном случае, мы получим ошибку This server’s certificate chain is incomplete. Grade capped to B:

В случае покупки сертификата, нам отправляют все ключи в отдельных файлах. Цепочка сертификатов, как правило, идет в файле chain. Мы должны скопировать последовательность в данном файле и добавить ее к содержимому в файле с сертификатом домена — получиться файл, содержащий как последовательность для домена, так и всех центров. Назвать его можно fullchain.pem.

В случае получение бесплатного сертификата от Let’s Encrypt, мы получаем 4 файла, один из которых называется fullchain.pem — именно он и содержит все необходимые последовательности.

И так, при настройке виртуального домена в NGINX, необходимо указать путь до файла, содержащего в себе все ключи, например:

server {
        listen 443;
        server_name security.dmosk.ru;
        ssl on;
        ssl_certificate /etc/nginx/ssl/fullchain.pem;
        ssl_certificate_key /etc/nginx/ssl/cert.key;
        …
}

* в данном примере мы настраиваем NGINX для домена security.dmosk.ru; обратите внимание, что мы указали путь до файла fullchain.pem, в котором должны находиться последовательности, как для домена, так и центров сертификации. Не забываем перезапустить nginx:

Не забываем перезапустить nginx:

systemctl restart nginx

Шаг 2: настройка кэша браузера

Когда вы первый раз заходите на какой-либо сайт, файлы загружаются и хранятся в кэше браузера. И при последующих посещениях браузер будет использовать уже имеющиеся локальные версии вместо того, чтобы загружать файлы снова. Это позволяет загружать страницы гораздо быстрее, потому что необходимо загружать лишь те данные, которые изменились с момента последнего посещения сайта. Это удобно для пользователей, и именно поэтому Google’s PageSpeed Insights советует выполнять эту рекомендацию.

Снова откройте конфигурационный файл Nginx в редакторе:

$ sudo nano /etc/nginx/sites-available/default

Нужно добавить пару строк для того, чтобы  браузеры хранили CSS, JS файлы, а также изображения и PDF файлы в течение 7 дней.

Следующий сниппет вставьте в блок server сразу после предыдущего кода для Gzip-сжатия:

...

# text/html is always compressed by gzip module

location ~*  \.(jpg|jpeg|png|gif|ico|css|js|pdf)$ {

expires 7d;

}

Примечание. Это настройка для контента, который регулярно меняется. А если, к примеру, у вас обычный блог, в который разработчики редко вносят изменения, нет смысла заново загружать данные каждую неделю. Вместо этого можно установить более длительный период (скажем, 30 дней или больше).

В итоге конфигурационный файл Nginx будет выглядеть вот так:

server {

listen 80 default_server;

listen :80 default_server;

gzip on;

gzip_comp_level5;

gzip_min_length256;

gzip_proxied any;

gzip_vary  on;

gzip_types

application/atom+xml

application/javascript

application/json

application/ld+json

application/manifest+json

application/rss+xml

application/vnd.geo+json

application/vnd.ms-fontobject

application/x-font-ttf

application/x-web-app-manifest+json

application/xhtml+xml

application/xml

font/opentype

image/bmp

image/svg+xml

image/x-icon

text/cache-manifest

text/css

text/plain

text/vcard

text/vnd.rim.location.xloc

text/vtt

text/x-component

text/x-cross-domain-policy;

# text/html is always compressed by gzip module

location ~*  \.(jpg|jpeg|png|gif|ico|css|js|pdf)$ {

 expires 7d;

}

}

Сохраните и закройте файл. Затем снова на всякий случай проверьте настройки на предмет ошибок:

$ sudo nginx –t

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

$ sudo systemctl restart nginx

Все эти настройки позволят вашему сайту получить более высокие баллы в PageSpeed, так как теперь ваш сайт должен грузиться намного быстрее.

Правильный сертификат

Под этим подразумевается выполнение двух условий:

  1. Сертификат должен быть выпущен доверенным центром.
  2. Сертификат должен быть выдан для домена, к которому идет подключение.

Доверенный центр

Есть список центров сертификации, внесенные в общий реестр доверенных узлов, которые могут выпускать ключи безопасности. Данным центрам по умолчанию доверяют все основные операционные системы.

Для получения сертификата от правильного центра, необходимо за него заплатить или получить бесплатно от Let’s Encrypt. Купить сертификат можно у большинства хостеров или регистраторов доменных имен. Для получения бесплатного сертификата можно воспользоваться инструкцией Получение бесплатного SSL сертификата Let’s Encrypt.

И наоборот, сертификат может быть выпущен не доверенным центром или локально на компьютере (самоподписанный). В таком случае мы получим ошибку при проверке подлинности.

Сертификат для домена

Заказывая сертификат, мы обязательно указываем, для какого доменного имени его будем использовать. Это обязательное требование. Например, если мы хотим настроить SSL-подключение к узлу security.dmosk.ru, то необходимо указывать именно это имя при заказе ключа безопасности. В противном случае, браузер будет выдавать нам ошибку, что сертификат выдан для другого узла.

Также мы можем заказать сертификат типа wildcard — он применим к домену и все его поддоменам. Например, в нашем случае мы можем заказать ключ для *.dmosk.ru — он будет применять для любого доменного имени 3-го уровня с корнем dmosk.ru.

Заключение

В данной статье были проверены некоторые моменты, упомянутые в предыдущем материале по производительности Nginx. Также мы проанализировали управление процессом и степень его влияния на время загрузки страницы.

Пожалуйста, опубликуйте ваши мнения по текущей теме материала. За комментарии, дизлайки, отклики, подписки, лайки низкий вам поклон!

Пожалуйста, опубликуйте свои отзывы по текущей теме материала. Мы очень благодарим вас за ваши комментарии, лайки, подписки, дизлайки, отклики!

Наталья Кайдаавтор-переводчик статьи «Server-side Optimization with Nginx and pm-static»

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: