Участник:Petr-akhlamov/Apache2 разработка

Материал из ALT Linux Wiki
Примечание: Страница еще не завершена! Она может содержать неточности и ошибки.
Apache Http Server
Altenter-menu-apache.png
Появился в: 1995
Оф. сайт: httpd.apache.org
Репозиторий ALT Linux apache2
Лицензия: Apache License 2.0

apache2 (Apache HTTP Server) – веб-сервер, который представляет собой программное обеспечение с открытым исходным кодом. Он используется для размещения веб-сайтов и доступа к ним.

Благодаря модульной структуре Apache обладает гибкостью и расширяемостью, а также надёжностью и стабильностью работы. Apache поддерживается многими операционными системами, в том числе ОС ALT Linux.

Установка сервера в ALT Linux

Установка

Apache2 можно установить как отдельно:

# apt-get install apache2

Так и в наборе LAMP:

# apt-get install lamp-server

В данном случае будут установлены:

  • Apache2
  • PHP
  • MariaDB

Включаем и запускаем службы Apache и MySQL:

# systemctl enable --now httpd2
# systemctl enable --now mysqld

Управление службой

Команды
Запуск # systemctl start httpd2 # apachectl start
Остановка # systemctl stop httpd2 # apachectl stop
Перезапуск # systemctl restart httpd2 # apachectl restart
Отключение автозагрузки # systemctl disable httpd2
Включение автозагрузки # systemctl enable httpd2
Перезапуск службы без сброса соединений # systemctl reload httpd2
Состояние службы # systemctl status httpd2
Версия Apache # httpd2 -v
Содержимое юнита $ systemctl cat httpd2

Более подробную информацию об apachectl можно посмотреть командой man apachectl.

Когда Apache запускается через apachectl, он не регистрируется как служба systemd, поэтому некоторые функции управления процессами, такие как автоматический запуск при загрузке системы, могут потребовать дополнительной настройки. Также будут другие параметры журналирования.

Настройка

Файлы конфигурации Apache хранятся в /etc/httpd2/conf/.

Основной файл конфигурации /etc/httpd2/conf/httpd2.conf включает в себя различные другие файлы настроек и конфигураций.

Настройки

Структура каталогов конфигурации

Основные файлы Apache в ALT Linux лежат в /etc/httpd2/.

# ls /etc/httpd2/ -l
итого 4
drwxr-xr-x 18 root root 4096 янв 15 11:20 conf
lrwxrwxrwx  1 root root   21 июл 29 14:51 lock -> ../../var/lock/httpd2
lrwxrwxrwx  1 root root   20 июл 29 14:51 logs -> ../../var/log/httpd2
lrwxrwxrwx  1 root root   31 июл 29 14:51 modules -> ../../usr/lib64/apache2/modules
lrwxrwxrwx  1 root root   20 июл 29 14:51 run -> ../../var/run/httpd2
lrwxrwxrwx  1 root root   31 июл 29 14:51 uploads -> ../../var/spool/apache2/uploads

Основные настройки Apache хранятся в каталоге /etc/httpd2/conf/.

# ls /etc/httpd2/conf/
addon.d          httpd2.conf  mods-available  ports-available  sites-enabled
extra-available  include      mods-enabled    ports-enabled    sites-start.d
extra-enabled    magic        mods-start.d    ports-start.d    ssl.crt
extra-start.d    mime.types   original        sites-available  ssl.key

Основными компонентами конфигурации являются:

  • модули (mods)
  • дополнительная конфигурация (extra)
  • порты (ports)
  • сайты (sites).

Они же в свою очередь делятся на:

  • включенные (enabled)
  • доступные (available)
  • стартовые (start.d).

