каталог личных
объявлений

antivan. Дом проектов

Apache для самых маленьких. Настоящий сайт. Виртуальный хостинг. Шифрование

:

В предыдущей заметке цикла про Apache мы запустили Apache на своем ПК. Теперь можем разместить статичный сайт/данные на собственном хосте, который будет отдавать его в локальной сети и даже в интернет при условии подключения услуги “белый IP” у провайдера и настройки “проброса порта” на сетевом оборудовании.
В локальной сети сайт будет отдаваться по IP-адресу вашего ПК, в сети интернет сайт будет доступен по вашему белому IP-адресу.

Делаем сайт настоящим

А как отдавать сайт по имени, типа мойсайт.рф или mysite.ru?

Для посетителей извне

Нужно зарегистрироваться у регистратора доменных имен (ссылка реферальная, в случае перехода и регистрации по ней вы будете получать скидки на покупки, а я бонус. Там можно купить хостинг и избавить себя от возни с собственным), купить доменное имя, прописать в управлении зоной A-запись со значением - вашим белым IP.
После этого ваш сайт будет открываться в браузере по адресу-имени.

Для пользователей вашей локальной сети

В вашем DNS-сервере/роутере с функцией DNS создайте A-запись: ваш домен -> локальнй IP адрес. Так пользователи вашей локальной сети, вводя в браузере обычное имя вашего сайта будут попадать на него, но не через интернет, а локально. Получаем удобство, т.к. не нужно использовать 2 разных адреса/имени для доступа к одному ресурсу, и снижение нагрузки на интернет канал, т.к. обращение к содержимому сайта будет проходить без использования внешнего подключения.

Закончили

Итого. У нас есть запущенный Apache, который можно наполнять контентом. Этот Apache отвечает пользователям интернета и нашим локальным пользователям по адресу mysite.ru. На этом можно было бы остановиться. НО!

  1. Запущенный сайт не имеет шифрования, что в современном мире недопустимо

  2. Давайте сразу уж освоим функционал виртуального хостинга в Apache.

Дествуем в обратном порядке.

Виртуальный хостинг

Если купить несколько доменных имен и прописать в их “Управлении зоной” запись A со значением - нашим белым IP, то наш сайт будет отдаваться при обращению по любому из этих доменных имен. Но это значит, что при обращении по любому из этих имен будет открываться один сайт.

Apache позволяет одному серверу обрабатывать запросы к нескольким сайтам.

В конфиге Apache полностью убираем этот блок:

#DocumentRoot "${SRVROOT}/htdocs"
#<Directory "${SRVROOT}/htdocs"> # но у апача нет доступа ни к чему, этот раздел снимает ограничение с этой директории
# если открываем директорию, а в ней нет файла по-умолчанию (будет задан позднее) - покажем список файлов (может быть угрозой безопасности, а может быть удобным доступом к скачиванию файлов), следовать за символическими ссылками
#    Options Indexes FollowSymLinks
# все также не разрешаем переопределять параметры через .htaccess
#    AllowOverride None
# читать разрешаем все
#    Require all granted
# но только двумя методами, т.к никакого взаимодействия с пользователем в данный момент у нас нет
#    <LimitExcept GET HEAD>
#        Require all denied
#    </LimitExcept>
#</Directory>

Добавляем:

# этим блоком мы просим Apache на все запросы отдавать содержимое ${SRVROOT}/htdocs
<VirtualHost _default_:80>
    DocumentRoot "${SRVROOT}/htdocs"
    <Directory "${SRVROOT}/htdocs">
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
        <LimitExcept GET HEAD>
            Require all denied
        </LimitExcept>
    </Directory>
</VirtualHost>

# а этот блок указывает Apache обрабатывать запросы, адресованные конкретным сайтам, отдавать их содержимое из соответствующих каталогов
# mysite1.ru
<VirtualHost *:80>
    DocumentRoot "${SRVROOT}/htdocs-virtual/mysite1.ru/"
    ServerName mysite1.ru
    <Directory "${SRVROOT}/htdocs-virtual/mysite1.ru/">
      Require all granted
      AllowOverride All
    </Directory>
