29.02.2008

Apache2. Несколько виртуальных хостов и ssl.

Пишу подобные руководства для себя, чтобы потом не забыть и опять не гуглить пару часов. Может кому-то еще пригодится... Все проходило на Debian, я думаю в большинстве дистрибутивов настройки апача лежат в той же /etc/apache2

Задача: на одном сервере у нас поднят apache2 с поддержкой ssl. Проект работает через ssl, так что запросы на обычный http 80й порт перенаправляем на https (обычным javascript или через header). Причем на одном сервере поднята среда для тестирования проекта и среда для демонстрации. Т.е. надо обработать запросы по name1.server.com:443, name1.server.com:80, name2.server.com:443, name2.server.com:80 и для каждого из них прописать свою DocumentRoot (папку где лежат файлы).

Часа два боролся с конфигом /etc/apache2/sites-available. В итоге вот что получаем:
  • создаем в /etc/apache2/sites-available файл ssl-sites и файл nossl-sites
  • в nossl-sites пишем что-то похожее на:
    NameVirtualHost *:80
    <VirtualHost *:80>
    DocumentRoot /var/hosting/name1.server.com/nossl/
    <Directory /var/hosting/name1.server.com/nossl/>
    Options None
    AllowOverride All
    Order allow,deny
    allow from all
    </Directory>

    ErrorLog /var/hosting/name1.server.com/log/error.log
    LogLevel debug

    CustomLog /var/hosting/name1.server.com/log/access.log combined
    ServerSignature On
    </VirtualHost>
    <VirtualHost *:80>
    DocumentRoot /var/hosting/name2.server.com/nossl/
    ServerName name2.server.com
    <Directory /var/hosting/name2.server.com/nossl/>
    Options None
    AllowOverride All
    Order allow,deny
    allow from all
    </Directory>

    ErrorLog /var/hosting/name2.server.com/log/error.log
    LogLevel debug

    CustomLog /var/hosting/name2.server.com/log/access.log combined
    ServerSignature On
    </VirtualHost>

  • В файле ssl-sites пишем что-то вроде:
    NameVirtualHost *:443
    <VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /var/hosting/name1.server.com/ssl/sslkey.crt
    SSLCertificateKeyFile /var/hosting/name1.server.com/ssl/sslkey.key
    SSLCACertificateFile /var/hosting/name1.server.com/ssl/sslkey-ca.crt
    DocumentRoot /var/hosting/name1.server.com/www
    <Directory /var/hosting/name1.server.com/www/>
    Options None
    AllowOverride All
    Order allow,deny
    allow from all
    </Directory>

    ErrorLog /var/hosting/name1.server.com/log/error.log
    LogLevel warn

    CustomLog /var/hosting/name1.server.com/log/access.log combined
    ServerSignature On
    </VirtualHost>

    <VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /var/hosting/name2.server.com/ssl/sslkey.crt
    SSLCertificateKeyFile /var/hosting/name2.server.com/ssl/sslkey.key
    SSLCACertificateFile /var/hosting/name2.server.com/ssl/sslkey-ca.crt
    ServerName name2.server.com
    DocumentRoot /var/hosting/name2.server.com/www
    <Directory /var/hosting/name2.server.com/www/>
    Options None
    AllowOverride All
    Order allow,deny
    allow from all
    </Directory>

    ErrorLog /var/hosting/name2.server.com/log/error.log
    LogLevel warn

    CustomLog /var/hosting/name2.server.com/log/access.log combined
    ServerSignature On
    </VirtualHost>

  • Для name1.server.com ServerName мы не указываем, это значит, что по запросу name3.server.com будет открываться та же папка, что и у name1.server.com
  • Пишем в консоли (создаем ссылки в папку /etc/apache2/sites-enabled)
    a2ensite ssl-sites
    a2ensite nossl-sites

  • Перегружаем конфиг апача
    /etc/init.d/apache2 reload

  • В /var/hosting/name1.server.com/nossl/ и /var/hosting/name2.server.com/nossl/ создаем файлы index.php такого содержания (для редиректа на https):
    <? header("Location: https://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]"); ?>