Придерживайтесь этого человека и самостоятельно разместите свой собственный веб-сервер

Придерживайтесь этого человека и самостоятельно разместите свой собственный веб-сервер

20 февраля 2023 г.

Для кого это руководство?

Размещение веб-контента на собственном хостинге актуально для малых и средних компаний, владельцев бизнеса, некоммерческих организаций и частных лиц.

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

Почему самостоятельный хостинг?

Существует множество причин, по которым самостоятельный хостинг выгоден, вот некоторые из них:

* Конфиденциальность * Повышенная безопасность * Настройка * Снижение затрат

Хостинг электронной почты

Эта статья посвящена хостингу веб-серверов. Если вас интересует хостинг электронной почты, прочитайте статью на Размещение собственного почтового сервера.

Предпосылки

  • Новый сервер, выделенный или виртуальный, с доступом в Интернет.
  • Распределение Linux на базе RHEL: Alma, Rocky, Oracle или Fedora Server
  • Корневой доступ

Имя хоста сервера

Убедитесь, что ваш сервер имеет полное доменное имя (FQDN), а в файле /etc/hosts IP-адрес сервера указывает на полное доменное имя, а не на короткое имя. Это требование для некоторых инструментов, таких как OpenDKIM, которые не будут работать без полного доменного имени.

Чтобы проверить, правильно ли настроено ваше полное доменное имя, выполните:

# hostname -f
server.example.tld

Если вы видите только имя сервера, а не полное доменное имя, используйте команду systemd hostnamectl, чтобы установить свое полное доменное имя:

# hostnamectl set-hostname server.example.tld

Шаг 1. Необходимые пакеты

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

dnf для новых версий EL8/EL9:

# dnf install php php-cli php-pdo php-mbstring epel-release unzip wget

ням для EL7:

# yum install php php-cli php-pdo php-mbstring epel-release unzip wget

для Fedora пакеты немного отличаются:

# dnf install php php-cli php-pdo php-mbstring unzip wget

Шаг 2. Установите Aetolos

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

# wget -O /root/master.zip 'https://gitlab.com/noumenia/aetolos/-/archive/master/aetolos-master.zip'
# unzip /root/master.zip -d /root/
# mv /root/aetolos-master /root/aetolos
# rm -rf /root/master.zip

:::подсказка Последний код разработки можно загрузить из репозитория git:

git clone 'https://gitlab.com/noumenia/aetolos.git'

:::

Шаг 3. Включите службы

Теперь пришло время выбрать, какие услуги будет предоставлять сервер. Запустите Aetolos с параметром состояния, чтобы получить представление обо всех доступных службах:

# ~/aetolos/aetolos --status
+---------+--------------+---------+------------+--------------+
| Enabled | Module       | SystemD | Repository | Dependencies |
+---------+--------------+---------+------------+--------------+
| [ ]     | apache       |         |            |              |
| [ ]     | clamav       |         | epel       | postfix      |
| [ ]     | dehydrated   |         |            |              |
| [ ]     | dovecot      |         |            |              |
| [ ]     | haproxy      |         |            |              |
| [ ]     | mariadb      |         |            |              |
| [ ]     | mtasts       |         |            | apache       |
| [ ]     | nsd          |         | epel       |              |
| [ ]     | opendkim     |         | epel       | postfix      |
| [ ]     | opendmarc    |         | epel       | postfix      |
| [✓]     | php          |         |            |              |
| [ ]     | postfix      |         |            |              |
| [ ]     | postgrey     |         | epel       | postfix      |
| [ ]     | spamassassin |         |            | postfix      |
| [✓]     | virtualhost  |         |            |              |
+---------+--------------+---------+------------+--------------+

Поскольку это будет самостоятельный веб-сервер, мы включим службы, предоставляющие нам полный набор функций для веб-хостинга:

* Apache, веб-сервер для ответов на запросы ACME. * Dehydrated, bash-скрипт для сертификатов Let’s Encrypt * MariaDB, база данных

