Перейти до змісту

Частина 2.1 Веб-сервери Apache

Apache

У цьому розділі ви дізнаєтеся про веб-сервер Apache.


Цілі: Ви дізнаєтеся, як:

✔ встановити та налаштувати Apache

🏁 apache, http, httpd

Знання: ⭐ ⭐\ Складність: ⭐ ⭐

Час читання: 30 хвилин


Загальні положення

HTTP-сервер Apache – це робота групи волонтерів: The Apache Group. Ця група збиралася створити веб-сервер на тому ж рівні, що й комерційні продукти, але як вільне програмне забезпечення (його вихідний код доступний).

Сотні користувачів приєдналися до початкової команди та внесли ідеї, тести та рядки коду, щоб зробити Apache найпоширенішим веб-сервером у світі.

Прабатьком Apache є доступний сервер, розроблений Національним центром суперкомп’ютерних застосувань при Університеті Іллінойсу. Розвиток цього сервера зупинився, коли відповідальна особа залишила NCSA у 1994 році. Користувачі продовжували виправляти помилки та створювати розширення, які вони поширювали як «патчі», звідси й назва «patchee server».

Випуск Apache версії 1.0 був випущений 1 грудня 1995 року (понад 30 років тому!).

Команда розробників координує свою роботу через список розсилки, де відбуваються обговорення пропозицій і змін програмного забезпечення. Голосування за зміни відбувається до включення в проект. Будь-хто може приєднатися до команди розробників. Щоб стати членом The Apache Group, ви повинні активно брати участь у проекті.

Сервер Apache має надійну присутність в Інтернеті, на нього припадає близько 50% частки ринку для всіх активних сайтів.

Частка ринку, втрачена Apache, часто дістається його найбільшому конкуренту: серверу Nginx. Останній швидший у доставці веб-сторінок і менш функціонально повний, ніж гігантський Apache.

Встановлення

Apache є кросплатформним. Його можна використовувати на Linux, Windows, Mac...

Адміністратору доведеться вибрати один з двох методів встановлення:

  • Встановлення пакета: постачальник дистрибутива надає стабільні, підтримувані (але іноді старіші) версії

  • Встановлення з вихідного коду: адміністратор збирає програмне забезпечення, який може вказати параметри, які його або її цікавлять, таким чином оптимізуючи послугу. Оскільки Apache має модульну архітектуру, зазвичай немає необхідності повторно компілювати програмне забезпечення Apache, щоб додати або видалити додаткові функції (додати або видалити модулі).

Настійно рекомендується метод інсталяції на основі пакетів. Додаткові репозиторії доступні для встановлення новіших версій Apache на старих дистрибутивах, але ніхто не надасть підтримку у разі виникнення проблем.

У дистрибутивах Enterprise Linux пакет httpd забезпечує сервер Apache.

У майбутньому, можливо, доведеться встановити деякі додаткові модулі. Ось кілька прикладів модулів і їхніх ролей:

  • mod_access: фільтрує клієнтський доступ за іменем хоста, IP-адресою чи іншою характеристикою
  • mod_alias: дозволяє створювати псевдоніми або віртуальні каталоги
  • mod_auth: аутентифікує клієнтів
  • mod_cgi: виконує сценарії CGI
  • mod_info: надає інформацію про стан сервера
  • mod_mime: пов’язує типи файлів із відповідною дією
  • mod_proxy: пропонує проксі-сервер
  • mod_rewrite: перезаписує URL-адреси
  • Інші
sudo dnf install httpd

На Rocky Linux 9 встановлена ​​версія 2.4.

Встановлення пакета створює системного користувача apache і відповідну системну групу apache.

$ grep apache /etc/passwd
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
$ grep apache /etc/group
apache:x:48:

Увімкніть і запустіть службу:

$ sudo systemctl enable httpd --now
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service  /usr/lib/systemd/system/httpd.service.

Ви можете перевірити статус послуги:

$ sudo systemctl status httpd
● httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabl>     Active: active (running) since Fri 2024-06-21 14:22:34 CEST; 8s ago
       Docs: man:httpd.service(8)
   Main PID: 4387 (httpd)
     Status: "Started, listening on: port 80"
      Tasks: 177 (limit: 11110)
     Memory: 24.0M
        CPU: 68ms
     CGroup: /system.slice/httpd.service
             ├─4387 /usr/sbin/httpd -DFOREGROUND
             ├─4389 /usr/sbin/httpd -DFOREGROUND
             ├─4390 /usr/sbin/httpd -DFOREGROUND
             ├─4391 /usr/sbin/httpd -DFOREGROUND

