Поиск по сайту:

Как настроить Nginx с поддержкой HTTP/2 в Ubuntu 18.04


Предыдущая версия этого руководства была написана Сергеем Жукаевым.

Введение

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

HTTP/2 — это новая версия протокола передачи гипертекста, который используется в Интернете для доставки страниц с сервера в браузер. HTTP/2 — это первое крупное обновление HTTP почти за два десятилетия: HTTP1.1 был представлен публике еще в 1999 году, когда веб-страницы обычно представляли собой один файл HTML со встроенной таблицей стилей CSS. Интернет сильно изменился с тех пор, и теперь мы сталкиваемся с ограничениями HTTP 1.1 — протокол ограничивает потенциальную скорость передачи для большинства современных веб-сайтов, потому что он загружает части страницы в очереди (предыдущая часть должна быть загружена полностью, прежде чем будет загружена последняя). начинается следующая часть), и в среднем современная веб-страница требует для загрузки около 100 запросов (каждый запрос представляет собой изображение, файл js, файл css и т. д.).

HTTP/2 решает эту проблему, поскольку вносит несколько фундаментальных изменений:

  • Все запросы загружаются параллельно, а не в очередь.
  • Заголовки HTTP сжаты
  • Страницы передаются как двоичные, а не как текстовые файлы, что более эффективно
  • Серверы могут «отправлять» данные даже без запроса пользователя, что повышает скорость для пользователей с высокой задержкой.

Несмотря на то, что HTTP/2 не требует шифрования, разработчики двух самых популярных браузеров, Google Chrome и Mozilla Firefox, заявили, что из соображений безопасности они будут поддерживать HTTP/2 только для HTTPS-соединений. Следовательно, если вы решите настроить серверы с поддержкой HTTP/2, вы также должны защитить их с помощью HTTPS.

Это руководство поможет вам настроить быстрый и безопасный сервер Nginx с поддержкой HTTP/2.