:::предупреждение Если у вас есть отдельный сервер для электронной почты с подписями DKIM, вы также должны включить OpenDKIM на этом сервере. Затем поделитесь ключом между серверами для правильной подписи.

:::

Давайте включим эти службы с помощью Aetolos:

# ~/aetolos/aetolos --enable=apache
# ~/aetolos/aetolos --enable=dehydrated
# ~/aetolos/aetolos --enable=mariadb

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

+---------+--------------+---------+------------+--------------+
| Enabled | Module       | SystemD | Repository | Dependencies |
+---------+--------------+---------+------------+--------------+
| [✓]     | apache       | dead    |            |              |
| [ ]     | clamav       |         | epel       | postfix      |
| [✓]     | dehydrated   |         |            |              |
| [ ]     | dovecot      |         |            |              |
| [ ]     | haproxy      |         |            |              |
| [✓]     | mariadb      | dead    |            |              |
| [ ]     | mtasts       |         |            | apache       |
| [ ]     | nsd          |         | epel       |              |
| [ ]     | opendkim     |         | epel       | postfix      |
| [ ]     | opendmarc    |         | epel       | postfix      |
| [✓]     | php          | dead    |            |              |
| [ ]     | postfix      |         |            |              |
| [ ]     | postgrey     |         | epel       | postfix      |
| [ ]     | spamassassin |         |            | postfix      |
| [✓]     | virtualhost  |         |            |              |
+---------+--------------+---------+------------+--------------+

Обратите внимание на столбец SystemD, в котором большинство служб указано как мертвые. Это не проблема, поскольку мы еще не настроили/не запустили эти службы.

Шаг 4. Настройка

Наконец, мы можем запустить программу установки Aetolos, чтобы установить необходимые пакеты RPM и сгенерировать все файлы конфигурации. Мы предпочитаем видеть подробный вывод с дополнительным параметром --verbose.

Вы заметите предупреждение об обезвоженном сценарии, в котором нам предлагается указать адрес электронной почты для регистрации в Let’s Encrypt