Не забудьте відкрити брандмауер (див. розділ «Безпека»).

Тепер ви можете перевірити наявність послуги:

  • З будь-якого веб-браузера, надавши IP-адресу вашого сервера (наприклад, http://192.168.1.100/).
  • Прямо з вашого сервера.

Для цього необхідно встановити текстовий браузер, наприклад elinks.

sudo dnf install elinks

Перегляньте свій сервер і перевірте сторінку за замовчуванням:

elinks http://localhost

Встановлення пакета httpd генерує повну структуру дерева, яку потрібно повністю зрозуміти:

/etc/httpd/
├── conf
│   ├── httpd.conf
│   └── magic
├── conf.d
│   ├── README
│   ├── autoindex.conf
│   ├── userdir.conf
│   └── welcome.conf
├── conf.modules.d
│   ├── 00-base.conf
│   ├── 00-brotli.conf
│   ├── 00-dav.conf
│   ├── 00-lua.conf
│   ├── 00-mpm.conf
│   ├── 00-optional.conf
│   ├── 00-proxy.conf
│   ├── 00-systemd.conf
│   ├── 01-cgi.conf
│   ├── 10-h2.conf
│   ├── 10-proxy_h2.conf
│   └── README
├── logs -> ../../var/log/httpd
├── modules -> ../../usr/lib64/httpd/modules
├── run -> /run/httpd
└── state -> ../../var/lib/httpd
/var/log/httpd/
├── access_log
└── error_log
/var/www/
├── cgi-bin
└── html

Ви помітите, що папка /etc/httpd/logs є символічним посиланням на каталог /var/log/httpd. Подібним чином ви помітите, що файли, які складають сайт за замовчуванням, знаходяться в папці /var/www/html.

Конфігурація

Спочатку конфігурація сервера Apache містилася в одному файлі /etc/httpd/conf/httpd.conf. З часом цей файл стає дедалі помітнішим і менш читабельним.

Таким чином, сучасні дистрибутиви мають тенденцію розповсюджувати конфігурацію Apache через ряд файлів *.conf у каталогах /etc/httpd/conf.d та /etc/httpd/conf.modules.d, приєднаних до основний файл /etc/httpd/conf/httpd.conf за допомогою директиви Include.

$ sudo grep "^Include" /etc/httpd/conf/httpd.conf
Include conf.modules.d/*.conf
IncludeOptional conf.d/*.conf

Файл /etc/httpd/conf/httpd.conf достатньо задокументований. Загалом цих коментарів достатньо, щоб прояснити можливості адміністратора.

Глобальна конфігурація сервера знаходиться в /etc/httpd/conf/httpd.conf.

Цей файл має три розділи для налаштування:

  • у розділі 1 глобальне середовище;
  • у розділі 2, сайт за замовчуванням і параметри віртуального сайту за замовчуванням;
  • у розділі 3 віртуальні хости.

Віртуальний хостинг дозволяє розмістити кілька віртуальних сайтів в Інтернеті на одному сервері. Потім сайти розрізняються за їхніми доменними іменами, IP-адресами тощо.

Зміна значення в розділі 1 або 2 впливає на всі розміщені сайти.

Тому в спільному середовищі модифікації знаходяться в розділі 3.

Для полегшення майбутніх оновлень настійно рекомендується створити файл конфігурації розділу 3 для кожного віртуального сайту.

Ось мінімальна версія файлу httpd.conf:

ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin root@localhost
<Directory />
    AllowOverride none
    Require all denied
</Directory>
DocumentRoot "/var/www/html"
<Directory "/var/www">
    AllowOverride None
    Require all granted
</Directory>
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
<Files ".ht*">
    Require all denied
</Files>
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>
<IfModule mime_module>
    TypesConfig /etc/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
    MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf

Секція 1

Директиви, які зустрічаються в розділі 1:

ОпціяОпис
ServerTokensЦя директива буде в наступному розділі.
ServertRootВказує шлях до каталогу, що містить усі файли, що утворюють сервер Apache.
TimeoutКількість секунд до закінчення часу надто довгого запиту (вхідного чи вихідного).
KeepAliveПостійне з'єднання (кілька запитів на TCP-з'єднання).
MaxKeepAliveRequestsМаксимальна кількість постійних підключень.
KeepAliveTimeoutКількість секунд для очікування наступного запиту клієнта перед закриттям TCP-з’єднання.
ListenДозволяє Apache прослуховувати певні адреси або порти.
LoadModuleЗавантажує додаткові модулі (менша кількість модулів = більша безпека).
IncludeВключає інші файли конфігурації сервера.
ExtendedStatusВідображає більше інформації про сервер у модулі стану сервера.
User та GroupДозволяє запускати процеси Apache різними користувачами. Apache завжди запускається як root, потім змінює власника та групу.
Багатопроцесні модулі (MPM)

Сервер Apache був розроблений як потужний і гнучкий, здатний працювати на різних платформах.

Різні платформи та середовища часто означають різну функціональність або використання інших методів для максимально ефективної реалізації тієї самої функціональності.

Модульний дизайн Apache дозволяє адміністратору вибирати, які функції включити на сервер, вибираючи, які модулі завантажувати під час компіляції або під час виконання.

Ця модульність також включає найпростіші функції веб-сервера.

Модулі Multi-Process Modules (MPM) відповідають за асоціацію з мережевими портами машини, приймають запити та розподіляють їх між різними дочірніми процесами.

Налаштування модулів MPM знаходиться у конфігураційному файлі /etc/httpd/conf.modules.d/00-mpm.conf:

# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines.  See the httpd.conf(5) man
# page for more information on changing the MPM.

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#
# NOTE: If enabling prefork, the httpd_graceful_shutdown SELinux
# boolean should be enabled, to allow graceful stop/shutdown.
#
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
LoadModule mpm_event_module modules/mod_mpm_event.so

Як бачите, MPM за замовчуванням — це mpm_event.

Продуктивність і можливості вашого веб-сервера значною мірою залежать від вибору MPM.

Вибір одного модуля над іншим є складним завданням, як і оптимізація обраного модуля MPM (кількість клієнтів, запитів тощо).

Конфігурація Apache за умовчанням передбачає помірну зайнятість служби (максимум 256 клієнтів).

Про директиви підтримки активності

Якщо директиву KeepAlive вимкнено, кожен запит ресурсу на сервері потребує відкриття TCP-з’єднання, що забирає багато часу з точки зору мережі та потребує багато системних ресурсів.

Якщо для директиви KeepAlive встановлено значення On, сервер зберігає з’єднання з клієнтом відкритим протягом дії KeepAlive.

Ця стратегія швидко виграє, оскільки веб-сторінка містить декілька файлів (зображення, таблиці стилів, Javascript тощо).

Однак важливо встановити це значення якомога точніше:

  • Занадто низьке значення покарає клієнта,
  • Занадто довге значення покарає ресурси сервера.

Значення KeepAlive для віртуальних хостів окремих клієнтів забезпечують більшу деталізацію для кожного клієнта. У цьому випадку встановлення значень KeepAlive відбувається безпосередньо у VirtualHost клієнта або на рівні проксі (ProxyKeepalive і ProxyKeepaliveTimeout).

Секція 2

Розділ 2 встановлює значення, які використовуються головним сервером. Головний сервер відповідає на всі запити, які не обробляє один із віртуальних хостів у розділі 3.

Значення також використовуються як значення за замовчуванням для віртуальних сайтів.

ОпціяОпис
ServerAdminвизначає адресу електронної пошти, яка з’являється на певних автоматично згенерованих сторінках, наприклад на сторінках помилок.
ServerNameвизначає ім'я, що ідентифікує сервер. Це може статися автоматично, але рекомендовано вказати це явно (IP-адреса або ім’я DNS).
DocumentRootвказує каталог, що містить файли для обслуговування клієнтів. Типовий /var/www/html/.
ErrorLogвказує шлях до файлу помилки.
LogLeveldebug, info, notice, warn, error, crit, alert, emerg.
LogFormatвизначає певний формат журналу. Завершено з директивою CustomLog.
CustomLogвказує шлях для доступу до файлу.
ServerSignatureвидно в охоронній частині.
Aliasвизначає каталог поза деревом і робить його доступним через контекст. Наявність або відсутність останньої косої риски в контексті важлива.
Directoryвизначає поведінку та права доступу до каталогу.
AddDefaultCharsetвизначає формат кодування для надісланих сторінок (символи з акцентами можна замінити на ?...).
ErrorDocumentналаштовує сторінки помилок.
server-statusзвіт про стан сервера.
server-infoзвіт про конфігурацію сервера.
Директива ErrorLog

Директива ErrorLog визначає журнал помилок для використання.

Ця директива визначає ім'я файлу, до якого сервер записує всі помилки, які він зустрічає. Якщо шлях до файлу не є абсолютним, припущення має бути відносним до ServerRoot.

Директива DirectoryIndex

Директива DirectoryIndex визначає домашню сторінку сайту.

Ця директива вказує ім'я файлу, який завантажується першим, який буде діяти як індекс сайту або домашня сторінка.

Синтаксис:

DirectoryIndex display-page

Повний шлях не вказано. Пошук файлу відбувається в каталозі, визначеному DocumentRoot.

Приклад:

DocumentRoot /var/www/html
DirectoryIndex index.php index.htm

Ця директива вказує назву файлу індексу веб-сайту. Індекс — це сторінка за замовчуванням, яка відкривається, коли клієнт вводить URL-адресу сайту (без необхідності вводити назву індексу). Цей файл має бути в каталозі, визначеному директивою DocumentRoot.

Директива DirectoryIndex може вказати кілька імен індексних файлів, розділених пробілами. Наприклад, сторінка покажчика за замовчуванням із динамічним вмістом і, як другий варіант, статична сторінка.

Директива Directory

Тег Directory використовується для визначення директив для каталогу.

Цей тег застосовує права до одного або кількох каталогів. Шлях до каталогу вводиться як абсолютний.

Синтаксис:

<Directory directory-path>
Defining user rights
</Directory>

Приклад:

<Directory /var/www/html/public>
    Require all granted   # we allow everyone
</Directory>

Розділ Directory визначає блок директив, що застосовуються до частини файлової системи сервера. Наведені тут директиви застосовуватимуться лише до вказаного каталогу (і підкаталогів).

Синтаксис цього блоку приймає символи підстановки, але краще використовувати блок DirectoryMatch.

У наступному прикладі ми збираємося заборонити доступ до локального жорсткого диска сервера, незалежно від клієнта. Каталог "/" представляє корінь жорсткого диска.

<Directory />
    Require all denied
</Directory>

У наступному прикладі показано авторизацію доступу до всіх каталогів публікації /var/www/html клієнтів.

<Directory /var/www/html>
    Require all granted
</Directory>

Коли сервер знаходить файл .htaccess, йому потрібно знати, чи директиви, розміщені у файлі, мають дозвіл змінювати існуючу конфігурацію. Директива AllowOverride керує авторизацією в директивах Directory. Якщо встановлено значення none, файли .htaccess повністю ігноруються.

The mod_status

mod_status відображає сторінку /server-status або /server-info, яка підсумовує статус сервера:

<Location /server-status>
    SetHandler server-status
    Require local
</Location>

<Location /server-info>
    SetHandler server-info
    Require local
</Location>

Зверніть увагу, що цей модуль надає інформацію, яка не повинна бути доступною для ваших користувачів.

Віртуальний хостинг (розділ 3)

За допомогою спільного хостингу клієнт думає, що відвідує кілька серверів. Насправді є лише один сервер і кілька віртуальних сайтів.

Щоб налаштувати загальний хостинг, вам потрібно налаштувати віртуальні хости:

  • оголошення кількох портів прослуховування
  • оголошення кількох прослуховуваних IP-адрес (віртуальний хостинг за IP)
  • оголошення кількох імен серверів (віртуальний хостинг за назвою)

Кожен віртуальний сайт відповідає окремій структурі дерева.

Розділ 3 файлу httpd.conf оголошує ці віртуальні хости.

Для полегшення майбутніх оновлень настійно рекомендується створити файл конфігурації розділу 3 для кожного віртуального сайту.

Виберіть віртуальний хостинг «по IP» або «по імені». Для виробничого використання не бажано змішувати два рішення.

  • Налаштування кожного віртуального сайту в незалежному конфігураційному файлі
  • VirtualHosts зберігаються в /etc/httpd/conf.d/
  • Розширення файлу .conf
Директива VirtualHost

Директива VirtualHost визначає віртуальні хости.

<VirtualHost IP-address[:port]>
    # if the "NameVirtualHost" directive is present
    # then "address-IP" must match the one entered
    # under "NameVirtualHost" as well as for "port".
 ...
 </VirtualHost>

Якщо ви налаштуєте сервер Apache за допомогою базових директив, наведених вище, ви зможете опублікувати лише один сайт. Дійсно, ви не можете опублікувати кілька сайтів із налаштуваннями за замовчуванням: однакова IP-адреса, однаковий TCP-порт і без імені або унікального імені хоста.

Віртуальні сайти дозволять нам публікувати кілька веб-сайтів на одному сервері Apache. Ви збираєтеся визначити блоки, кожен з яких описуватиме веб-сайт. Таким чином, кожен сайт матиме власну конфігурацію.

Веб-сайт часто асоціюється з одним комп’ютером для зручності розуміння. Віртуальні сайти або хости називаються так тому, що вони дематеріалізують зв’язок між машинами та веб-сайтами.

Приклад 1:

Listen 192.168.0.10:8080
<VirtualHost 192.168.0.10:8080>
  DocumentRoot /var/www/site1/
  ErrorLog /var/log/httpd/site1-error.log
</VirtualHost>

Listen 192.168.0.11:9090
<VirtualHost 192.168.0.11:9090>
  DocumentRoot /var/www/site2/
  ErrorLog /var/log/httpd/site2-error.log
</VirtualHost>

Віртуальний хостинг на основі IP застосовує спеціальні вказівки на основі IP-адреси та порту, на який отримано запит. Зазвичай це означає обслуговування різних веб-сайтів на різних портах або інтерфейсах.

Директива NameVirtualHost

Директива NameVirtualHost визначає віртуальні хости на основі імен.

Ця директива є обов’язковою для налаштування віртуальних хостів на основі імен. За допомогою цієї директиви ви вказуєте IP-адресу, на яку сервер отримуватиме запити від віртуальних хостів на основі імен.

Синтаксис:

NameVirtualHost adresse-IP[:port]

Приклад:

NameVirtualHost 160.210.169.6:80

Директива має стояти перед блоками опису віртуального сайту. Він визначає IP-адреси, які використовуються для прослуховування клієнтських запитів для віртуальних сайтів.

Щоб прослуховувати запити на всіх IP-адресах сервера, використовуйте символ *.

Врахування змін

Для кожної зміни конфігурації необхідно перезавантажувати конфігурацію за допомогою такої команди:

sudo systemctl reload httpd

Інструкція

Пакет під назвою «httpd-manual» містить сайт, який діє як посібник користувача Apache.

sudo dnf install httpd-manual
sudo systemctl reload httpd

Після встановлення ви можете отримати доступ до посібника за допомогою веб-браузера за адресою http://127.0.0.1/manual.

$ elinks http://127.0.0.1/manual

Команда apachectl

apachectl — це інтерфейс керування сервером для сервера httpd Apache.

Це дуже корисна команда з -t або configtest, яка запускає перевірку синтаксису файлу конфігурації.

Примітка

Це дуже корисно при використанні з обробниками Ansible для перевірки конфігурації.

Безпека

Захищаючи свій сервер брандмауером (що добре), вам, можливо, доведеться відкрити його.

sudo firewall-cmd --zone=public --add-service=http
sudo firewall-cmd --zone=public --add-service=https
sudo firewall-cmd --reload

SELinux

За замовчуванням, якщо захист SELinux активний, він запобігає читанню сайту з каталогу, відмінного від /var/www/.

Каталог, що містить сайт, повинен мати контекст безпеки httpd_sys_content_t.

Ви можете перевірити поточний контекст за допомогою команди:

* ls -Z /dir

Додайте контекст за допомогою такої команди:

sudo chcon -vR --type=httpd_sys_content_t /dir

Це також запобігає відкриттю нестандартного порту. Відкриття порту виконується вручну за допомогою команди semanage (не встановлено за замовчуванням).

sudo semanage port -a -t http_port_t -p tcp 1664

Директиви User та Group

Директиви User і Group визначають обліковий запис і групу керування Apache.

Історично root запускав Apache, що спричиняло проблеми з безпекою. Root завжди запускає Apache, але потім його ідентичність змінюється. Зазвичай користувач apache і група apache.

Ніколи ROOT!

Сервер Apache (процес httpd) запускається з облікового запису суперкористувача root. Кожен запит клієнта ініціює створення «дочірнього» процесу. Запуск цих дочірніх процесів відбувається з менш привілейованого облікового запису, щоб зменшити ризики.

Директиви User і Group оголошують обліковий запис і групу, які використовуються для створення дочірніх процесів.

Цей обліковий запис і група повинні існувати в системі (за замовчуванням це відбувається під час встановлення).

Права доступу до файлів

За загальним правилом безпеки вміст веб-сервера не має належати процесу, на якому виконується сервер. У нашому випадку файли не повинні належати користувачу та групі apache, оскільки вони мають доступ для запису до папок.

Ви призначаєте вміст непривілейованому користувачеві, користувачеві root і асоційованій групі. До речі, ви також використовуєте можливість обмежити права доступу групи.

cd /var/www/html
sudo chown -R root:root ./*
sudo find ./ -type d -exec chmod 0755 "{}" \;
sudo find ./ -type f -exec chmod 0644 "{}" \;

Author: Antoine Le Morvan

Contributors: Steven Spencer, Ganna Zhyrnova