Назад | Перейти на главную страницу

Понимание различных значений для директивы Nginx 'listen'

Я пишу конфиг nginx, и у меня есть принципиальный вопрос.

В чем различия между:

listen 443 ssl; против listen [::]:443 ssl; против listen [::]:443 ssl http2;

Моя цель - защитить это веб-приложение, но при этом сохранить его совместимость со старыми клиентами.

Примечание: я понимаю, что [::]:443 имеет отношение к ipv6, но охватывает ли он и ipv4 в этом случае? Хочу прояснить мои концепции.

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#listen

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, может ответить на запрос, как если бы поле заголовка Upgrade отсутствовало.

HTTP/1.1 200 OK Content-Length: 243 Content-Type: text/html

Сервер, поддерживающий HTTP / 2, принимает обновление с ответом 101 (протоколы переключения). После пустой строки, завершающей ответ 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 директива, она отключена для всех.

Видеть этот документ для подробностей.