# ~/aetolos/aetolos --verbose --setup
[DEBUG] Check running system
[DEBUG] Detected: AlmaLinux 8.7 (Stone Smilodon)
[DEBUG] Check system memory
[DEBUG] Detected: 460MiB
[DEBUG] Check CPU cores
[DEBUG] Detected: 2
[DEBUG] Check proxy
[DEBUG] Loading Aetolos configuration
[DEBUG] Starting operating system setup
[DEBUG] Checking repository dependencies
[DEBUG] Checking package dependencies
[DEBUG] Installing package: php-fpm
[DEBUG] Checking SELinux requirements
[DEBUG] SELinux: enable httpd_can_network_connect
[DEBUG] SELinux: enable httpd_can_sendmail
[DEBUG] SELinux: enable httpd_read_user_content
[DEBUG] SELinux: enable httpd_enable_homedirs
[DEBUG] SELinux: enable httpd_home_tmp_aetolos.pp
[DEBUG] Checking certificate requirements
[DEBUG] Generating a self-signed certificate
[DEBUG] Certificate: /etc/pki/tls/certs/localhost.crt
[DEBUG] Fullchain: /etc/pki/tls/certs/localhost.fullchain
[DEBUG] Key: /etc/pki/tls/private/localhost.key
[DEBUG] Checking ACME client
[DEBUG] Downloading ACME client: dehydrated 0.7.1
[DEBUG] Installing ACME client under: /root/dehydrated/
[WARNING] ACME registration email set to: postmaster
[WARNING] Please change the ACME registration email by executing: '/root/aetolos/aetolos --verbose --module=dehydrated --registration-email=new-email'
[DEBUG] Checking module dependencies
[DEBUG] Save configuration: apache
[DEBUG] Writing to file: /etc/httpd/conf/httpd.conf
[DEBUG] Writing to file: /etc/httpd/conf.d/ssl.conf
[DEBUG] Writing to file: /etc/sysconfig/htcacheclean
[INFO] System memory: 460MB
[INFO] Allocate 50% of system memory to MariaDB: 230MB
[INFO] 70% of the above usage goes to total thread memory: 161MB
[INFO] The rest 30% goes to server buffers: 69MB
[INFO] MariaDB memory per connection: 18MB
[INFO] MariaDB max connections: 10
[INFO] MariaDB temporary table size: 16MB
[INFO] MariaDB query cache: 16MB
[INFO] Allocate 40% of system memory to Apache/PHP-FPM: 184MB
[INFO] Estimated average number of connections per CPU core: 9
[INFO] Apache StartServers: 1
[INFO] Apache ServerLimit: 2
[INFO] Apache ThreadsPerChild: 18
[INFO] Apache MinSpareThreads: 18
[INFO] Apache ThreadLimit: 22
[INFO] Apache MaxRequestWorkers: 36
[INFO] Apache maximum number of concurrent connections: 108
[DEBUG] Writing to file: /etc/logrotate.d/httpd
[DEBUG] Save configuration: dehydrated
[DEBUG] Writing to file: /root/dehydrated/config
[DEBUG] Writing to file: /root/dehydrated/hook.sh
[DEBUG] Writing to file: /etc/pki/letsencrypt/domains.txt
[DEBUG] Writing to file: /etc/cron.daily/dehydrated.cron
[DEBUG] Save configuration: mariadb
[DEBUG] Writing to file: /etc/systemd/system/mariadb.service.d/limitnofile.conf
[DEBUG] Writing to file: /etc/my.cnf.d/mariadb-server.cnf
[DEBUG] Save configuration: php
[DEBUG] Writing to file: /etc/php.ini
[DEBUG] Writing to file: /etc/php.d/10-opcache.ini
[DEBUG] Save configuration: virtualhost
[DEBUG] Writing to file: /etc/tmpfiles.d/hometmp.conf
[DEBUG] Reloading systemd

В соответствии с предупреждением мы добавляем адрес электронной почты для Let’s Encrypt:

# ~/aetolos/aetolos --verbose --module=dehydrated --registration-email=postmaster@example.tld

Запустить MariaDB

В отличие от других сервисов, MariaDB должен быть запущен и работать, чтобы Aetolos мог добавить виртуальные хосты и соответствующие разрешения для базы данных. Итак, давайте включим и запустим MariaDB:

# systemctl --now enable mariadb

На этом этапе мы можем защитить экземпляр MariaDB, запустив:

/usr/bin/mysql_secure_installation

Для этого необходимо также создать файл /root/.my.cnf с данными для входа в систему для пользователя root:

[client]
default-character-set="utf8mb4"
user="root"
password='the_password_set_in_the_previous_step'

Добавить виртуальные хосты

Теперь мы готовы добавить столько виртуальных хостов, сколько захотим (или столько, сколько может обработать сервер).

Прежде чем запускать какие-либо команды, мы можем подумать, какие виртуальные хосты будут иметь субдомен префикса, иногда у нас может быть домен, такой как example.tld, с субдоменом www (www.example.tld), в других случаях мы можем не захотеть используйте префикс, потому что нам нужны адреса электронной почты только в верхнем домене (user@example.tld, а не user@www.example.tld).

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

# ~/aetolos/aetolos --verbose --module=virtualhost --add-virtualhost=example1.tld --no-prefix
[DEBUG] Verify domain: example1.tld
[DEBUG] Add virtual host: example1.tld
# ~/aetolos/aetolos --verbose --module=virtualhost --add-virtualhost=example2.tld --no-prefix
[DEBUG] Verify domain: example2.tld
[DEBUG] Add virtual host: example2.tld
# ~/aetolos/aetolos --verbose --module=virtualhost --add-virtualhost=example3.tld
[DEBUG] Verify domain: example3.tld
[DEBUG] Add virtual host: example3.tld

