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

NGINX SSL Pass-thru и Docker

У меня есть сервер с 2 сайтами. Назовем их foo.com и bar.com.

foo.com имеет субдомен, называемый mail.foo.com.

Обе foo.com и bar.com являются сайтами WordPress, и их конфигурация NGINX - это обычная конфигурация WP, которую вы найдете в инструкциях WP.

У меня также есть докер, на котором Mailcow образ, который прослушивает порты 0.0.0.0:3333 (http) и 0.0.0.0:3334 (https).

Есть ли способ настроить NGINX так, чтобы открыть браузер и перейти к следующему:

В настоящее время я пытаюсь добиться этого с помощью следующего:

stream {
    map $ssl_preread_server_name $name {
        mail.foo.com mailcow;
    }

    upstream mailcow {
        server 127.0.0.1:3333;
    }

    server {
        listen 0.0.0.0:80;
        proxy_pass $name;
        ssl_preread on;
    }
}

Но как только я пытаюсь запустить NGINX, он говорит, что порт 80 уже используется. Порт 80 ничего не прослушивает. И я подозреваю, что настоящая причина, по которой NGINX так говорит, заключается в том, что http блок в конфигурации каждого виртуального хоста (домена) тоже слушает порт 80.

Итак, вероятно, у меня должен быть вопрос: могу ли я слушать порт 80 в обоих stream и http разделы?

Если "нет", как я могу передавать по ssl трафик из mail.foo.com?

Вы не можете использовать несколько протоколов прикладного уровня для одной и той же комбинации IP-адреса и порта. Это означает, что у вас не может быть и HTTP, и HTTPS на одном и том же порту, но также что у вас не может быть HTTP и поток (т. Е. Неуказанный протокол уровня приложений) на одном и том же ip: port.

Но учитывая, что вы действительно используете поток для пересылки HTTP и HTTPS, вы можете просто использовать обычный обратные прокси (proxy_pass) вместо потока, т.е. иметь виртуальные хосты для foo.com и bar.com как у вас сейчас, а затем есть еще один виртуальный хост для mail.foo.com который является обратным прокси для вашего экземпляра mailcow. Поскольку это будет реальный обратный прокси HTTP / HTTPS, а не передача уровня TCP, сертификат для mailcow необходимо установить на nginx. Вы также можете просто перенаправить внешний HTTPS и HTTP на HTTP-интерфейс mailcow и позволить только nginx работать с HTTPS. Настройка будет выглядеть примерно так:

server {
    listen 80;
    servername mail.foo.com;
    location / {
        proxy_pass http://127.0.0.1:3333;
    }
}
server {
    listen 443 ssl;
    servername mail.foo.com;
    ssl_certificate ...
    ssl_certificate_key ...
    location / {
        proxy_pass http://127.0.0.1:3333;
    }
}