У меня есть сервер с 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 так, чтобы открыть браузер и перейти к следующему:
foo.com
покажет мой сайт foo
bar.com
покажет мой сайт bar
(эти две точки в настоящее время работают должным образом) http://mail.foo.com
сделает NGINX сквозным для 127.0.0.1:3333
https://mail.foo.com
сделает NGINX сквозным для 127.0.0.1:3334
В настоящее время я пытаюсь добиться этого с помощью следующего:
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;
}
}