Можно ли запустить HTTP / 2 на порту 443 NGINX без ssl?

У меня есть Envoy Proxy, обрабатывающий завершение SSL. Nginx (1.17.0 в контейнере докеров, скомпилированный --with-http_v2_module) - одна из нескольких вышестоящих служб. В результате Nginx получает трафик на порт 443, но не использует модуль ssl:

server {
    listen 443;
    server_name example.com www.example.com;
    root /var/www/html;

...

Это работает нормально, но если я попытаюсь добавить http2 в конец строки прослушивания, я получаю:

curl: (1) Received HTTP/0.9 when not allowed

... не только для рассматриваемого example.com, но и для всех серверов.

Я хотел бы, чтобы Envoy общался с Nginx через HTTP / 2 по очевидным причинам производительности.

Есть ли какой-нибудь трюк, чтобы заставить nginx использовать http2 на порту 443 без завершения SSL?


Редактировать:

Ядро nginx.conf:

user  nginx;
worker_processes  2;

pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    client_max_body_size 64M;

    sendfile        on;

    keepalive_timeout  65;

    fastcgi_cache_path /etc/nginx-cache levels=1:2 keys_zone=multipress:100m 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;

    gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

Обратите внимание, что я могу успешно скрутить текущий HTTP2-сервер Envoy с помощью явной команды curl --http2. Проблема заключается в соединении HTTP2 между Envoy и Nginx.


person Zane Claes    schedule 13.05.2020    source источник
comment
Можете ли вы показать используемую команду curl?   -  person Barry Pollard    schedule 13.05.2020
comment
@BarryPollard, на самом деле это была ошибка, возвращаемая проверкой работоспособности Kubernetes. Но я просто сделал curl localhost: 443 из контейнера докеров. Конечно, моя версия curl поддерживает http2, и я тестировал ее на серверах http / 2. Фактически, это работает, когда я скручиваю тот же ресурс, используя текущий путь Envoy (http2) - ›nginx (http1).   -  person Zane Claes    schedule 13.05.2020


Ответы (1)


Nginx поддерживает только h2c (так называется HTTP / 2 без HTTPS), поэтому вы не можете подключиться с помощью HTTP / 1.1, а затем выполнить обновление.

Фактически, если вы попытаетесь подключиться с помощью HTTP / 1.1, то nginx выдаст ошибку, поскольку не поддерживает HTTP / 1.1 и HTTP / 2 на одном порте, если вы не используете HTTPS.

Итак, для curl вы должны использовать этот синтаксис, чтобы сразу перейти к HTTP / 2:

curl --http2-prior-knowledge localhost:80

Не уверен, есть ли аналогичная конфигурация в Envoy, так как не используйте ее, но если вышеуказанное работает с curl и по-прежнему выдает ту же ошибку с Envoy, то, по крайней мере, вы получили ответ на свой вопрос о Nginx.

Однако я вовсе не уверен, что нужно или даже разумно включать h2c для вашего внутреннего сервера. Для начала, который отключает HTTP / 1.1, как обсуждалось выше, и любые другие приложения, службы или даже команды теста curl, использующие HTTP / 1.1, будут нарушены.

Кроме того, преимущества HTTP / 2 в серверной части сомнительны , и основное преимущество заключается в подключении клиента к серверу, а не к внутренним соединениям сервера с сервером.

person Barry Pollard    schedule 13.05.2020
comment
Отлично, очень тщательно - и я не осознавал этого по поводу HTTP / 2-бэкэнда. Тогда я просто откажусь от идеи :) - person Zane Claes; 14.05.2020