</VirtualHost>

# mysite2.ru
<VirtualHost *:80>
    DocumentRoot "${SRVROOT}/htdocs-virtual/mysite2.ru/"
    ServerName mysite2.ru
    <Directory "${SRVROOT}/htdocs-virtual/mysite2.ru/">
      Require all granted
      AllowOverride All
    </Directory>
</VirtualHost>

Теперь при размещении разной информации в каталогах ${SRVROOT}/htdocs-virtual/mysite1.ru/ и ${SRVROOT}/htdocs-virtual/mysite2.ru/ обращение к сайтам mysite1.ru и mysite2.ru будет давать разный результат. Подобных сайтов для себя можно сделать очень много, сколько есть ресурсов у вашего ПК.

Шифрование

Получим сертификат

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

В Windows это делается с помощью утилиты win-acme, скачиваем последнюю версию тут. У меня в примере утилита распакована в E:\win-acme, внутри еще создана папочка E:\win-acme\certs, для хранения сертификатов наших сайтов.

С правами администратора выполняем команду:

wacs.exe --target manual --host mysite1.ru \
  --validation filesystem --webroot "E:\Apache24\htdocs-virtual\mysite1.ru" \
  --store pemfiles --pemfilespath "E:\win-acme\certs" \
  --installation none --script "E:\Apache24\bin\httpd.exe -k restart" \
  --accepttos --emailaddress "" --setuptaskscheduler --closeonfinish

Эта команда запрашивает сертификат, размещает подтверждающие владение доменом/хостинком файлы внутри сайта, удаляет их по завершении, выполняет все другие сопустствующие действия, в т.ч. создает задачу в планировщике, которая будет регулярно перевыпускать и этот сертификат, и все прочие, выпущенные на этом сервере.

В E:\win-acme\certs появятся несколько файлов:

mysite1.ru-chain.pem
mysite1.ru-chain-only.pem
mysite1.ru-crt.pem
mysite1.ru-key.pem

Перенастроим Apache

Слушаем еще и 443 порт, добавляем в конфиг:

# Apache будет слушать и этот порт тоже
Listen 443

Подключаем модули:

# для шифрования
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

Включаем кэш сессий

# --- Кэш для SSL-сессий ---
SSLSessionCache        shmcb:${SRVROOT}/logs/ssl_scache(512000)
SSLSessionCacheTimeout 43200

Эти строки заставляют Apache помнить ssl сессию и не устанавливать соединение повторно, т.к. оно затратно по ресурсам. По умолчанию сессия хранится 300 секунд, в моей специфике - 12 часов (43200 секунд).

Последний штрих. Добавляем:

<VirtualHost *:443>
    DocumentRoot "${SRVROOT}/htdocs-virtual/mysite1.ru/"
    ServerName mysite1.ru
    <Directory "${SRVROOT}/htdocs-virtual/mysite1.ru/">
      Require all granted
      AllowOverride All
    </Directory>

    SSLEngine on
    SSLCertificateFile "E:/win-acme/certs/mysite1.ru-crt.pem"
    SSLCertificateKeyFile "E:/win-acme/certs/mysite1.ru-key.pem"
</VirtualHost>

Этот блок - полная копия блока для 80го порта, но с доработками.

Отказ от сайта без шифрования

Если у нас есть сайт, который открывается и по незащищенному каналу, и по защищенному, возникает вопрос, а зачем нам, вообще-то, незащищенный канал?

Подключаем модуль переадрессации:

LoadModule rewrite_module modules/mod_rewrite.so

Заменяем блок обработки запроса на порт 80:

<VirtualHost *:80>
    ServerName mysite1.ru
    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]
</VirtualHost>

Теперь попытка открытия любой страницы сайта по незащищенному протоколу будет переадрессовываться на такую же страницу, только по защищенному протоколу.

Вот теперь всё! Вы готовы стать хостинг-провайдером статических сайтов :-)

Другие статьи о конфигурировании Web-сервера Apache можно найти по тегу apache.

Если я сэкономил вам много времени и нервов, можете сказать спасибо.
Оно мне очень пригодится.