Понимание различных значений директивы listen для nginx
Я пишу конфиг nginx, и у меня есть фундаментальный вопрос.
Каковы различия между:
listen 443 ssl;
против listen [::]:443 ssl;
против listen [::]:443 ssl http2;
Моя цель - обеспечить безопасность этого веб-приложения, но также поддерживать совместимость со старыми клиентами.
Примечание: я понимаю, что [::]:443
имеет отношение к ipv6, но охватывает ли он и ipv4 в этом случае? Хочу прояснить мои концепции.
2 ответа
listen 443 ssl
: заставляет nginx прослушивать все адреса ipv4 на сервере, через порт 443 (0.0.0.0:443
)
в то время как
listen [::]:443 ssl
: заставляет nginx прослушивать все адреса ipv6 на сервере, через порт 443 (:::443
)
[::]:443
не заставит nginx отвечать на ipv4 по умолчанию, если вы не укажете параметр ipv6only=off
:
listen [::]:443 ipv6only=off;
Согласно документу: http://nginx.org/en/docs/http/ngx_http_core_module.html
ssl:
Параметр ssl (0.7.14) позволяет указать, что все соединения, принятые на этом порту, должны работать в режиме SSL.
http2:
Параметр http2 (1.9.5) настраивает порт на прием соединений HTTP / 2.
Это не значит, что он принимает только HTTP / 2 соединения.
Согласно RFC7540
Клиент, который запрашивает URI "http" без предварительного знания о поддержке HTTP / 2 при следующем переходе, использует механизм обновления HTTP. Клиент делает это, отправляя запрос HTTP / 1.1, который включает поле заголовка Upgrade с токеном "h2c".
Сервер, который не поддерживает HTTP / 2, может ответить на запрос, как если бы поле заголовка обновления отсутствовало.
HTTP/1.1 200 OK Content-Length: 243 Content-Type: text/html
Сервер, который поддерживает HTTP / 2, принимает обновление с ответом 101 (Switching Protocols). После пустой строки, которая завершает ответ 101, сервер может начать отправку кадров HTTP / 2.
Подвести итоги:
Клиент, который не поддерживает HTTP / 2, никогда не будет запрашивать у сервера обновление связи HTTP / 2: связь между ними будет полностью HTTP1/1.
Клиент, поддерживающий HTTP / 2, запросит у сервера (используя HTTP1/1) обновление HTTP / 2:
- Если сервер готов к HTTP / 2, то сервер заметит клиента как такового: связь между ними будет переключена на HTTP / 2.
- Если сервер не готов к HTTP / 2, то сервер будет игнорировать запрос на обновление, отвечая HTTP1/1: связь между ними должна оставаться достаточной HTTP1/1.
Может быть, более кратко изложено здесь: http://qnimate.com/http2-compatibility-with-old-browsers-and-servers/
Однако в документе nginx говорится о HTTP / 2 через TLS:
Обратите внимание, что для принятия соединений HTTP / 2 через TLS требуется поддержка расширения TLS "Согласование протокола уровня приложения" (ALPN), которое доступно только начиная с OpenSSL версии 1.0.2.
Убедитесь, что старые клиенты соответствуют этому требованию.
Есть опция под названием ipv6only
который определяет, относится ли адрес IPv6 к IPv4. По умолчанию он включен (что означает, что нет).
В руководстве говорится, что его можно установить только один раз, что, я думаю, означает, что если вы отключите его в одном listen
директива, она отключена для всех.
Смотрите этот документ для деталей.