@f_u_s_s
Любопытный кодер

Почему httpd (apache) отдает не тот сайт?

Достался сервер со старым ISPManager (4), к тому же где-то сломанным - потому что конфиги и SSL-сертификаты он не позволяет настраивать и т.д.

На сервере есть 2 домена: example.ru и m.example.ru
Работали они на HTTP и все было хорошо, потребовался HTTPS - вот тут то возникли трудности.

Сертификат я получил от LetsEncrypt, сразу на все домены и поддомены. В файле /etc/httpd/conf/httpd.conf вручную прописал виртуалхосты (эта версия панели почему то все в один конфиг пишет), выглядит это вот так:

...
<VirtualHost 12.34.56.78:8080>
	ServerName example.ru
	DocumentRoot /var/www/admin/data/www/example.ru
	SuexecUserGroup admin admin 
	CustomLog /var/www/httpd-logs/example.ru.access.log combined
	ErrorLog /var/www/httpd-logs/example.ru.error.log
	ServerAdmin webmaster@example.ru
	php_admin_value open_basedir "/var/www/admin/data:."
	php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f webmaster@example.ru"
	php_admin_value upload_tmp_dir "/var/www/admin/data/mod-tmp"
	php_admin_value session.save_path "/var/www/admin/data/mod-tmp"
	AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
	AddType application/x-httpd-php-source .phps
	DirectoryIndex index.php
	AddDefaultCharset utf-8
	ServerAlias www.example.ru
	ScriptAlias /cgi-bin/ /var/www/admin/data/www/example.ru/cgi-bin/
</VirtualHost>

<VirtualHost 12.34.56.78:8080>
	ServerName m.example.ru
	DocumentRoot /var/www/admin/data/www/m.example.ru
	SuexecUserGroup admin admin 
	CustomLog /var/www/httpd-logs/m.example.ru.access.log combined
	ErrorLog /var/www/httpd-logs/m.example.ru.error.log
	ServerAdmin webmaster@example.ru
	php_admin_value open_basedir "/var/www/admin/data:."
	php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f webmaster@example.ru"
	php_admin_value upload_tmp_dir "/var/www/admin/data/mod-tmp"
	php_admin_value session.save_path "/var/www/admin/data/mod-tmp"
	AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
	AddType application/x-httpd-php-source .phps
	DirectoryIndex index.php
	AddDefaultCharset utf-8
	ScriptAlias /cgi-bin/ /var/www/admin/data/www/m.example.ru/cgi-bin/
</VirtualHost>

<VirtualHost 12.34.56.78:443>
	ServerName example.ru
	DocumentRoot /var/www/admin/data/www/example.ru
	SSLEngine on
	SSLCertificateFile /var/www/httpd-cert/ssl/certificate.crt
	SSLCertificateKeyFile /var/www/httpd-cert/ssl/private.key
	SSLCACertificateFile /var/www/httpd-cert/ssl/ca_bundle.crt
	SuexecUserGroup admin admin 
	CustomLog /var/www/httpd-logs/example.ru.access.log combined
	ErrorLog /var/www/httpd-logs/example.ru.error.log
	ServerAdmin webmaster@example.ru
	php_admin_value open_basedir "/var/www/admin/data:."
	php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f webmaster@example.ru"
	php_admin_value upload_tmp_dir "/var/www/admin/data/mod-tmp"
	php_admin_value session.save_path "/var/www/admin/data/mod-tmp"
	AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
	AddType application/x-httpd-php-source .phps
	DirectoryIndex index.php
	AddDefaultCharset utf-8
	ServerAlias www.example.ru
	ScriptAlias /cgi-bin/ /var/www/admin/data/www/example.ru/cgi-bin/
</VirtualHost>

<VirtualHost 12.34.56.78:443>
    ServerName m.example.ru
	DocumentRoot /var/www/admin/data/www/m.example.ru
	SSLEngine on
	SSLCertificateFile /var/www/httpd-cert/ssl/certificate.crt
	SSLCertificateKeyFile /var/www/httpd-cert/ssl/private.key
	SSLCACertificateFile /var/www/httpd-cert/ssl/ca_bundle.crt
	SuexecUserGroup admin admin 
	CustomLog /var/www/httpd-logs/m.example.ru.access.log combined
	ErrorLog /var/www/httpd-logs/m.example.ru.error.log
	ServerAdmin webmaster@example.ru
	php_admin_value open_basedir "/var/www/admin/data:."
	php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f webmaster@example.ru"
	php_admin_value upload_tmp_dir "/var/www/admin/data/mod-tmp"
	php_admin_value session.save_path "/var/www/admin/data/mod-tmp"
	AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
	AddType application/x-httpd-php-source .phps
	DirectoryIndex index.php
	AddDefaultCharset utf-8
	ScriptAlias /cgi-bin/ /var/www/admin/data/www/m.example.ru/cgi-bin/
</VirtualHost>

Include conf.d/*.conf
...


После перезапуска демона получаем:
по http - оба сайта открываются как положено, а по https по обоим доменам открывается сайт, расположенный на example.ru, в т.ч. для домена m.example.ru

Перестановка мест слагаемых, как известно ничего не меняет (но я все равно проверил). Знаю, что апач когда ловит запрос на неизвестный адрес берет первый по списку в настройках, но я ведь прописал для обоих доменов виртуалхосты. Собственно, куда можно капнуть еще? Ковырял конфиги, что подключатся из папки config.d, но результатов не принесло...

Спасибо заранее.
  • Вопрос задан
  • 781 просмотр
Пригласить эксперта
Ответы на вопрос 1
К сожалению вы не понимаете работы https ;)
По умолчанию апачь для экономии белых IP научился ложить все сайты на один IP и на один же порт, для этого в нем придумали костыль, он берет host из рефери и подставляет нужный конфиг
А вот при работе через https
Соединение как вы понимаете устанавливается ДО получения этого рефери.
В следствие этого нет технической возможности получить вначале host а по нему найти конфиг.
По этому ( не спршивайте меня почему так это загадка покрытая мраком)
вместо того чтобы сказать я честно не знаю где взять ключи, он ищет БЛИЖАЙШИЕ ключи которые он находит ( по алфавиту и подставляет их везде
А поскольку порт слушается то ВСЕ сайты на сервере получают 443 порт, как следствие единственные ключи на всех ;) ну и да прицепом документ рут может хватануть это ваще номер.
ps
Перестановка мест слагаемых в этом случае как-раз таки все решает ;)
1. Удалите все ключи типа дефолтные ssl.conf, убедитесь что нет никаких левых ключей.
2. Каждому сайту все свое, попробуйте запустить отдельно субдомен без первого проверьте что все ключи на нем работают.
3. на сайты вовсе без https поставьте заглушку которая будет подставлять принудительно ключи и отдает 404.
4. как опциональный третьего пункта включите ssl.conf но зазвав его 000-ssl.conf гыгы ;) теперь его ключи будут первыми попавшийся ;)
5. если уже совсем ничего не помогает то можно развести их по IP тогда у них выхода не будет, поскольку будут сллушаться разные порты на разных айпи
Например так
12.34.56.78:443
12.34.56.79:443

или если у вас nginx +apache

12.34.56.78:443
12.34.56.78:444
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы