Как установить и настроить веб-сервер Apache
Как установить HTTP-сервер Apache на операционную систему Ubuntu: настроить виртуальные хосты, доступ к серверу по протоколу HTTPS и задать настройки безопасности.
Введение
Apache — кроссплатформенный HTTP-сервер, который был создан с учетом ошибок старого web-сервера NCSA HTTPd. На данный момент стабильная версия имеет номер 2.4.48. Основные достоинства Apache: кроссплатформенность и модульная система, позволяющая оптимизировать программное обеспечения для нужд конкретной разработки.
В этой статье рассмотрим установку HTTP-сервера Apache на операционную систему (ОС) Ubuntu. В рамках этой публикации используется релиз Ubuntu 20.04 server. И web-сервер Apache версии 2. Развернута система в «Облачной платформе» Selectel. Для тестового сервера используется минимальная конфигурация мощностей: 1 процессор, 1 ГБ оперативной памяти. Для запуска простого ненагруженного web-приложения этого достаточно.
Настроить виртуальный сервер
Для этой инструкции используется виртуальная среда Selectel. Панель управления расположена по адресу: https://my.selectel.ru/.
В разделе «Облачная платформа» во вкладке «Серверы» создадим новый сервер.
Используем минимальную конфигурацию:
В настройках надо выбрать образ операционной системы для установки.
Оставим себе root-пароль и создадим сервер. После этого в панели управления появится ip-адрес сервера.
Теперь можем подключиться к нему по SSH.
Самым простым способом подключения является использование утилиты PuTTY. Эта утилита является кроссплатформенной. Скачать ее можно с официального сайта https://putty.org.ru/.
Для подключения в поле Host Name (or IP address) вводим полученный ранее ip-адрес, остальные опции оставляем без изменений.
После нажатия кнопки Open эмулятор терминала произведет подключение к серверу. Потребуется ввести комбинацию логин/пароль. На первоначальном этапе используем логин root и пароль, полученные на этапе создания сервера.
login as: vlan48 vlan48@xx.xx.xx.18's password: Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-77-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage 31 updates login as: vlan48 vlan48@xx.xx.xx.18's password: Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-77-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage 31 updates can be applied immediately. To see these additional updates run: apt list --upgradable *** System restart required *** Last login: Tue Aug 3 09:51:36 2021 from xx.xx.xx.230 vlan48@apachi:~$
Установить Apache
При установке и конфигурации будет использован пользователь, отличный от root, но с правами администратора. Для большинства операций применяется повышение привилегий через sudo. Первоначально необходимо загрузить информацию об актуальных списках пакетов и зависимостях.
sudo apt update
После этой операции произведем установку пакета Apache2, он располагается в стандартном репозитории, дополнительные добавлять не нужно.
sudo apt install apache2
По окончании демон запускается автоматически, а также попадает в автозагрузку.
Настроить брандмауэр для Apache
По умолчанию в Ubuntu используется ufw. Uncomplicated Firewall — утилита для настройки межсетевого экрана. Если настройка происходит на виртуальном сервере, желательно проверить наличие установленной утилиты.
sudo ufw status verbose
В случае отсутствия ее в списке установленных пакетов появится ошибка:
sudo: ufw: command not found
Тогда ее необходимо установить:
sudo apt install ufw
Заново запросим ее статус:
Status: inactive
Это означает, что она деактивирована. Активируем:
sudo ufw enable
Разрешаем HTTP на сервере:
sudo ufw allow http
Очень важно в этом моменте разрешить SSH-доступ. На тестовом сервере SSH на стандартном порту.
sudo ufw allow 22/tcp
Обязательно перезапустить процесс:
sudo ufw reload
Проверить базовую настройку Apache
На данный момент сервер доступен из интернета по HTTP. Можно проверить это в браузере по ip-адресу в поисковой строке. Ip-адрес мы уже получили в панели управления сервером.
Появившееся приветствие означает успешную начальную настройку Apache-сервера.
Как запустить Apache и другие полезные команды
В этом разделе будут собраны базовые команды для управления Apache web-сервером. Несмотря на то, что демон запускается самостоятельно, иногда необходимо выключить его или перечитать конфигурацию.
Проверить статуса демона Apache:
sudo systemctl status apache2
В выводе будет указан текущий статус. Возможны два варианта.
apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2021-07-15 09:49:55 UTC; 2 weeks 5 days ago Docs: https://httpd.apache.org/docs/2.4/ Process: 535575 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS) Main PID: 718 (apache2) Tasks: 55 (limit: 1105) Memory: 12.9M CGroup: /system.slice/apache2.service ├─ 718 /usr/sbin/apache2 -k start ├─535580 /usr/sbin/apache2 -k start └─535581 /usr/sbin/apache2 -k start
apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Active: inactive (dead) since Tue 2021-08-03 10:01:39 UTC; 2s ago Docs: https://httpd.apache.org/docs/2.4/ Process: 535575 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS) Process: 544224 ExecStop=/usr/sbin/apachectl stop (code=exited, status=0/SUCCESS) Main PID: 718 (code=exited, status=0/SUCCESS)
Иногда возникает ошибка.
apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Tue 2021-08-03 10:07:39 UTC; 5s ago Docs: https://httpd.apache.org/docs/2.4/ Process: 544394 ExecStart=/usr/sbin/apachectl start (code=exited, status=1/FAILURE) Aug 03 10:07:39 apachi systemd[1]: Starting The Apache HTTP Server. Aug 03 10:07:39 apachi apachectl[544401]: AH00526: Syntax error on line 134 of /etc/apache2/apache2.conf:
Чтобы выйти в консоль из статуса, необходимо использовать комбинацию клавиш Ctrl+С.
sudo systemctl stop apache2
sudo systemctl start apache2
sudo systemctl restart apache2
При изменении конфигурации Apache возможно ее перечитать без разрыва текущей сессии с хостов:
sudo systemctl reload apache2
Чтобы деактивировать запуск web-сервера при загрузке:
sudo systemctl disable apache2
Активировать в загрузку:
sudo systemctl enable apache2
Настроить виртуальные хосты Apache
Можно использовать веб-сервер Apache для поддержки одного web-приложения. Но достаточно часто приходится на одном сервере создавать и обслуживать несколько web-ресурсов.
В Apache для этих целей используется модуль виртуальных хостов. Он позволяет развернуть несколько web-приложений на одном сервере с использованием одного ip-адреса, но разных доменных имен. Про теорию доменных имен есть хорошие статьи и книги, например, Крикет Ли, Пол Альбитц “DNS и BIND”. Об управлении доменами и ресурсными записями написали в базе знаний Selectel.
Перейдем к настройке виртуального хоста.
В Ubuntu конфигурации виртуальных хостов расположены в директории /etc/apache2/sites-available. Нам необходимо получить директорию для виртуального хоста по умолчанию. Получим root-директорию из файла дефолтной конфигурации:
grep "DocumentRoot" /etc/apache2/sites-available/000-default.conf
DocumentRoot /var/www/html
Создадим новые необходимые директории, не меняя корневой.
sudo mkdir -p /var/www/sample.net/html
В стандартном исполнении Apache ищет документ index.htm или index.html
Создадим простой html5-документ:
sudo touch /var/www/sample.net/html/index.html
Добавим небольшую структуру документа, открыв его в текстовом редакторе:
sudo nano /var/www/sample.net/html/index.html
Вставляем в файл.
Hello Hello Selectel!
Чтобы оставить дефолтную конфигурацию виртуального хоста неизменной, копируем его в созданную ранее директорию настроек нового виртуального хоста.
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/sample.net.conf
Теперь откроем скопированный файл, рассмотрим основные директивы и внесем необходимые правки. На данном этапе нам будет интересна только строка, в которой указан путь к директории виртуального хоста. Меняем его на путь к директории, созданной специально для него. Чтобы при обращении Аpache мог перенаправить запрос именно к созданному нами виртуальному хосту.
sudo nano /etc/apache2/sites-available/sample.net.conf
Файл дефолтного виртуального хоста:
# The ServerName directive sets the request scheme, hostname and port that # the server uses to identify itself. This is used when creating # redirection URLs. In the context of virtual hosts, the ServerName # specifies what hostname must appear in the request's Host: header to # match this virtual host. For the default virtual host (this file) this # value is not decisive as it is used as a last resort host regardless. # However, you must set it for any further virtual host explicitly. #ServerName www.example.com ServerAdmin webmaster@localhost DocumentRoot /var/www/html # Available loglevels: trace8, . trace1, debug, info, notice, warn, # error, crit, alert, emerg. # It is also possible to configure the loglevel for particular # modules, e.g. #LogLevel info ssl:warn ErrorLog $/error.log CustomLog $/access.log combined # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
— в этой строке указываем ip-адрес сервера, а также порт, используемый для этого виртуального хоста. На данный момент мы используем HTTP и один ip-адрес. В связи с этим номер порта 80, адрес не указываем. Настройка HTTPS будет описана ниже.
ServerAdmin webmaster@localhost — строка связи с администратором, необходимо указать активный почтовый адрес отвечающего за обслуживание сервера специалиста. Опционально. Добавим адрес, по которому всегда придут на помощь support@selectel.ru.
DocumentRoot /var/www/html — root-директория или корневой каталог виртуального хоста. Обязательна к применению и настройке. В нашем случае это путь к созданной ранее директории с документом index.html. Вносим изменения:
/var/www/sample.net/html
ErrorLog $/error.log — путь к файлу с логами сервера. Вносить какие-либо изменения нет необходимости. Здесь будут храниться ошибки запуска демона и ошибки, не относящиеся к клиентам.
CustomLog $/access.log combined — это директива для хранения логов клиентского доступа.
Редактирование файла на этом завершается. Это минимальная конфигурация для запуска виртуального хоста на Apache web-сервере. Изменять конфигурацию далее на данном этапе нет необходимости.
Сохраняем и выходим из редактора. Для сохранения используется комбинация Ctrl+o, для выхода Ctrl+x.
Файл с готовой конфигурацией:
# The ServerName directive sets the request scheme, hostname and port that # the server uses to identify itself. This is used when creating # redirection URLs. In the context of virtual hosts, the ServerName # specifies what hostname must appear in the request's Host: header to # match this virtual host. For the default virtual host (this file) this # value is not decisive as it is used as a last resort host regardless. # However, you must set it for any further virtual host explicitly. #ServerName www.example.com ServerAdmin support@selectel.ru DocumentRoot /var/www/sample.net/html # Available loglevels: trace8, . trace1, debug, info, notice, warn, # error, crit, alert, emerg. # It is also possible to configure the loglevel for particular # modules, e.g. #LogLevel info ssl:warn ErrorLog $/error.log CustomLog $/access.log combined # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Для подключения виртуальных хостов, а также модулей в Apache HTTP-сервере используется набор команд:
a2enmod — подключение модуля;
a2dismod — отключение модуля;
a2ensite — подключает виртуальный хост;
a2dissite — отключает виртуальный хост.
Нам потребуется a2ensite для активации созданного хоста:
sudo a2ensite sample.net.conf
И a2dissite для деактивации дефолтного:
sudo a2dissite 000-default.conf
После внесенных изменений требуется перечитать конфигурацию сервера:
sudo systemctl reload apache2
Теперь мы можем обратиться с созданному виртуальному хосту по доменному имени.
В этой инструкции мы не используем dns, поэтому для разрешения имени используем файл hosts.
В windows этот файл расположен здесь: C:\Windows\System32\drivers\etc\hosts.
А в linux/mac: /etc/hosts.
Добавим строчку: 94.0.0.0 sample.net.
Где 94.0.0.0 — ранее полученный ip-адрес сервера, а sample.net — доменное имя виртуального хоста.
Теперь перейдем в браузер и в адресной строке наберем :sample.net.
Получим созданное web-приложение:
SSL для Apache
TLS (transport layer security — протокол защиты транспортного уровня) и предыдущая версия защиты SSL (secure sockets layer — слой защищенных сокетов). Это все протоколы криптографии, созданные для защиты передачи данных между узлами в информационной сети.
Оба протокола используют асимметричное шифрование для аутентификации, симметричное шифрование для конфиденциальности и коды аутентичности сообщений. Подробно останавливаться на теории сейчас нет необходимости. На первоначальном этапе достаточно быть в курсе, что эти протоколы отвечают за сохранность конфиденциальности данных в момент обмена данными между клиентом и сервером. Ключи могут быть самозаверяющими, т.е. созданными и подписанными самим web-сервером.
Такие ключи подходят для использования протокола HTTPS и шифрования данных, но не являются доверенными для сети интернет. Также сертификаты бывают выданными центрами сертификации. Они не только шифруют данные, но также web-браузер знает о таком ключе и доверяет ему по-умолчанию. В таком случае сертификаты платные, но имеется возможность использования бесплатного сервиса Let`s encrypt. С использованием сервиса можно создать и заверить ключ.
В этом случае сертификат будет действительным для сети интернет, но бесплатным. В этой инструкции будет настроено простое шифрование с использованием самозаверяющего ключа, созданного на сервере Apache.
Создать SSL-сертификат на сервере
Чтобы создать и подписать сертификат, потребуется пакет OpenSSL. Он есть в системе, не нужно устанавливать. Сейчас будет создан и подписан сертификат, а также закрытый и открытый ключи будут перемещены в необходимые директории.
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/server-sample.key -out /etc/ssl/certs/server-sample.crt
Расшифровка опций из команды:
req -x509 — опция определения стандарта сертификата (-x509 стандарт инфраструктуры открытого ключа).
-nodes — отказаться от защиты сертификата паролем. Если убрать эту опцию, произойдет запрос пароля для ключа, который необходимо вводить при каждом запуске web-сервера (желательно использовать в продакшене).
-days 365 — срок действия сертификата. Обычно срок устанавливается более длительный, но для тестового сервера достаточно. Также необходимо учитывать, что на web-сервере время и дата должны быть верными.
-newkey rsa:2048 — опция указывает на создание нового сертификата и ключа единовременно. Часть rsa:2048 обозначает размер ключа.
-keyout /etc/ssl/private/server-sample.key — обозначает директорию, в которую необходимо поместить закрытый ключ.
-out /etc/ssl/certs/server-sample.crt- — директория местоположения сертификата.
server-sample.key и server-sample.crt — имена ключа и сертификата.
После ввода команды потребуется ответить на некоторые вопросы, разберем список директив:
Country Name (2 letter code) [AU]:RU — указываем страну
State or Province Name (full name) [Some-State]:LIP — область
Locality Name (eg, city) []:Lipetsk — город
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Sel — организацию
Organizational Unit Name (eg, section) []:Sel — отдел
Common Name (e.g. server FQDN or YOUR name) []:94.255.255.255 — вводим доменное имя или белый адрес сервера
После выполнения операции требуется подключение модуля SSL для Apache HTTP-сервера. Ранее были разобраны команды для этого действия. Вот так выглядит необходимая:
sudo a2enmod ssl
После включения модуля необходимо перезапустить демона Apache.
Переходим к настройке HTTPS для виртуального хоста. Вносим изменения в файл его настройки.
sudo nano /etc/apache2/sites-available/sample.net.conf
Во-первых, меняем директиву .
Порт изменится на 443 (порт для протокола HTTPS по умолчанию).
Добавляем директиву SSLEngine on после строки DocumentRoot для включения поддержки SSL на web-сервере.
После этого еще две строки, в которых указан путь к ключу и сертификату:
SSLCertificateFile /etc/ssl/certs/server-sample.crt SSLCertificateKeyFile /etc/ssl/private/server-sample.key
Теперь файл конфигурации виртуального хоста выглядит следующим образом:
# The ServerName directive sets the request scheme, hostname and port that # the server uses to identify itself. This is used when creating # redirection URLs. In the context of virtual hosts, the ServerName # specifies what hostname must appear in the request's Host: header to # match this virtual host. For the default virtual host (this file) this # value is not decisive as it is used as a last resort host regardless. # However, you must set it for any further virtual host explicitly. #ServerName www.sample.net ServerAdmin support@selectel.ru DocumentRoot /var/www/sample.net/html SSLEngine on SSLCertificateFile /etc/ssl/certs/server-sample.crt SSLCertificateKeyFile /etc/ssl/private/server-sample.key # Available loglevels: trace8, . trace1, debug, info, notice, warn, # error, crit, alert, emerg. # It is also possible to configure the loglevel for particular # modules, e.g. #LogLevel info ssl:warn ErrorLog $/error.log CustomLog $/access.log combined # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Перед проверкой по web добавим разрешающее правило безопасности:
sudo ufw allow https
А также перечитаем конфигурацию web-сервера Apache:
sudo systemctl reload apache2
Теперь при запросе сервера по HTTPS:sample.net браузер выдаст оповещение о небезопасном сертификате. Проигнорировав его, будет отображено созданное ранее web-приложение.
На этом настройка SSL закончена.
Конфигурационные файлы и директории web-сервера Apache
Приведенные файлы и директории используются для настройки Apache-сервера. В данном документе уникальных настроек не приводится. Этот раздел создан для ознакомительных целей.
/etc/apache2 — директория конфигурационных файлов Apache.
/etc/apache2/apache2.conf — основной файл конфигурации сервера. Он отвечает за множество настроек сервера. Например, включить чтение файла .htaccess необходимо именно здесь.
/etc/apache2/envvars — файл значения переменных среды для Apache.
/etc/apache2/magic — отображает инструкции для определения типа файла на сервере и клиенте.
/etc/apache2/ports.conf — настройка слушающих портов по умолчанию.
/etc/apache2/sites-available/ — директория конфигураций виртуальных хостов.
/etc/apache2/sites-enabled/ — здесь хранится информация об активных виртуальных хостах.
/etc/apache2/conf-available/ — директория настроек хостов, не относящихся к виртуальным.
/etc/apache2/conf-enabled/ — ссылки на включенные хосты, не относящиеся к виртуальным.
/etc/apache2/mods-available/ и /etc/apache2/mods-enabled/ — директории модулей. Модули, а также их настройки расположены здесь.
/var/www — директория для хранения web-приложений. Обычно виртуальные хосты тоже хранят здесь. Может быть изменена.
/var/log/apache2 — директория файлов логирования, содержит в себе два файла, ранее в этой инструкции было описано какой из них за что отвечает.
Безопасность web-сервера Apache
Сервер, который смотрит в интернет, вне зависимости от задач на него возложенных, находится в опасности. Он может быть атакован злоумышленниками с последующим вмешательством в его функциональность. Рассмотрим защиту от доступа неблагонадежных пользователей к серверу по протоколу SSH.
В Linux-системах отличным решением является утилита Fail2ban. Принцип ее работы основан на отслеживании файлов логирования доступа к серверу. По заданному количеству попыток обращений создается правило блокировки ip-адреса, с которого предположительно происходит вторжение.
Установка и настройка Fail2ban
sudo apt-get install fail2ban -y
Утилита из коробки включает защиту от перебора паролей. Но в нашем случае перед включением будут внесены несколько изменений.
/etc/fail2ban/jail.conf — отвечает за настройки безопасности конкретных сервисов.
Вносить изменения в него не рекомендуется, поэтому создадим новый файл с расширением .local. Эти файлы имеют приоритет выше, чем файл .conf для Fail2ban.
sudo nano /etc/fail2ban/jail.local
Внесем настройки для защиты SSH:
[sshd] enabled = true port = 22 filter = sshd logpath = /var/log/auth.log maxretry = 4 bantime = 60
Директива [sshd] отвечает за защиту доступа по SSH при отказе в авторизации;
enabled = true — состояние;
port = 22 — номер порта;
filter = sshd — имя, по которому идет поиск в логах сервиса;
logpath = /var/log/auth.log — файл журнала, из которого будут взяты результаты поиска по фильтру;
maxretry = 4 — количество неудачных попыток;
bantime = 60 — время блокировки в секундах. Сейчас эта секция добавлена для тестовой инструкции, в продакшене обычно время блокировки больше.
С настройкой закончили, добавим демона fail2ban в загрузку и запустим, а потом проверим его работу.
sudo systemctl enable fail2ban sudo systemctl start fail2ban
Как мы видим, доступ заблокирован после превышения попыток авторизации.
Через 60 секунд доступ появится.
Для того, чтобы разблокировать доступ, принудительно используется команда:
sudo fail2ban-client set sshd unbanip ip_add
ip_add — заблокированный адрес.
Заключение
На этом инструкция по настройке web-сервера Apache завершена. Подведем итог: мы настроили один из самых популярных web-серверов и доступ к нему по протоколу HTTPS , изучили возможность настройки виртуальных хостов и обезопасили сервер от злоумышленников. На данном этапе администратор может самостоятельно обслуживать и настраивать Apache web-сервер на linux.
Зарегистрируйтесь в панели управления
И уже через пару минут сможете арендовать сервер, развернуть базы данных или обеспечить быструю доставку контента.
Читайте также:
Инструкция
Как автоматизировать подготовку к собеседованиям с помощью Telegram-бота
29 сентября 2023
Инструкция
Как реализовать очередь в Redis
14 сентября 2023
Инструкция
Как генерировать истории с помощью ChatGPT и Telegram
# Создание виртуальных хостов на Apache
Apache — один из наиболее популярных веб-серверов наряду с Nginx. Apache позволяет поддерживать одновременную работу нескольких сайтов на одном сервере. В зависимости от запрошенного домена он перенаправляет запрос на виртуальный хост, содержащий данные нужного сайта.
В этой инструкции мы расскажем, как при помощи Apache создать два виртуальных хоста для сайтов с разными доменными именами.
# Установка Apache (опционально)
Если на сервере ещё не установлен Apache, сделаем это с помощью стандартного менеджера apt. Обновим список пакетов apt:
sudo apt update sudo apt upgrade
После обновления можно устанавливать сам Apache:
sudo apt install apache2
После установки добавим Apache в список разрешённых приложений фаервола:
sudo ufw allow “Apache FULL”
Далее запустим его:
sudo systemctl enable apache2 sudo systemctl start apache2
Проверим, что Apache запущен:
sudo systemctl status apache2
# Output apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2022-02-23 08:40:45 UTC; 1h 21min ago Docs: https://httpd.apache.org/docs/2.4/ Process: 1088 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS) Main PID: 1092 (apache2) Tasks: 6 (limit: 19660) Memory: 36.6M
Если ваш VPS расположен на Джино, то для установки Apache можно воспользоваться пакетами приложений. В разделе Управление — Пакеты приложений выберите Apache httpd . Программа установит последнюю из доступных версий Apache.
Веб-сервер установлен и запущен! Можно переходить к созданию и настройке виртуальных хостов.
# Настройка виртуальных хостов
# Создание директорий
Сначала создадим директории, в которых будут храниться все данные наших сайтов. По умолчанию Apache использует один виртуальный хост, расположенный в /var/www . Чтобы разместить несколько виртуальных хостов и сделать управление ими более гибким и функциональным, создадим новые директории внутри /var/www :
sudo mkdir -P /var/www/example_1.com/public_html sudo mkdir -P /var/www/example_2.com/public_html
Флаг -P в данном случае означает, что будет создана не только конечная директория, но и весь путь к ней, если таких папок ещё не существует.
Теперь передадим права на изменения файлов внутри этих директорий нашему пользователю:
sudo chown -R $USER:$USER /var/www/example_1.com/public_html sudo chown -R $USER:$USER /var/www/example_2.com/public_html
Чтобы страницы могли отображаться правильно, нужно изменить права на всю директорию www :
sudo chmod -R 755 /var/www
# Индексные страницы
Создадим начальные страницы для каждого из виртуальных хостов. Для нашей инструкции это будут простые html-страницы, выводящие приветственную надпись:
vim /var/www/example_1.com/public_html/index.html
В открывшемся окне поместим код:
html> head> title>Example_1title> head> body> h1>Success! 1st virtual host is working!h1> body> html>
Сделаем то же самое для второго хоста:
vim /var/www/example_2.com/public_html/index.html
html> head> title>Example_2title> head> body> h1>Success! 2nd virtual host is working!h1> body> html>
Итак, у нас созданы директории для размещения данных сайтов и индексные страницы. Теперь можно переходить к созданию конфигурационных файлов для виртуальных хостов.
# Виртуальный хост
В файлах виртуального хоста Apache указана фактическая конфигурация хостов и правила ответа Apache на запросы к указанным доменам.
По умолчанию такой файл в Apache — 000-default.conf . Вместо него мы создадим два новых файла с правилами для наших сайтов и укажем их в качестве конфигурационных файлов.
Скопируем содержимое файла 000-default.conf в файл с настройками нашего первого виртуального хоста:
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/example_1.com.conf
Теперь откроем и исправим его:
sudo vim /etc/apache2/sites-available/example_1.com
Если исключить закомментированные пояснения, то содержимое файла будет выглядеть так:
VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog $APACHE_LOG_DIR>/error.log CustomLog $APACHE_LOG_DIR>/access.log combined /VirtualHost>
Здесь нам нужно исправить значения в строках ServerAdmin и DocumentRoot , а также добавить две новые: ServerName и ServerAlias .
Укажем наши значения для первого виртуального хоста. В итоге файл примет вид:
VirtualHost *:80> ServerAdmin admin@example_1.com ServerName example_1.com ServerAlias www.example_1.com DocumentRoot /var/www/example_1.com/public_html ErrorLog $APACHE_LOG_DIR>/error.log CustomLog $APACHE_LOG_DIR>/access.log combined /VirtualHost>
Скопируем содержимое файла первого виртуального хоста в файл с конфигурацией для второго:
sudo cp /etc/apache2/sites-available/example_1.com.conf /etc/apache2/sites-available/example_2.com.conf
Откроем и исправим его по образцу первого:
sudo vim /etc/apache2/sites-available/example_2.com.conf
VirtualHost *:80> ServerAdmin admin@example_2.com ServerName example_2.com ServerAlias www.example_2.com DocumentRoot /var/www/example_2.com/public_html ErrorLog $APACHE_LOG_DIR>/error.log CustomLog $APACHE_LOG_DIR>/access.log combined /VirtualHost>
# Активация файлов виртуального хоста
Чтобы Apache использовал в качестве конфигурационных файлов виртуальных хостов наши новые файлы, их нужно активировать:
sudo a2ensite example_1.com.conf sudo a2ensite example_2.com.conf
Также необходимо отключить файл, использующийся по умолчанию:
sudo a2dissite 000-default.conf
Изменения вступят в силу только после перезапуска веб-сервера:
sudo systemctl restart apache2
После перезагрузки можно проверить работу наших виртуальных хостов. Для этого откроем браузер и в адресной строке укажем example_1.com или example_2.com . Если в ходе работы не возникло никаких ошибок, мы должны увидеть собщения:
Теперь у нас есть веб-сервер, поддерживающий одновременную работу двух сайтов на разных доменах. Следуя этой инструкции, можно создать любое число виртуальных хостов — основным ограничением в данном случае будут не возможности Apache, а серверные мощности, поддерживающие работу сайтов.
© Джино, 2003–2022. «Джино» является зарегистрированным товарным знаком.
Лицензия на телематические услуги связи №150549 от 09.03.2017.
Как создать сайт на apache
Продолжаем тему сайтостроя. Чем дальше, тем сложнее 🙂 Полное содержание серии — в конце статьи.
Напоминаю, Apache – это веб-сервер. Он слушает определенные порты, и получив корректный запрос посылает контент просящему. Это очень общее описание работы мощной программы. За всеми подробностями – в инет. Могу добавить по минимуму следующее: http-протокол работает по 80-ому порту, так принято по умолчанию. Вот его веб-сервер и слушает. Могут использоваться другие порты для передачи http-трафика, их обычно настраивают для работы с прокси-серверами.
Прежде чем грузить вас техническими дебрями веб-сервера, стоит упомянуть о таких переходных решениях, как Денвер и XAMPP. К сказанному в Википедии добавить почти нечего. Скачали, поставили — пользуемся. Ничего сложного. Готовые пакеты — это неплохо, но я считаю эти решения переходными, потому как нормальный веб-мастер должен уметь сам разворачивать окружение и управлять им. Это мое мнение.
Обратно к теме. Apache изначально написан под Linux и на Windows мы имеем портированное приложение. Поэтому все его настройки описаны в текстовых conf-файлах, а не в реестре. И тут мы как бы плавно переходим к вопросу, какой дистрибутив Apache качать. По логике, нужна та же версия, что и вашего хостера, чтобы не было потом вопросов, почему не так работает сервер. Но «порты» делаются с задержкой после выхода новой версии, поэтому найдите на странице знакомое слово «Windows» и скачайте что-нибудь 🙂
Предположим, скачать и установить Apache вам удалось. У сервера множество настроек, которые описаны в нескольких конфигурационных файлах. Обычно всеми настройками за пределами сайта ведает хостер, а внутри сайта – админ сайта.
Настройки сервера
Если вы поднимаете свой веб-сервер (заботы хостера), вам следует изучить тему, как настроить Apache для этой работы. В статье возьмем простой вариант разработки сайта на локальной машине (localhost), т.е. веб-сервер и сайт у вас на одном компе, работать с сайтом вы будете тоже на нем. Тогда настройка для сайта в Apache будет выглядеть так:
Конфиг [..\Apache2.2\conf\extra\httpd-vhosts.conf]ServerName localhost DocumentRoot d:/web/site # Выдавать содержимое каталога, если нет главной страницы Options Indexes # Разрешено переписывать все настройки родительских каталогов AllowOverride all # Разрешить всем доступ к каталогу Allow from all
В строках начинающихся с # записаны комментарии (согласно синтаксиса конфигов Linux). Обратите внимание на регистр букв и куда слешы в путях направлены. Это тоже правила Линухи. Внимательно изучите этот пример. Он простой, но много объясняет по части работы веб-сервера.
После внесения изменений нужно перезапустить сервер. Под Видной это делается либо через консоль управления Службами либо через маленькую программулину ApacheMonitor, которая идет в пакете с сервером. Если сервак не запустится, значит скорее всего ошибка в конфиге, посмотрите логи в [..\Apache2.2\logs\] .
Если все правильно, то через браузер обращаемся на http://localhost и получаем главную страницу сайта из каталога [d:\web\site] или содержимое этого каталога, если страницы нет.
Если вы хотите указать отличное от localhost имя сайта, например «site.ru», тогда в Виндовском hosts пропишите соответствие «127.0.0.1 site.ru«. Таким образом все обращения браузера к «site.ru» пойдут на «местный» адрес (127.0.0.1 – это служебный адрес сетевой карты на любом компе). Поднятый на компе веб-сервер получит запрос и ответит браузеру. Если вы здесь ничего не поняли, то либо в инет за ликбезом либо просто сделайте так, как указано во вставке, и ходите на localhost.
Видите разницу: DNS-имя сайта — «localhost», хотя каталог сайта «site»? Разберитесь самостоятельно, что к чему, или почитайте в статье «О доменах и сайтах. Виртуальный хостинг». Это все, что я могу сказать вам о настройке веб-сервера за пределами сайта. Более подробно о настройках ядра Apache читайте здесь и на просторах интернета.
Настройки сайта
Настройки каталогов сайта описываются в .htaccess. Родительский .htaccess распространяется на вложенные каталоги. Т.о. чтобы отменить какую-то настройку родителя, нужно создать свой .htaccess в каталоге и описать в нем новое значение. Главным файлом настроек считается .htaccess в корне сайта. При обращении к какому-либо каталогу, Apache ищет в нем файл настроек или читает родительский. Внесенные изменения применяются сразу, сервер/браузер перезапускать не надо.
Некоторые настройки сайта:
DirectoryIndex index.php index.htm index.shtml handler.php?page=main
Перечисление страниц, которые могут быть индексными (главными) в каталоге. Apache будет искать подходящий по списку файл, слева направо. Последнее имя дописал, чтобы показать, насколько свободно можно описать эту директиву.
AddHandler application/x-httpd-php .htm .html
Так вы указываете веб-серверу, что html-файлы нужно прогонять через PHP-препроцессор. Сейчас это вам мало что говорит, просто запомните настройку, возможно она пригодится. Учтите, что такая директива в главном .htaccess замедлит ответ сервера, т.к. все html-файлы сайта будут проходить через PHP.
AddType text/html .shtm .shtml AddHandler server-parsed .shtm .shtml
Первая директива связывает расширение файла с MIME-типом, вторая назначает обработчик для таких файлов. Помните, раньше была описана сборка страницы чере SSI? Вот эти директивы указывают веб-серверу, что с таким файлами делать.
Options +/-Indexes
Можно/нельзя выдать содержимое каталога, если нет главной страницы. Пишется либо «+» либо «-«. Эту опцию можно задать в настойках ядра Apache. И если разрешена ее перезапись (директива AllowOverride, см. выше), то значение опции можно так же задавать в настройках сайта. Чтобы не гадать, что задано в настройках ядра, лучше явно ее описывать в настройках сайта.
Options Includes
C этой опцией вы уже знакомы, разрешаем включения на стороне сервера (SSI) посредством mod_include. Допускается запись опций в одной строке, типа: «Options -Indexes Includes«
ErrorDocument NN URL Примеры: ErrorDocument 401 /errors/handler.php?er=401 ErrorDocument 403 /errors/handler.php?er=403 ErrorDocument 404 /errors/handler.php?er=404 ErrorDocument 500 /errors/handler.php?er=500
Выдавать свои сообщения на ошибки. Обычно хостер позволяет свои страницы ошибок с кодами, указанными выше. Тогда можно описать их в главном .htaccess или через панель управления сайтом на хостинге.
Пароль на каталог. Защита админки
Админский каталог должен быть защищен обязательной аутентификацией. Запрос пароля можно намутить через скрипт с выдачей в браузер или просто использовать HTTP-аутентификацию средствами веб-сервера. Для этого в защищаемом каталоге создаем свой .htaccess:
AuthType Basic AuthUserFile D:\web\Site\.password AuthName "Доступ ограничен. Введите пароль" # разрешен доступ всем прошедшим проверку require valid-user # Доступ конкретным пользователям # require user0 user1 AdMinKo
Собственно пояснять тут нечего, последняя строка закоментирована, это пример. Другой вопрос, как создать сам файл пароля, .password. Кстати, имя файла может быть любым. Через консоль Windows запустите файл [..\Apache2.2\bin\ htpasswd.exe] . Запуск без параметров выдаст инструкцию по применению 🙂
После генерации файла не забудьте перенести его в прописанный ранее каталог, в данном случае — корень сайта. Перегружать веб-сервер не нужно, при обращении к защищенному каталогу через браузер получите приглашение ввести пароль.
Для усиления защиты можно разрешить доступ в админку только с определенных адресов. Аналогично можно закрыть доступ на весь сайт или его часть из определенных стран, подсетей и т.п. Пример:
Order Deny,Allow Deny from all # доступ разрешен для двух ip-адресов Allow from 192.168.1.104 192.168.1.205 # доступ разрешен из подсети Allow from 10.1.2
Всем, кого нет в списке, сервер ответит «403 Forbidden«. Практический плюс: такой подход позволит снизить нагрузку на сервер во время брутфорсной атаки на пароль админа. Минус защиты в том, что у вас должен быть белый (постоянный) ip-ник, иначе при каждой смене адреса придется лазить в файл конфига. Еще следует учесть, что ваш реальный ip-адрес может быть скрыт за NAT, следовательно разрешение будет дано любой машине за тем же NAT. Но это все равно лучше, чем ничего.
Бонус
Есть некоторые тонкости в настройках сайта. Вы знаете, что главный .htaccess распространяется на вложенные каталоги. Допустим в нем описано:
DirectoryIndex index.php
Options -Indexes
Что дает следующее: попытка зайти через браузер во вложенный каталог, например [../images], закончится ошибкой «403: Доступ запрещен«. Во вложенном каталоге нет ни своего .htaccess, ни index.php, а чтение каталога запрещено «-Indexes».
Если переписать директиву на «DirectoryIndex /index.php», тогда обращение к любому каталогу будет перенаправляться на главный index.php. Это решает проблему с подкаталогами и ошибкой 403, но тогда игнорируются индексные страницы во всех подкаталогах. К примеру, админка может иметь свой index.php но вы его не увидите. Выход, в главном .htaccess описать:
Слеш в конце – это указание искать индексную страницу на уровень выше. Тогда если каталог не имеет своей главной страницы, в браузер будет выдана страница родителя.. или родителя родителя %) Короче, ближайший index.php. Конечно, можно так не заморачиваться, пусть юзер видит «403: Forbidden«, если залез не туда, и пусть логи забиваются ненужной информацией. Дело ваше 🙂
Еще бонус
deny from all
можно запретить обращение через бродилку к указанному файлу. Где это использовать, решайте сами. Скажу лишь, что в настройках веб-сервера скорее всего запрещен доступ к любым . htaccess, но вдруг ваш хостер – раздолбай? Делайте выводы 🙂
Бонус 3
Где-то в 10.x версиях Оперы был глюк – браузер по ссылке открывал rar-файл, выдавая крякозяблы, вместо того, чтобы загрузить его на диск. Это лечилось настройкой браузера со стороны пользователя, но есть и другой вариант, «админский»:
# настройка принудительного сохранения файлов, которые не должны открываться в браузере
AddType application/octet-stream .rar .avi .pdf
Можно дописать свои расширения. Я экспериментировал в Opera 11.0 с расширением jpg — не сработало, а FF18 принял указание корректно. Вывод: использовать на свой страх и риск 😉
Начало работы
Если вы абсолютный новичок в работе с HTTP-сервером Apache или в запуске веб-сайтов вообще, вы можете не знать с чего начать или какие вопросы задавать. Этот документ познакомит вас с основами.
- Клиенты, серверы и URL-адреса
- Имена хостов и DNS
- Файлы конфигурации и директивы
- Контент веб-сайта
- Файлы журналов и устранение неполадок
- Что дальше?
См. также
Клиенты, серверы и URL-адреса
Адреса в Интернете записываются с помощью URL — Uniform Resource Locator (унифицированный указатель ресурса), который указывает на используемый протокол (например, http ), имя сервера (например, www.apache.org ), URL-путь (например, /docs/current/getting-started.html ) и, возможно, строку запроса (например, ?arg=value ), используемую для передачи серверу дополнительных аргументов.
Клиент (например, веб-браузер) подключается к серверу (например, вашему HTTP-серверу Apache), используя определённый протокол, и отправляет запрос на ресурс, используя URL-путь.
URL-путь может обозначать множество вещей на сервере. Это может быть файл (как getting-started.html ), обработчик (как server-status) или файл какой-то программы (как index.php ). Мы рассмотрим это подробней ниже, в разделе Контент веб-сайта.
Сервер отправляет ответ, содержащий код состояния и, опционально, тело ответа. Код состояния указывает, был ли запрос успешно обработан, а если нет, то какая ошибка произошла. Это говорит клиенту, что он должен делать с ответом. Вы можете прочитать о возможных кодах ответа на Вики HTTP-сервера Apache.
Детали транзакции и условия возникновения ошибки записываются в файлы журналов. Это описывается более подробно ниже, в разделе Файлы журналов и устранение неполадок.
Имена хостов и DNS
Для того чтобы соединиться с сервером, клиент сначала должен преобразовать имя сервера в IP-адрес — место в Интернете, где находится сервер. Таким образом, чтобы ваш веб-сервер был доступен, необходимо, чтобы имя сервера было в DNS.
Если вы не знаете как это сделать, вам нужно обратиться к сетевому администратору или поставщику услуг Интернета (провайдеру). Они могут сделать это для вас.
Несколько хостов могут указывать на один и тот же IP-адрес, а один физический сервер может иметь больше одного IP-адреса. Таким образом на одном физическом сервере вы можете запустить больше одного сайта с помощью особенности: виртуальные хосты.
Если вы тестируете сервер, не имеющий выхода в Интернет, можете поместить имена хостов в файл hosts для того что бы имя разрешалось локально. Например, вы можете добавить запись для отправки запросов к www.example.com на локальный компьютер, для тестирования. Эта запись будет выглядеть так:
Файл hosts, скорее всего, расположен в /etc/hosts или C:\Windows\system32\drivers\etc\hosts .
Вы можете узнать больше о файле hosts и больше о DNS.
Файлы конфигурации и директивы
HTTP-сервер Apache настроен с помощью простых текстовых файлов. Эти файлы могут располагаться в разных местах, в зависимости от того как вы установили сервер. Общие места расположения файлов можно найти в Вики HTTP-сервера Apache. Если вы установили httpd из исходного кода, то расположение файлов конфигурации по умолчанию следующее: /usr/local/apache2/conf . По умолчанию файл конфигурации называется httpd.conf . Это тоже может варьироваться в сторонних дистрибутивах сервера.
Конфигурация часто разбивается на несколько небольших файлов, для удобства управления. Эти файлы загружаются через директиву Include . Имена или расположения этих файлов конфигурации могут сильно отличаться от одной установки к другой. Расположите и разделите эти файлы наиболее подходящим для вас образом. Если расположение файлов по умолчанию, не имеет смысла для вас, не стесняйтесь изменить его.
Сервер настраивается путём размещения директив конфигурации в этих файлах конфигурации. Директива — это ключевое слово с одним или несколькими аргументами, устанавливающими её значение.
На вопрос: «Где я должен прописать эту директиву?» – обычно отвечают, там где ты хочешь использовать её. Если это глобальная настройка, она должна располагаться в конфигурационном файле вне разделов , , или других разделов. Если настройка относится только к конкретному каталогу, значит она должна быть внутри секции , которая описывает этот каталог, и так далее. Смотри документ Разделы конфигурации с подробным описанием вышеуказанных разделов.
В дополнение к основному файлу конфигурации, некоторые директивы могут располагаться в файлах .htaccess , расположенных в папках с контентом. Файлы .htaccess в первую очередь предназначены для людей у которых нет доступа к главному конфигурационному файлу сервера. Вы можете узнать больше о файлах .htaccess в инструкции .htaccess .
Контент веб-сайта
Содержимое сайта может принимать различные формы, но в широком смысле разделяется на статический и динамический контент.
Статический контент — это, например, HTML-файлы, файлы изображений, CSS-файлы и другие файлы, которые просто лежат на диске. Директива DocumentRoot указывает где в вашей файловой системе, вы должны разместить эти файлы. Эта директива устанавливается глобально или отдельно для каждого виртуального хоста. Посмотрите в своём файле(ах) конфигурации, чтобы узнать, как именно эта директива используется на вашем сервере.
Обычно, когда запрашивается каталог, без указания имени файла, то будет отдан документ с именем index.html . Например, если для директивы DocumentRoot установлено значение /var/www/html и приходит запрос на адрес http://www.example.com/work/ , то файл расположенный по пути /var/www/html/work/index.html будет отдан клиенту.
Динамический контент — это всё что генерируется во время запроса и может изменяться от запроса к запросу. Существует множество способов создания динамического контента. Различные обработчики доступны для генерации содержимого. Могут быть написаны специальные CGI программы для генерации контента на сайте.
Для написания кода с разнообразным функционалом могут использоваться сторонние модули, такие как mod_php. Множество сторонних приложений, написанных на различных языках программирования, и утилит доступны для скачивания и установки на ваш HTTP-сервер Apache. Поддержка сторонних продуктов выходит за рамки этой документации. При необходимости вы должны самостоятельно найти их документацию или форумы поддержки, где вы сможете получить ответы на свои вопросы.
Файлы журналов и устранение неполадок
Для вас, как администратора HTTP-сервера Apache, самые ценные активы — это файлы журналов (лог-файлы), в частности, журнал ошибок. Исправление любой проблемы без журнала ошибок можно сравнить с вождением автомобиля с закрытыми глазами.
Расположение журнала ошибок задаётся директивой ErrorLog , которая может быть установлена глобально или для каждого виртуального хоста. Записи в журнале ошибок расскажут вам, что и когда пошло не так. Зачастую они также смогут подсказать, как что-то исправить. Каждая запись в журнале ошибок содержит код ошибки, по которому вы можете поискать в Интернете более подробное описание того, как решить проблему. Вы также можете настроить журнал ошибок так, чтобы в него записывался идентификатор журнала, который можно сопоставить с записями в журнале доступа — это поможет определить, какой запрос какую ошибку вызвал.
Больше о логирование вы можете узнать в документации о журналах.
Что дальше?
Теперь, когда вы знакомы с основами, пора двигаться дальше.
Этот документ содержит только базовую информацию. Мы надеемся, что она поможет вам начать работу, но есть множество других вещей, о которых вам, возможно, нужно узнать.
Comments
Notice:
This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
Copyright 2023 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.