Предпосылки

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

  • Один сервер Ubuntu 18.04, настроенный в соответствии с руководством по первоначальной настройке сервера Ubuntu 18.04, включая пользователя без полномочий root и брандмауэр.
  • Nginx установлен на вашем сервере, что вы можете сделать, следуя инструкциям по установке Nginx в Ubuntu 18.04.
  • Доменное имя, настроенное так, чтобы оно указывало на ваш сервер. Вы можете приобрести его на странице Как управлять своим доменом с помощью DigitalOcean.
  • Сертификат TLS/SSL, настроенный для вашего сервера. У вас есть три варианта:
    • Вы можете получить бесплатный сертификат из статьи Как защитить Nginx с помощью Let’s Encrypt в Ubuntu 18.04.
    • Вы также можете создать и настроить самозаверяющий сертификат, следуя инструкциям Как создать самозаверяющий SSL-сертификат для Nginx в Ubuntu 18.04.
    • Вы можете узнать, как создать самозаверяющий SSL-сертификат для Nginx в Ubuntu 18.04.

    Шаг 1 — Включение поддержки HTTP/2

    Если вы выполнили шаг настройки блока сервера в руководстве по установке Nginx, у вас должен быть блок сервера для вашего домена в /etc/nginx/sites-available/your_domain с директива server_name уже установлена соответствующим образом. Первым изменением, которое мы внесем, будет изменение блока сервера вашего домена для использования HTTP/2.

    Откройте файл конфигурации для вашего домена:

    1. sudo nano /etc/nginx/sites-available/your_domain

    В файле найдите переменные listen, связанные с портом 443:

    ...
        listen [::]:443 ssl ipv6only=on; 
        listen 443 ssl; 
    ...
    

    Первый предназначен для соединений IPv6. Второй — для всех подключений IPv4. Мы включим HTTP/2 для обоих.

    Измените каждую директиву listen, включив в нее http2:

    ...
        listen [::]:443 ssl http2 ipv6only=on; 
        listen 443 ssl http2; 
    ...
    

    Это говорит Nginx использовать HTTP/2 с поддерживаемыми браузерами.

    Сохраните файл конфигурации и выйдите из текстового редактора.

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

    1. sudo nginx -t

    Если синтаксис не содержит ошибок, вы увидите следующий вывод:

    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    

    Далее мы настроим наш сервер на использование более строгого списка шифров.

    Шаг 2 — Удаление старых и небезопасных наборов шифров

    HTTP/2 имеет черный список старых и небезопасных шифров, поэтому мы должны избегать их. Наборы шифров — это криптографические алгоритмы, которые описывают, как должны быть зашифрованы передаваемые данные.

    Метод, который вы будете использовать для определения шифров, зависит от того, как вы настроили сертификаты TLS/SSL для Nginx.

    Если вы использовали Certbot для получения сертификатов, он также создал файл /etc/letsencrypt/options-ssl-nginx.conf, содержащий шифры, недостаточно стойкие для HTTP/2. Изменение этого файла, к сожалению, не позволит Certbot применять обновления в будущем, поэтому мы просто скажем Nginx не использовать этот файл и укажем собственный список шифров.

    Откройте файл конфигурации блока сервера для вашего домена:

    sudo nano /etc/nginx/sites-available/your_domain
    

    Найдите строку, содержащую файл options-ssl-nginx.conf, и закомментируйте ее:

    
        # include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot<^>
    

    Ниже этой строки добавьте эту строку, чтобы определить разрешенные шифры:

    
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    

    Сохраните файл и выйдите из редактора.

    Если вы использовали самозаверяющие сертификаты или использовали сторонний сертификат и настроили его в соответствии с предварительными требованиями, откройте файл /etc/nginx/snippets/ssl-params.conf в текстовом редакторе:

    1. sudo nano /etc/nginx/snippets/ssl-params.conf

    Найдите следующую строку:

    ...
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ...
    

    Измените его, чтобы он выглядел так:

    
    ...
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    

    Сохраните файл и выйдите из редактора.

    Еще раз проверьте конфигурацию на наличие синтаксических ошибок:

    1. sudo nginx -t

    Если вы видите какие-либо ошибки, исправьте их и повторите тестирование.

    Как только вы не увидите синтаксических ошибок, перезапустите Nginx:

    1. sudo systemctl reload nginx

    Перезапустив сервер, давайте проверим, работает ли он.

    Шаг 3 — Проверка того, что HTTP/2 включен

    Давайте удостоверимся, что сервер работает и работает с HTTP/2.

    Используйте команду curl, чтобы сделать запрос на ваш сайт и просмотреть заголовки:

    1. curl -I -L https://your_domain

    Вы увидите следующий вывод:

    Output
    HTTP/1.1 301 Moved Permanently Server: nginx/1.14.0 (Ubuntu) Date: Fri, 06 Jul 2018 19:07:12 GMT Content-Type: text/html Content-Length: 194 Connection: keep-alive Location: https://your_domain/ HTTP/2 200 server: nginx/1.14.0 (Ubuntu) date: Fri, 06 Jul 2018 19:07:12 GMT content-type: text/html content-length: 16 last-modified: Fri, 06 Jul 2018 16:55:37 GMT etag: "5b3f9f09-10" accept-ranges: bytes

    Вы также можете убедиться, что HTTP/2 используется в Google Chrome. Откройте Chrome и перейдите по адресу http://ваш_домен. Откройте инструменты разработчика Chrome (Просмотр -> Разработчик -> Инструменты разработчика) и перезагрузите страницу (Просмотр -> Перезагрузить эту страницу). Перейдите на вкладку «Сеть», щелкните правой кнопкой мыши строку заголовка таблицы, начинающуюся с «Имя», и выберите параметр «Протокол» во всплывающем меню.

    Вы увидите h2 (что означает HTTP/2) в новом столбце протокола, что указывает на то, что HTTP/2 работает.

    На этом этапе вы готовы обслуживать контент по протоколу HTTP/2. Давайте повысим безопасность и производительность, включив HSTS.

    Шаг 4 — Включение HTTP Strict Transport Security (HSTS)

    Несмотря на то, что ваши HTTP-запросы перенаправляются на HTTPS, вы можете включить Строгую транспортную безопасность HTTP (HSTS), чтобы избежать таких переадресаций. Если браузер находит заголовок HSTS, он не будет снова пытаться подключиться к серверу через обычный HTTP в течение заданного периода времени. Несмотря ни на что, он будет обмениваться данными, используя только зашифрованное HTTPS-соединение. Этот заголовок также защищает нас от атак с понижением версии протокола.

    Откройте файл конфигурации Nginx в вашем редакторе:

    sudo nano /etc/nginx/nginx.conf
    

    Добавьте эту строку в файл, чтобы включить HSTS:

    http {
    ...
        ##
        # Virtual Host Configs
        ##
    
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
        add_header Strict-Transport-Security "max-age=15768000" always;
    }
    ...
    

    max-age задается в секундах. Значение 15768000 эквивалентно 6 месяцам.

    По умолчанию этот заголовок не добавляется в запросы субдоменов. Если у вас есть поддомены и вы хотите, чтобы HSTS применялся ко всем из них, вы должны добавить переменную includeSubDomains в конец строки, например:

    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
    

    Сохраните файл и выйдите из редактора.

    Еще раз проверьте конфигурацию на наличие синтаксических ошибок:

    1. sudo nginx -t

    Наконец, перезапустите сервер Nginx, чтобы изменения вступили в силу.

    1. sudo systemctl reload nginx

    Заключение

    Ваш сервер Nginx теперь обслуживает страницы HTTP/2. Если вы хотите проверить надежность вашего SSL-соединения, посетите Qualys SSL Lab и запустите тест на своем сервере. Если все настроено правильно, вы должны получить оценку A+ по безопасности.