Придерживайтесь этого человека и самостоятельно разместите свой собственный веб-сервер
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
Оригинал