Стартовые компоненты хранятся в /etc/httpd2/conf/{mods,sites,port,extra}-start.d/*.conf.

Включенные и стартовые компоненты являются символическими ссылками из available.

# ls /etc/httpd2/conf/mods-enabled/ -l
итого 0
lrwxrwxrwx 1 root root 36 сен 12  2023 access_compat.load -> ../mods-available/access_compat.load
lrwxrwxrwx 1 root root 28 сен 12  2023 alias.load -> ../mods-available/alias.load
lrwxrwxrwx 1 root root 33 сен 12  2023 authz_core.load -> ../mods-available/authz_core.load
lrwxrwxrwx 1 root root 33 сен 12  2023 authz_host.load -> ../mods-available/authz_host.load
lrwxrwxrwx 1 root root 32 сен 12  2023 autoindex.load -> ../mods-available/autoindex.load
lrwxrwxrwx 1 root root 26 сен 12  2023 dir.conf -> ../mods-available/dir.conf
lrwxrwxrwx 1 root root 26 сен 12  2023 dir.load -> ../mods-available/dir.load
lrwxrwxrwx 1 root root 30 сен 12  2023 include.load -> ../mods-available/include.load
lrwxrwxrwx 1 root root 33 сен 12  2023 log_config.conf -> ../mods-available/log_config.conf
lrwxrwxrwx 1 root root 33 сен 12  2023 log_config.load -> ../mods-available/log_config.load
lrwxrwxrwx 1 root root 28 сен 12  2023 logio.load -> ../mods-available/logio.load
lrwxrwxrwx 1 root root 27 сен 12  2023 mime.conf -> ../mods-available/mime.conf
lrwxrwxrwx 1 root root 27 сен 12  2023 mime.load -> ../mods-available/mime.load
lrwxrwxrwx 1 root root 34 сен 12  2023 negotiation.load -> ../mods-available/negotiation.load
lrwxrwxrwx 1 root root 26 сен 12  2023 ssl.load -> ../mods-available/ssl.load
lrwxrwxrwx 1 root root 30 сен 12  2023 systemd.load -> ../mods-available/systemd.load
lrwxrwxrwx 1 root root 30 сен 12  2023 userdir.conf -> ../mods-available/userdir.conf
lrwxrwxrwx 1 root root 30 сен 12  2023 userdir.load -> ../mods-available/userdir.load

Чтобы сделать компонент активным (то есть добавить в enabled) или неактивным (то есть убрать из enabled) используется команда a2{en,dis}{mod,site,port,extra}.

Примеры команд:

# a2enmod cgi # включение модуля cgi
# a2dismod cgi # выключение модуля cgi

Также можно добавить компонент в автозапуск. Для этого надо добавить в файл /etc/httpd2/conf/{mods,sites,port,extra}-start.d/*.conf строку <Имя компонента>={yes,no} .

Данный сервис включает конфигурации

  • Include conf/mods-enabled/*.load
  • Include conf/mods-enabled/*.conf
  • Include conf/ports-enabled/*.conf
  • Include conf/extra-enabled/*.conf
  • Include conf/sites-enabled/*.conf

Подробные зависимости описаны в файле /etc/httpd2/conf/httpd2.conf. Можно создать свою конфигурацию в /etc/httpd2/conf/{mods,sites,port,extra}-start.d/*.conf, добавление в общую конфигурацию будет сделано автоматически.

Логирование

В основном, логи с ошибками, по умолчанию, записываются в файл /var/log/httpd2/error_log. Этот путь аналогичен /etc/httpd2/logs/error_log, так как /etc/httpd2/logs - это символическая ссылка, указывающая на /var/log/httpd2/.

Данный параметр задается в файле /etc/httpd2/conf/httpd2.conf

LogLevel warn

Уровень логирований по умолчанию warn.

Существуют следующие уровни логирования:

  • emerg: критическая ситуация, аварийный сбой, система находится в нерабочем состоянии.
  • alert: сложная предаварийная ситуация, необходимо срочно принять меры.
  • crit: критические проблемы, которые необходимо решить.
  • error: произошла ошибка.
  • warn: предупреждение; в системе что-то произошло, но причин для беспокойства нет.
  • notice: система в норме, но стоит обратить внимание на её состояние.
  • info: важная информация, которую следует принять к сведению.
  • Debug: информация для отладки, которая может помочь определить проблему.
  • trace[1-8]: Трассировка информации различных уровней детализации.

Если указать определённый уровень, то будут отображаться сообщения со всех уровней, имеющих более высокий приоритет. Например, если указан LogLevel info, то будут публиковаться также сообщения с уровнями notice и warn.

Ниже показан фрагмент файла.

# grep -v '#' /etc/httpd2/conf/httpd2.conf 

ServerRoot "/etc/httpd2"

Include conf/mods-enabled/*.load
Include conf/mods-enabled/*.conf
Include conf/ports-enabled/*.conf

<IfModule unixd_module>
User apache2
Group apache2
</IfModule>

<Files ".ht*">
    Require all denied
</Files>

ErrorLog "/var/log/httpd2/error_log"

LogLevel warn

Include conf/extra-enabled/*.conf
Include conf/sites-enabled/*.conf

Опции

httpd2.conf

Пользователь и группа

Данный параметр задается в файле /etc/httpd2/conf/httpd2.conf

User apache2
Group apache2

По соображениям безопасности, как только Apache запускается под root (напрямую или через сценарии запуска), он переключается на эти UID и GID. Пользователь по умолчанию — apache2 создается автоматически во время установки.

ports-enabled

Порт

Данный параметр задается в файле /etc/httpd2/conf/ports-enabled/http.conf

Listen 80

Этим параметром задается порт, который будет слушать Apache. Для доступа в Интернет через роутер необходимо перенаправлять порт.

Если вы хотите настроить Apache для локальной работы (например для разработки), или возможно, вы хотите, чтобы он был доступен только с вашего компьютера, замените эту строку на

Listen 127.0.0.1:80.

sites-available

Администратор

Данный параметр задается в файле /etc/httpd2/conf/sites-available/default.conf

ServerAdmin you@example.com

Здесь указывается адрес электронной почты администратора, который можно найти, к примеру, на страницах ошибок.

Корневой каталог

Данный параметр задается в файле /etc/httpd2/conf/sites-available/default.conf

По-умолчанию сайт хранится в /var/www/html/. Но этот путь можно заменить на свой.

Откройте в текстовом редакторе от суперпользователя файл /etc/httpd2/conf/sites-available/default.conf.

Замените в строке DocumentRoot "/var/www/html/" путь на свой.

extra-available

Timeout

Данный параметр задается в файле /etc/httpd2/conf/extra-available/httpd-default.conf

Timeout 300

Он указывает как долго сервер будет пытаться продолжить прерванную передачу или прием данных.

Передача нескольких файлов за соединение

Данные параметры задаются в файле /etc/httpd2/conf/extra-available/httpd-default.conf


KeepAlive On

Он позволяет передавать несколько файлов, за одно соединение, например, не только саму html страницу, но и картинки и css файлы.


MaxKeepAliveRequests 100

Данный параметр указывает максимальное количество запросов за одно соединение (обычно чем больше, тем лучше).


KeepAliveTimeout 5

В данном параметре указывается таймаут соединения. Обычно для загрузки страницы достаточно 5-10 секунд.

IP вместо доменных имен в логах

Данный параметр задается в файле /etc/httpd2/conf/extra-available/httpd-default.conf

HostnameLookups On

При включении данного параметра в логах сервера вместо доменных имен будут записываться IP-адреса.

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

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

Например, DNS-имена:

  • host1.petr.ru
  • site1.petr.ru

посылают на 10.4.4.41, а Apache сам решает в какой каталог одного сервера направлять эти запросы.

Создание новых файлов виртуальных хостов Apache поставляется с файлом конфигурации виртуального хоста по умолчанию 000-default.conf. Конфигурация этого виртуального хоста по умолчанию лежит в /etc/httpd2/conf/sites-enabled/000-default.conf.

# grep -v /etc/httpd2/conf/sites-enabled/000-default.conf
<VirtualHost *>
	ServerAdmin webmasterr@localhost

	DocumentRoot "/var/www/html"

	<Directory />
		Include conf/include/Directory_root_default.conf
	</Directory>

	<Directory "/var/www/html">
		Include conf/include/Directory_html_default.conf
	</Directory>

	ErrorLog /var/log/httpd2/error_log

	LogLevel warn

	<IfModule log_config_module>
		CustomLog /var/log/httpd2/access_log common
	</IfModule>

	<IfModule alias module>

		ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
	
	</IfModule>

	<Directory "/var/www/cgi-bin">
		Include conf/include/Directory_cgibin_default.conf
	</Directory>
</VirtualHost>
  • Тег <VirtualHost *> в конфигурационных файлах Apache используется для определения виртуального хоста, который будет слушать на всех доступных сетевых интерфейсах сервера.
  • ServerAdmin webmasterr@localhost определяет электронную почту администратора сервера, которую можно использовать для обратной связи в случае проблем с сайтом.
  • DocumentRoot "/var/www/html" указывает корневой каталог, где размещаются основные файлы веб-сайта. Все запросы к этому виртуальному хосту будут искать файлы начиная с этого каталога.
  • Секция <Directory />... </Directory> настраивает поведение для корневого каталога сервера. Здесь включается дополнительная конфигурация из файла conf/include/Directory_root_default.conf, который содержит общие настройки для корневого каталога. В частности в этом файле определены режим доступа к серверу
 altwks1 conf #  grep -v '#' include/Directory_root_default.conf 
 Options +FollowSymLinks -Indexes
 AllowOverride None  # Директивы .htaccess не могут изменить поведение сайта
 Require all denied # доступ для всех запрещен к корневому каталогу
  • <Directory "/var/www/html">... </Directory> - здесь включается конфигурация из файла conf/include/Directory_html_default.conf, который содержит настройки для статического контента веб-сайта.
conf # grep -v '#' include/Directory_html_default.conf
Options Includes FollowSymLinks MultiViews
AllowOverride None # Директивы .htaccess не могут изменить поведение сайта
Require all granted # доступ для всех разрешен к каталогу /var/www/html
  • ErrorLog /var/log/httpd2/error_log: Здесь указан файл журнала ошибок для записи сообщений об ошибках сервера.
  • LogLevel warn: Устанавливает уровень логирования на "warn", что означает, что будут записываться только сообщения об ошибках и предупреждениях.
  • <IfModule log_config_module>... </IfModule>: Этот блок активируется, если модуль log_config_module загружен. Внутри блока настраивается логирование доступа к серверу в файле /var/log/httpd2/access_log с использованием общего формата лога.
  • <IfModule alias_module>... </IfModule>: Блок активируется, если модуль alias_module загружен. Внутри блока определяется псевдоним для каталога /var/www/cgi-bin/, что позволяет обращаться к нему по URL-адресу /cgi-bin/. Это обычно используется для размещения скриптов CGI. Про это будет ниже.
  • <Directory "/var/www/cgi-bin">... </Directory>: Настройки специфичны для каталога с CGI скриптами. Здесь включается конфигурация из файла conf/include/Directory_cgibin_default.conf, который, вероятно, содержит настройки безопасности и других параметров для работы с CGI скриптами. Про это будет ниже.

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

Теги

VirtualHost

<VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost>

IPv4 записывается так: <VirtualHost 192.168.100.101:9090>.

IPv6 адрес нужно указывать в квадратных скобках <VirtualHost [2001:db8::a00:20ff:fea7:ccea]:80>.

Есть также конструкция <VirtualHost *>. Этот тег без указания конкретного IP-адреса или имени хоста позволяет серверу обрабатывать запросы ко всем доступным сетевым интерфейсам. Это означает что если у вас несколько сетевых интерфейсов, например ens3, ens8 и у них есть ip-адреса (10.0.2.15, 192.168.100.101), то по всем этим адресам можно будет подключиться к веб-серверу.

Внутри тега <VirtualHost *> и до закрывающего тега </VirtualHost> находятся настройки, специфичные для данного виртуального хоста (ServerAdmin, DocumenRoot, Directory, ErrorLog, LogLevel и др, они будут разобраны ниже).

IP и порт

При изменении тега на адрес с портом, например, с <VirtualHost *> на <VirtualHost 192.168.100.101:9090>, при попытке запустить это сервер и зайти на этот хост возникнет ошибка.

Она будет вызвана тем что, порт 9090 не прослушивается сервером apache. Данный параметр должен быть указан в файле /etc/httpd2/conf/ports-enabled/*.conf.

$ ls /etc/httpd2/conf/ports-available/*
/etc/httpd2/conf/ports-available/http.conf
/etc/httpd2/conf/ports-available/http-localhost-8088.conf
/etc/httpd2/conf/ports-available/https.conf
# echo Listen 9090 > /etc/httpd2/conf/ports-available/test_port.conf
# a2enport test_port
# systemctl restart httpd2

ServerAdmin

Адрес электронной почты, который сервер включает в сообщения об ошибках, отправляемые клиенту.

Синтаксис директивы:

ServerAdmin email-address|URL

Администратор сервера устанавливает адрес, который сервер включает в любые сообщения об ошибках, которые он возвращает клиенту. По умолчанию httpd предполагает, что данный аргумент это url, однако если он не распознал его, аргумент будет адресом электронной почты. Однако рекомендуется использовать адрес электронной почты, поскольку существует множество CGI-скриптов, которые используют его. Если вы хотите использовать URL-адрес, он должен указывать на другой сервер, находящийся под вашим контролем.

Примеры:

ServerAdmin www-admin@foo.example.com
ServerAdmin webmasterr@localhost

DocumentRoot

Каталог, формирующий основное дерево документов видимое из Интернета.

Синтаксис директивы:

DocumentRoot directory-path

Пример:

DocumentRoot "/var/www/html" 

Directory

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

Синтаксис директивы:

<Directory directory-path> ... </Directory>

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

Directory-path - это либо полный путь к каталогу, либо строка с подстановочным знаком, использующая сопоставление в стиле оболочки Unix (то есть можно использовать *, ?, [, ].).

Пример:

<Directory "/var/www/html">
 Options Indexes FollowSymLinks
</Directory>

Также можно использовать регулярные выражения с добавлением символа ~. Пример соответствовал бы каталогам в /www/, состоящим из трех номеров.

<Directory ~ "^/www/[0-9]{3}">
</Directory>

Files

Аналогично что и в Directory, только для конкретных файлов.

Синтаксис директивы:

<Files filename> ... </Files>

<Files> и </Files> используются для обозначения группы директив, которые будут применяться только к файлам. Может использоваться любая директива, разрешенная в контексте каталога. filename - это либо полный путь к файлу, либо строка с подстановочным знаком, использующая сопоставление в стиле оболочки Unix (то есть можно использовать *, ?, [, ].).

Пример:

<Files "cat.html">

</Files>
<Files "?at.*">

</Files>

LogLevel

Управляет уровнем детализации логов.

Синтаксис директивы:

LogLevel [module:]level [module:level] ...

По умолчанию используется LogLevel warn, это указано было в /etc/httpd2/conf/httpd2.conf.

Существуют следующие уровни

  • emerg: критическая ситуация, аварийный сбой, система находится в нерабочем состоянии.
  • alert: сложная предаварийная ситуация, необходимо срочно принять меры.
  • crit: критические проблемы, которые необходимо решить.
  • error: произошла ошибка.
  • warn: предупреждение; в системе что-то произошло, но причин для беспокойства нет.
  • notice: система в норме, но стоит обратить внимание на её состояние.
  • info: важная информация, которую следует принять к сведению.
  • Debug: информация для отладки, которая может помочь определить проблему.
  • trace[1-8]: Трассировка информации различных уровней детализации.

Если указать определённый уровень, то будут отображаться сообщения со всех уровней, имеющих более высокий приоритет. Например, если указан LogLevel info, то будут публиковаться также сообщения с уровнями notice и warn.

Если указать уровень без имени модуля, то уровень для всех модулей будет сброшен до этого уровня. Если же указать уровень с именем модуля, то уровень будет установлен только для этого конкретного модуля. В качестве имени модуля можно использовать имя исходного файла модуля, его идентификатор или идентификатор модуля с опущенным словом «module» в конце.

Пример:

LogLevel info
<Directory "/var/www/html">
 LogLevel debug
</Directory>
LogLevel info cgi:warn

Важно понимать что модуль должен быть включен иначе будет ошибка в компиляции.

httpd2 # nano /etc/httpd2/conf/sites-enabled/test.conf
httpd2 # ls conf/mods-enabled/
access_compat.load	autoindex.load	logconfig.conf	mime.load
alias.load			dir.conf		logconfig.load	negotiation.load
authz_core.load		dir.load		logio.load		systemd.load
authzhost.load		include.load	mime.conf
httpd2 # apachectl -t
AH00526: Syntax error on line 17 of /etc/httpd2/conf/sites-enabled/test.conf:
Cannot find module cgi
httpd2 # a2enmod cgi
Module cgi installed;
	run service httpd2 condreload to fully enable.
httpd2 # apachectl -t
Syntax OK
httpd2 # systemctl restart httpd2
altwksl httpd2 #

ErrorLog

Место где сервер сохраняет логи.

Синтаксис директивы:

ErrorLog file-path|syslog[:[facility][:tag]]

Если у нас в file-path указан не абсолютный путь, то путь считается относительно ServerRoot.

Пример логов:

httpd2 # cat /var/log/httpd2/cgi log
[Tue Jun 18 23:23:00.663032 2024] [core:info] [pid 11431:tid 139785912661568] [client 192.168.100.101:4587
8] AH00128: File does not exist: /var/www/test/
[Tue Jun 18 23:23:00.717412 2024] [core:info] [pid 11431:tid 139785904268864] [client 192.168.100.101:4587
8] AH00128: File does not exist: /var/www/test/favicon.ico, referer: http://www.test.ru:9090/
[Tue Jun 18 23:42:14.088861 2024] [core:info] [pid 12241:tid 139868764108352] [client 192.168.100.101:6055
8] AH00128: File does not exist: /var/www/example/favicon.ico, referer: http://www.example.ru:9090/
altwksl httpd2 #

Пример:

ErrorLog "/var/log/httpd/error_log"
ErrorLog /var/log/httpd2/cgi_log

IfModule

Здесь содержатся директивы, которые зависят от условий.

Cинтаксиc директивы

<IfModule [!]module-file|module-identifier> ... </IfModule>

Существует два случая:

  • module
  • !module

В первом случае директивы обрабатываются, если модуль с именем module включен в apache httpd - либо скомпилирован, либо динамически загружен с помощью LoadModule. Во втором случае тест выполняется наоборот, директивы обрабатываются если модуль не включен.

Примеры:

<IfModule log_config_module>
 ErrorLog /var/log/httpd2/cgi_log
</IfModule>
<IfModule log_config_module>
  /var/log/httpd2/access_log common
</IfModule>

ServerName

Имя хоста и порт, которые сервер использует для своей идентификации

Cинтаксиc директивы

ServerName [scheme://]domain-name|ip-address[:port]

Директива ServerName устанавливает схему запроса, имя хоста и порт, которые сервер использует для своей идентификации. При этом имя хоста должен быть определен в системе, это делается либо с помощью dns, либо определяется вручную.

Пример:

ServerName www.example.com
ServerName www.test.com

Для демонстрации работы был немного изменен файл conf/sites-available/test.conf. Содержимое представлено на картинке. Был создан файл /var/www/test/index.html для демонстрации.

echo '<html><H1>test site</H1></html>' > /var/www/test/index.html
altwksl httpd # cat /etc/hosts
127.0.0.1      localhost.localdomain localhost
192.168.100.101 altwks1.courses.alt altwks1
192.168.100.102 altwks2.courses.alt altwks2
192.168.100.121 altsrv1.courses.alt altsrv1
192.168.100.122 altsrv2.courses.alt altsrv2
192.168.100.123 altsrv3.courses.alt altsrv3

192.168.100.101 www.test.ru www.example.ru
altwksl httpd2 # cat conf/sites-available/test.conf
<VirtualHost 192.168.100.101:9090>
        serverAdmin webmasterr@localhost
        ServerName www.test.ru
        ServerAlias web.test.ru
        DocumentRoot "/var/www/test"
        ErrorLog /var/log/httpd2/error_log
        #LogLevel info
        LogLevel info cgi:warn
        <IfModule log_config_module>
        ErrorLog /var/log/httpd2/cgi_log
        </lfModule>

</VirtualHost>
altwksl httpd2 #

Также был создан файл conf/sites-available/example.conf, его содержимое такое же, отличается только DocumentRoot.

httpd2 # nano conf/sites-available/example.conf
httpd2 # systemctl reload httpd2
httpd2 # cat conf/sites-available/example.conf
<VirtualHost 192.168.100.101:9090>
         ServerAdmin webmasterr@localhost
         ServerName www.example.ru
         ServerAlias web.example.ru
         DocumentRoot "/var/www/example"

         ErrorLog /var/log/httpd2/error_log

         #LogLevel info
         LogLevel info cgi:warn

         <IfModule log_config_module>
                 ErrorLog /var/log/httpd2/cgi_log
         </IfModule>

</VirtualHost>

Таким образом, несмотря на то, что у нас один IP-адрес, у нас имеется два имени, и сервер Apache их различает по именам.

ServerAlias

Альтернативные имя хоста, которые сервер использует для своей идентификации.

Cинтаксиc директивы

ServerAlias hostname [hostname] ...

Примеры:

ServerAlias server server2.example.com server2
ServerAlias *.example.com

Шаг 1: Регистрируем домены на один IP адрес

На AD/DNS-сервере

Для внешнего сайта необходимо зарегистрировать домен на регистраторе, для внутреннего на Bind.

Если домен на Samba, то командой:

# samba-tool dns add dc.petr.ru petr.ru site1 A 10.4.4.41 -U administrator

Где:

  • dc.petr.ru - адрес контроллера домена
  • petr.ru - адрес домена
  • site1 - имя хоста
  • A - тип записи
  • 10.4.4.41 - адрес хоста

По аналогии:

# samba-tool dns add dc.petr.ru petr.ru host1 A 10.4.4.41 -U administrator

Адреса host1.petr.ru и site1.petr.ru будут отображать страницу index сервера Apache или приветственную страницу ALT Linux, в зависимости от того, что у вас установлено.

Примечание: В приведенных примерах необходимо заменить host1.petr.ru на имя вашего реального домена. Только в этом случае файл будет указывать веб-серверу, где найти корневой каталог сайта и куда необходимо сохранять журналы ошибок и обращений к сайту.


Если вы ошиблись и хотите удалить адрес, воспользуйтесь командой:

# samba-tool dns delete dc.petr.ru petr.ru site1 A 10.4.4.41 -U administrator

или

# samba-tool dns delete dc.petr.ru petr.ru host1 A 10.4.4.41 -U administrator

Где:

  • dc.petr.ru - адрес контроллера домена
  • petr.ru - адрес домена
  • site1 - имя хоста
  • A - тип записи
  • 10.4.4.41 - адрес хоста

На Apache-сервере

Потом прописываем на сервере адреса в hosts:

# mcedit /etc/hosts
10.4.4.41   host1.petr.ru
10.4.4.41   site1.petr.ru

Выполняем:

/etc/chroot.d/resolv.all

Тестируем с клиентского компьютера от имени простого пользователя:

$ ping host1.petr.ru
$ ping site1.petr.ru

Пинг должен попадать на IP-адрес сервера.

Шаг 2: Разрешаем загружать виртуальные сайты

В файле /etc/httpd2/conf/sites-start.d/000-default.conf:

ports_all=yes
default=yes
vhosts=no

Необходимо изменить последнюю строку:

vhosts=yes

Для применения изменений запустить:

# a2chkconfig

Шаг 3: Прописываем виртуальные хосты

Примечание: Обратите внимание! В директиве ServerName нужно указать полное доменное имя сайта


В файле /etc/httpd2/conf/sites-available/vhosts.conf дописываем

 <VirtualHost *:80>
 ServerAdmin webmaster@dummy-host.example.com
 DocumentRoot /var/www/vhosts/host1
 ServerName host1.petr.ru
 ErrorLog /var/log/httpd2/host1-error_log
 CustomLog /var/log/httpd2/host1-access_log common
 </VirtualHost>
 #
 <VirtualHost *:80>
 ServerAdmin webmaster@dummy-host.example.com
 DocumentRoot /var/www/vhosts/site1
 ServerName site1.petr.ru
 ErrorLog /var/log/httpd2/site1-error_log
 CustomLog /var/log/httpd2/site1-access_log common
 </VirtualHost>
  • Тег <VirtualHost *> в конфигурационных файлах Apache используется для определения виртуального хоста, который будет слушать на всех доступных сетевых интерфейсах сервера. Если к знаку звездочки добавить :80 - будет использоваться указанный порт.
  • ServerAdmin webmaster@dummy-host.example.com Определяет электронную почту администратора сервера, которую можно использовать для обратной связи в случае проблем с сайтом.
  • DocumentRoot "/var/www/vhosts/host1" Указывает корневой каталог, где размещаются основные файлы веб-сайта. Все запросы к этому виртуальному хосту будут искать файлы начиная с этого каталога.

Шаг 4: Создаем домашние каталоги виртуальных хостов

В /var/www/vhosts создаем два каталога host1 и site1, в которых размещаем разные тестовые веб-страницы.

# mkdir -p /var/www/vhosts/host1
# mkdir -p /var/www/vhosts/site1

Создаем файл:

# mcedit /var/www/vhosts/host1/index.html
<!DOCTYPE html>
<html>
	<head>
		<title>Тестовая страница Host1</title>
		<meta charset="utf-8">
	</head>
<body>
	<header>
		<h1>Тестовая страница Host1</h1>
	</header>
	<h2>Привет HTML и JavaScript</h2>
	<p>После этой строки будем писать контент и вставлять тестируемый код</p>
	
</body>
</html>
# mcedit /var/www/vhosts/site1/index.html
<!DOCTYPE html>
<html>
	<head>
		<title>Тестовая страница Site1</title>
		<meta charset="utf-8">
	</head>
<body>
	<header>
		<h1>Тестовая страница Site1</h1>
	</header>
	<h2>Привет HTML и JavaScript</h2>
	<p>После этой строки будем писать контент и вставлять тестируемый код</p>
	
</body>
</html>

Назначаем права:

# chmod 755 -R /var/www/vhosts/host1
# chmod 755 -R /var/www/vhosts/site1
Примечание: Обратите внимание, в данном примере должен быть адрес с http, без s!


Заходим со своего рабочего компьютера:

и в каждом видим свою тестовую страницу.

Apache virtual hosts.png

Настройка HTTPS

Для настройки HTTPS на apache нужно установить пакет, а также настроить SSL.

Установим пакет с модулем:

# apt-get install apache2-mod_ssl

Подключаем его:

# a2enmod ssl

Создаем каталог для ключей и переходим в него:

Примечание: Полный путь к каталогу будет /etc/httpd2/keys/
# cd /etc/httpd2/
# mkdir keys
# cd keys
Примечание: Вместо host1 вы можете указать свое имя


Создаем ключ:

# openssl req -newkey rsa:4096 -nodes -keyout host1.key -x509 -days 365 -out host1.crt 

Здесь:

  • req - создать запрос на подпись
  • -newkey rsa:409 - создаётся новый запрос сертификата и 4096-битный ключ RSA. По умолчанию используется 2048 бит.
  • -nodes - означает, что ключ не нужно шифровать.
  • -keyout - указывает файл, в который будет записан созданный приватный ключ
  • -x509 - означает, что создаётся самозаверяющий сертификат.
  • -days - указывает срок действия сертификата в днях
  • -out - указывает файл, в который будет записан созданный сертификат

При генерации везде ничего не вводим, кроме одного момента в Common Name - там вводим имя сервера, в нашем случае www.host1.petr.ru

#Common Name (e.g., your name or your server's hostname) []:www.host1.petr.ru

В нашем случае:

# openssl req -newkey rsa:4096 -nodes -keyout test1.key -x509 -days 365 -out test1.crt 

создаем файл /etc/httpd2/conf/sites-available/vhosts_https.conf

 <IfModule ssl_module>
 Listen 443
 <VirtualHost 10.0.2.5:443>
       ServerAdmin webmasterr@localhost
       ServerName www.host1.petr.ru:443
       DocumentRoot "/var/www/vhosts/host1"
 
       ErrorLog /var/log/httpd2/error_log
 
       #LogLevel info 
       LogLevel info cgi:warn
 
       <IfModule log_config_module>
               ErrorLog /var/log/httpd2/cgi_log
       </IfModule>
 
       SSLEngine on
       SSLCertificateFile keys/host1.crt
       SSLCertificateKeyFile keys/host1.key
 
 </VirtualHost>
 </IfModule>
Примечание: В a2ensite указывается имя конфига сайта созданного в каталоге с конфигурацией Apache


Не забудем его включить:

# a2ensite vhosts_https
# service httpd2 condreload
Примечание: Теперь при заходе на сайт по https он будет загружаться зашифрованный сертификатом. Уведомление об угрозе безопасности будет из-за того, что мы сделали сертификат самоподписанный. Если вы оформите сертификат подписанный УЦ, проблем не будет.


Apache https угроза.png

Apache https ok.png

Развертывание php-приложения

Для работы php нужно установить и включить соответствующий модуль Apache:

# apt-get install apache2-mod_php8.1
# a2enmod mod_php8.1
# systemctl reload httpd2

Стоит отметить, что для работы mod_php8.1 нужен apache2 в режиме prefork, а не в event как было это ранее. prefork и event это части MPM-модулей, эти модули отвечают за сетевое соединение, в сколько потоков и как они будут обрабатывать запросы.

Для включения этого режима нужно в файл /etc/httpd2/conf/httpd2.conf дописать следующую конфигурацию:

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
</IfModule>

Создадим в директории /var/www/vhosts/host1 (т.е. там где DocumentRoot) php-файл phpinfo.php с содержимым

 <?php
  phpinfo();
 ?>

Перезапускаем службу...

# systemctl reload httpd2

и заходим на сайт https://www.host1.petr.ru/phpinfo.php.

Phpinfo.png

Таким образом, у нас получилось запустить php-скрипт на сервере apache. Сервер напрямую исполняет код, этот подход имеет недостатки, поскольку он ресурсоемкий. Поэтому есть другие альтернативы запуска php-скриптов, в частности через cgi, PHP-FPM и другие модули. Похожим образом можно реализовать запсук скриптов на python. Далее будет разобран запуск python-скриптов с помощью cgi.

Развертывание Web-приложений на python

В данном случае мы будем использовать модуль cgi для исполнения кода python. Для этого вводим команду включения модуля модуля cgi.

# a2enmod cgid

Затем открываем конфигурацию нашего https-сайта mcedit /etc/httpd2/conf/sites-available/vhosts.conf и добавляем следующие директивы

Options  +ExecCGI
AddHandler cgi-script .cgi .py

Первой опцией мы разрешаем исполнение cgi-скриптов, а второй мы указываем серверу, какие скрипты он должен обрабатывать как cgi-скрипты.

Далее создаем скрипт /var/www/vhosts/site1/script.py. Его содержимое следующее.

#!/usr/bin/env python3
print ("Content-Type: text/html\n")
print ("<html><head>")
print ("<title>Site</title>")
print ("</head><body>")
print ("<h1>Hello, user!</h1>")
print ("</body></html>")

Далее:

  • делаем файл исполняемым:
# cd /var/www/vhosts/site1/
# chmod +x script.py 
  • перезапускаем сервер...
# systemctl reload httpd2

...и открываем сайт https://www.site1.petr.ru/script.py.

Apache script py.png

У нас появился сайт, который выводит строку Hello, user!