Теперь мы можем перечислить все виртуальные хосты:

# ~/aetolos/aetolos --module=virtualhost --list-virtualhosts
+----+---------------------+--------------+-------------+----------------+--------+--------------+
| ID | Timestamp           | Virtual host | System user | MariaDB prefix | Parked | Prefix alias |
+----+---------------------+--------------+-------------+----------------+--------+--------------+
| 1  | 2023-01-10 08:51:36 | example1.tld | example1tld | example1       | [ ]    |              |
| 2  | 2023-01-10 08:51:40 | example2.tld | example2tld | example2       | [ ]    |              |
| 3  | 2023-01-10 08:51:45 | example3.tld | example3tld | example3       | [ ]    | www          |
+----+---------------------+--------------+-------------+----------------+--------+--------------+

Каждый виртуальный хост будет «жить» изолированно в своем собственном домашнем каталоге со своим собственным пользователем/группой, поэтому давайте взглянем на наш /home:

# ls -la /home
total 0
drwxr-xr-x.  5 root        root         63 Jan 20 10:51 .
dr-xr-xr-x. 17 root        root        224 Dec 21  2021 ..
drwx--x--x.  8 example1tld example1tld 159 Jan 10 08:51 example1tld
drwx--x--x.  8 example2tld example2tld 159 Jan 10 08:51 example2tld
drwx--x--x.  8 example3tld example3tld 159 Jan 10 08:51 example3tld

Настройка

После того, как мы внесли изменения с помощью команды Aetolos, нам нужно сгенерировать новые файлы конфигурации для всех соответствующих служб (Apache, PHP-FPM, Dehydrated и т. д.). Таким образом, мы выполняем настройку Aetolos в последний раз.

# ~/aetolos/aetolos --setup

Сертификаты TLS

На этом этапе все службы будут использовать один и тот же самозаверяющий сертификат, поэтому сейчас самое время выполнить обезвоживание вручную, чтобы собрать все сертификаты виртуального хоста. Поскольку Aetolos использует протокол ACME с проверкой домена через HTTP-порт 80, мы сначала запускаем наш сервер Apache для обслуживания этих запросов.

# systemctl start httpd
# ~/dehydrated/dehydrated --cron --config /root/dehydrated/config --keep-going
# systemctl stop httpd
# ~/aetolos/aetolos --setup

Услуги

Теперь мы можем включить и запустить все службы.

# systemctl --now enable httpd httpd@example1.tld httpd@example2.tld httpd@example3.tld mariadb php-fpm
Created symlink /etc/systemd/system/multi-user.target.wants/httpd@example1.tld.service → /usr/lib/systemd/system/httpd@.service.
Created symlink /etc/systemd/system/multi-user.target.wants/httpd@example2.tld.service → /usr/lib/systemd/system/httpd@.service.
Created symlink /etc/systemd/system/multi-user.target.wants/httpd@example3.tld.service → /usr/lib/systemd/system/httpd@.service.

Вы заметите, что у каждого виртуального хоста есть собственная служба Apache, это функция, предоставляемая systemd, которая позволяет нам определять виртуальные хосты как отдельные службы systemd. Параметр --now запустит все службы.

Архитектура

Следует особо упомянуть об архитектуре, используемой для размещения веб-сайтов. Из соображений безопасности каждый виртуальный хост изолирован внутри учетных записей unix, хранящихся в собственном каталоге /home. Общедоступный веб-контент должен храниться в каталоге public_html.

/home/example1tld                               -> virtual host home
/home/example1tld/etc                           -> email accounts
/home/example1tld/mail                          -> email storage
/home/example1tld/public_html                   -> web content
/home/example1tld/www                           -> symbolic link to public_html
/home/example1tld/tmp                           -> temp directory

Этолос

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

Кредиты

Фото статьи Мануэля Гайссингера с сайта pexels


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE