Вопрос или проблема
У меня есть локальная машина с Debian 12 в лаборатории компании.
На этой локальной машине работают разные серверы, доступные по разным веб-адресам.
Предположим, первый сервер доступен в Интернете по адресу: https://firstdomain.dnsprovider1.org
А второй доступен по адресу: https://seconddomain.dnsprovider2.org
Оба сервера работают в контейнерах Docker и слушают разные порты:
0.0.0.0:21300->21300/tcp, :::21300->21300/tcp
8971/tcp, 0.0.0.0:9969->8969/tcp, :::9969->8969/tcp, 0.0.0.0:9972->8972/tcp, :::9972->8972/tcp
0.0.0.0:5332->5332/tcp, :::5332->5332/tcp
Для этих веб-сайтов я настроил apache2, который слушает на портах 80 и 443 для перенаправления на соответствующие порты, например 21300 и 9969, как указано в конфигурационном файле Apache, например:
<VirtualHost *:80>
ServerName firstdomain.dnsprovider1.org
ServerAlias *.firstdomain.dnsprovider1.org
Redirect permanent / https://firstdomain.dnsprovider1.org
</VirtualHost>
<VirtualHost *:443>
ServerName firstdomain.dnsprovider1.org
ServerAlias *.firstdomain.dnsprovider1.org
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/firstdomain.dnsprovider1.org/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/firstdomain.dnsprovider1.org/privkey.pem
ProxyPreserveHost On
ProxyPass / http://localhost:9969/
ProxyPassReverse / http://localhost:9969/
ErrorLog ${APACHE_LOG_DIR}/dmpr_error.log
CustomLog ${APACHE_LOG_DIR}/dmpr_access.log combined
</VirtualHost>
Я использовал Let’sEncrypt для получения SSL-сертификатов, и все работает правильно. Все сервера доступны удаленно из Интернета. Я настроил перенаправление портов на роутере для портов 80 и 443.
Чтобы достичь серверов с компьютеров в одной локальной сети, я просто настроил файл hosts в /etc/hosts
, добавив:
192.XXX.X.XXX firstdomain.dnsprovider1.org
, где 192.XXX.X.XXX – это локальный IP-адрес машины в локальной сети.
В dnsprovider1.org я настроил веб-IP-адрес роутера, связанный с именем домена. Эта система хороша для наличия нескольких веб-серверов.
Теперь я нахожусь в ситуации, когда у нас есть собственное имя домена, связанное с веб-сайтом компании, скажем: www.mycompany.com
Я создал несколько страниц, которые перенаправляют на IP-адрес роутера, где находится локальная машина, хостающая все серверы, например www.mycompany.com/server1, www.mycompany.com/server2 и т. д.
Мне нужна система для управления ранее существующими доменными именами серверов и новыми, которые я хочу добавить. Скажем, мне нужно иметь 10 или 20 серверов, работающих на одной машине, и важно найти способ легко управлять всеми сертификатами. Я хочу использовать существующий и работающий сертификат для веб-сайта, размещенного на веб-хостинге.
Первый вопрос касается следующего. Какой лучший способ управлять множеством доменных имен, связанных с множеством серверов, работающих на одной машине и слушающих разные порты? Я подумал, что Caddy2 является решением, но хочу узнать ваше мнение, если это также может работать с Apache, и если да, то как?
Второй вопрос касается следующего. Как использовать SSL-сертификат домена www.mycompany.com, который хорошо работает на всех серверах? Это возможно? Следуя тем же процедурам предыдущих провайдеров DNS, т.е. $ sudo certbot --apache -d www.mycompany.com
, он возвращает ошибку о том, что несанкционированно
$ sudo certbot --apache -d www.mycompany.com
Сохранение отладочного журнала в /var/log/letsencrypt/letsencrypt.log
Запрос сертификата для www.mycompany.com
Certbot не смог аутентифицировать некоторые домены (аутентификатор: apache). Сертификационный центр сообщил о следующих проблемах:
Домен: www.mycompany.com
Тип: неавторизовано
Детали: 39.56.289.27: Неверный ответ от https://www.mycompany.com/.well-known/acme-challenge/cEr8rw-2YMjxJW5NM1pS_HP-S4p32npL2hw-sIywXnM: 404
Подсказка: Сертификационный центр не смог подтвердить временные изменения конфигурации Apache, внесенные Certbot. Убедитесь, что указанные домены указывают на этот сервер Apache и что он доступен из Интернета.
Некоторые проблемы с вызовом не удались.
Обратитесь за помощью или ищите решения на https://community.letsencrypt.org. Смотрите журнал ошибок в /var/log/letsencrypt/letsencrypt.log или повторно запустите Certbot с -v для получения дополнительных сведений.
У меня нет доступа к сертификату домена www.mycompany.com, даже если я могу управлять веб-сайтом на WordPress, размещенным там. Какое могло бы быть решение?
Ответ или решение
Управление несколькими доменами на одном сервере с помощью Apache и Let’s Encrypt
Введение
В современных интернет-решениях важной задачей является надежное и эффективное управление множеством доменных имен, привязанных к различным серверам на одном физическом устройстве. Особенно актуально это для предприятий, использующих контейнеризацию, например Docker. В данной статье мы рассмотрим, как организовать подобное управление на базе Debian 12 с использованием Apache и Let’s Encrypt.
Управление доменными именами на Apache
Настройка виртуальных хостов в Apache
Apache предоставляет мощный механизм виртуальных хостов, который позволяет обрабатывать запросы на разные домены с одного IP-адреса. Для каждого сервера, работающего на разных портах, необходимо создать конфигурацию виртуального хоста. Основные шаги:
-
Создание конфигурации виртуальных хостов:
Для каждого домена создайте файл конфигурации в директории
/etc/apache2/sites-available/
. Например, для первого домена:<VirtualHost *:80> ServerName firstdomain.dnsprovider1.org Redirect permanent / https://firstdomain.dnsprovider1.org </VirtualHost> <VirtualHost *:443> ServerName firstdomain.dnsprovider1.org SSLEngine on SSLCertificateFile /etc/letsencrypt/live/firstdomain.dnsprovider1.org/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/firstdomain.dnsprovider1.org/privkey.pem ProxyPass / http://localhost:9969/ ProxyPassReverse / http://localhost:9969/ </VirtualHost>
Аналогично создайте настройки для других доменов, указывая соответствующие порты и сертификаты.
-
Активация конфигурации:
После создания файлов, активируйте их с помощью команды:
sudo a2ensite firstdomain.conf
Не забудьте перезапустить Apache для применения изменений:
sudo systemctl restart apache2
Подключение Caddy как альтернативы
Caddy является современным веб-сервером, который автоматически управляет SSL-сертификатами, делая настройку проще. Он предоставляет более простой способ балансировки нагрузки и проксирования. Если вы рассматриваете возможность использования Caddy, его конфигурация будет выглядеть следующим образом:
firstdomain.dnsprovider1.org {
reverse_proxy localhost:9969
tls cert.pem key.pem
}
Caddy автоматически обрабатывает запросы на получение сертификатов из Let’s Encrypt.
Использование существующего SSL-сертификата
Если у вас уже есть сертификат для домена www.mycompany.com
, и вы хотите использовать его для серверов, работающих на других портах, есть несколько способов сделать это:
-
Создание поддоменов:
Если вы можете создать поддомены, например
server1.mycompany.com
, вам будет проще управлять сертификатами и редиректами. -
Использование Certbot в режиме веб-сервера:
Certbot требует, чтобы домен указывал на тот сервер, который будет генерировать сертификат. Убедитесь, что ваш DNS правильно настроен и направляет запросы на IP вашего веб-сервера. В случае, если вы получаете ошибку
404
, это может означать, что Certbot не может получить доступ к временным файлам для аутентификации. Проверьте следующие моменты:- Убедитесь, что ваш домен
www.mycompany.com
действительно указывает на ваш IP. - Проверьте настройки файрвола и маршрутизатора, чтобы удостовериться, что порты 80 и 443 открыты.
- Во избежание конфликта проверьте, нет ли других серверов, слушающих эти порты.
- Убедитесь, что ваш домен
Заключение
Управление несколькими доменными именами и сертификатами на одном сервере — это задача, которая требует организации и понимания работы веб-серверов. Apache и Caddy предлагают мощные инструменты для этого. При наличии правильной конфигурации вы сможете без проблем масштабировать свое решение, добавляя новые домены и управляя SSL-сертификатами.