Когда речь заходит об использовании операционной системы для веб-сервера, то, как правило, выбор ограничивается самыми распространёнными вариантами — Windows или одним из дистрибутивов Linux. Я хочу познакомить вас с ещё одной операционной системой, заслуживающей особого внимания — это OpenBSD.
Разработка OpenBSD началась в 1995 году, а спустя год вышел первый официальный релиз операционной системы. И с тех пор сообщество разработчиков радует нас стабильными релизами приблизительно каждые полгода. Под стабильными релизами я подразумеваю не столько периодичность выпусков новых версий, сколько стабильность самой операционной системы и поставляемых с ней прикладных программ. Это и неудивительно, ведь одними из основных целей проекта разработчики OpenBSD называют создание надёжных и безопасных программ, строгое следование и реализация стандартов, поддержка как можно большего числа аппаратных платформ и устройств, а также стремление сделать OpenBSD самой безопасной операционной системой.
Кроме того, к другим сильным сторонам OpenBSD пользователи относят:
Из недр сообщества разработчиков OpenBSD вышли также другие программы и системы, завоевавшие популярность в других операционных системах:
Изначально мы писали эту статью для OpenBSD 7.2, но позднее актуализировали для более новой версии — 7.3.
Если вы решили опробовать эту операционную систему для своего веб-сервера, воспользуйтесь этим руководством, и уже через несколько минут в вашем распоряжении будет виртуальный сервер с поддержкой HTTPS (через Let’s Encrypt) и установленным PHP.
В качестве платформы для нашего виртуального сервера мы будем использовать облако Timeweb Cloud. Если вы ещё не являетесь пользователем этой платформы, зарегистрируйте аккаунт.
Несмотря на то, что OpenBSD не поддерживается напрямую облачной платформой, то есть виртуальную машину с OpenBSD невозможно создать через панель управления, установить OpenBSD на виртуальную машину в облаке Timeweb Cloud всё же возможно. Для этого нам надо запустить виртуальную машину с… Ubuntu!
Мы будем использовать Ubuntu в качестве промежуточного звена для последующей установки OpenBSD на виртуальную машину. Создайте новый «чистый» облачный сервер и выберите в качестве операционной системы Ubuntu. Для этого на главной странице панели нажмите «Добавить» справа вверху. Дополнительные инструкции вы можете найти в документации.
После успешной настройки и установки виртуальной машины вам на электронную почту должно прийти письмо с параметрами доступа: IP-адресом и паролем пользователя root. Используйте эти данные для подключения к облачному серверу по протоколу SSH или через веб-консоль.
Для того, чтобы чтобы при следующей перезагрузке виртуальной машины, запустилась установка OpenBSD, а не загрузка Ubuntu, необходимо сделать следующее:
Установщик OpenBSD использует специальное ramdisk ядро (bsd.rd), которое создает live-среду, полностью загружаемую в память. Эта среда содержит установочные скрипты и небольшое количество утилит, необходимых для процесса установки. Скачаем его с «зеркала» Яндекса и сохраним в директорию /boot
:
wget https://mirror.yandex.ru/openbsd/7.3/amd64/bsd.rd -O /boot/bsd.rd
После этого нам необходимо внести изменения в два файла конфигурации загрузчика GRUB
:
/etc/grub.d/40_custom
нужно добавить:menuentry "bsd.rd" {
set root=(hd0,msdos1)
kopenbsd /boot/bsd.rd
}
/etc/default/grub
в качестве значения параметра GRUB_DEFAULT
необходимо указать только что созданный пункт меню:GRUB_DEFAULT="bsd.rd"
Далее необходимо выполнить команду update-grub
и перезагрузить виртуальную машину командой reboot
.
После перезагрузки запустится установщик операционной системы OpenBSD. Установку и первоначальную настройку мы будем производить в веб-консоли панели управления Timeweb Cloud, так как сервис sshd
ещё не запущен и подключение по протоколу SSH невозможно.
Операционная система OpenBSD отличается довольно простой процедурой установки — практически все значения, предлагаемые мастером установки, не требуют внесения изменений. Поэтому об установке OpenBSD часто шутят: «Несколько раз нажми Enter — и всё готово!»
После очередной перезагрузки облачного сервера будет запущена уже операционная система OpenBSD. Обратите внимание, что иконка сервера в панели по-прежнему будет отображать логотип Ubuntu — той системы, которая была установлена на сервер автоматически.
Теперь можно приступать к настройке.
Первым делом, необходимо установить обновления. Для этого надо выполнить команду syspatch
в консоли и еще раз перезагрузиться (командой reboot
), чтобы запустить обновленное ядро.
Для обеспечения взаимодействия панели управления Timeweb Cloud и нашей виртуальной машины, а так же для того, чтобы собирать статистику использования ресурсов нам необходимо установить и сконфигурировать два сервиса: QEMU Guest Agent и Zabbix.
QEMU Guest Agent — это программа-демон, которая запускается внутри виртуальной машины для помощи в управлении. В OpenBSD эта программа устанавливается командой:
pkg_add qemu-ga
Затем надо отредактировать конфигурационный файл /etc/qemu/qemu-ga.conf
так, чтобы он выглядел следующим образом:
[general]
method=isa-serial
path=/dev/cua00
После этого, запустим сервис командой:
rcctl start qemu_ga
И добавим его в автозагрузку:
rcctl enable qemu_ga
Zabbix — это система мониторинга с открытым исходным кодом. Что установить программу-агент Zabbix в OpenBSD, нужно выполнить команду:
pkg_add zabbix-agent
Конфигурационный файл агента, расположенный в /etc/zabbix/zabbix_agentd.conf
, должен содержать следующее:
Server=92.53.116.12,92.53.116.111,92.53.116.119
StartAgents=3
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogType=system
DebugLevel=3
AllowRoot=0
Timeout=30
DenyKey=system.run[*]
UserParameter=timeweb_config_version,echo 127
Запуск и автозагрузка сервиса осуществляется командами:
rcctl start zabbix_agentd
rcctl enable zabbix_agentd
Виртуальная машина с установленной и настроенной операционной системой — это, конечно, хорошо, но пользы от такого сервера мало. Для того, чтобы наш облачный сервер начал приносить пользу, давайте настроим его так, чтобы на нём можно было разместить простой статический сайт.
За отдачу статического контента по протоколу HTTP в OpenBSD отвечает веб-сервер httpd
. Его не нужно устанавливать, он идёт в базовой установке операционной системы.
Другие популярные веб-серверы (Apache, NGINX) можно установить из пакетов. Информация об их установке и настройке выходит за рамки этого руководства.
Давайте создадим файл /var/www/htdocs/index.html
следующего содержания:
<h1>Hello, OpenBSD!</h1>
Конфигурационный файл веб-сервера должен находиться в /etc/httpd.conf
. Изначально он отсутствует, его следует создать и записать в нём следующее:
server "default" {
listen on egress port http
}
Добавим веб-сервер в автозагрузку и запустим его:
rcctl enable httpd
rcctl start httpd
Если набрать в браузере IP-адрес нашей виртуальной машины (узнать его можно в панели управления или из письма об изначальной установке), то вы должны увидеть приветствие, которое мы предварительно создали.
Обращение к сайту по IP-адресу и по протоколу HTTP хоть и возможно, но не совсем удобно. Давайте внесем изменения в конфигурацию так, чтобы наш сайт-приветствие открывался на домене и через защищённое соединение HTTPS.
Первым делом нам необходимо зарегистрировать новый домен или внести изменения в настройку DNS-зон уже существующего домена так, чтобы A-запись указывала на IP-адрес нашей виртуальной машины. В панели управления доменами облачной платформы Timeweb Cloud это можно сделать в разделе «Домены». В случае возникновения вопросов изучите справочную информацию или обратитесь в службу поддержки. После внесения изменений в DNS-записи домена должно пройти какое-то время, пока записи обновятся на серверах имен. Рекомендую воспользоваться сервисом DNS Propagation Checker для получения информации.
Далее, мы будем использовать www.example.com в качестве доменного имени. Замените его на ваше доменное имя в конфигурационных параметрах.
Let’s Encrypt — некоммерческий Центр сертификации, предоставляющий сертификаты TLS — использует ACME-протокол для подтверждения прав на доменное имя, а также для выпуска сертификата для него. Чтобы получить сертификат Let’s Encrypt, необходимо использовать ACME-клиент. В OpenBSD он так и называется acme-client
и входит в базовую установку операционной системы.
Прежде чем начать конфигурацию acme-client
, внесем необходимые изменения в конфигурацию веб-сервера в файле /etc/httpd.conf
. Файл должен выглядеть, как показано ниже:
server "www.example.com" {
listen on egress port http
alias "example.com"
root "/"
location "/.well-known/acme-challenge/*" {
request strip 2
root "/acme"
}
location * {
block return 301 "https://www.example.com$REQUEST_URI"
}
}
server "www.example.com" {
listen on lo port https
log style forwarded
}
types {
include "/usr/share/misc/mime.types"
}
Проверим, что в конфигурационном файле веб-сервера нет ошибок или опечаток:
httpd -n
Создадим конфигурационный файл /etc/acme-client.conf
:
authority letsencrypt {
api url "https://acme-v02.api.letsencrypt.org/directory"
account key "/etc/acme/letsencrypt-privkey.pem"
}
domain www.example.com {
alternative names { example.com }
domain key "/etc/ssl/private/www.example.com.key"
domain full chain certificate "/etc/ssl/www.example.com.fullchain.pem"
sign with letsencrypt
}
Теперь, когда мы внесли изменения в конфигурационный файл веб-сервера и создали конфигурацию для клиента ACME, пришло время перезапустить веб-сервер и запросить сертификат:
rcctl restart httpd
acme-client www.example.com
Команды должны выполниться без ошибок. Проверим, что файл сертификата действительно создан:
ls /etc/ssl/www.example.com.fullchain.pem
Сгенерируем сертификат в формате OCSP из формата PEM:
ocspcheck -No /etc/ssl/www.example.com.ocsp /etc/ssl/www.example.com.fullchain.pem
Срок действия сертификата на ваш домен в формате PEM истекает через 90 дней, а его ответ в формате OCSP — через неделю. Для того, чтобы автоматизировать процесс обновления сертификатов, добавьте следующий скрипт в файл /etc/daily.local
, и тогда проверки валидности сертификата будут проходить ежедневно, сертификаты будут обновляться при необходимости:
#!/bin/ksh
dir=/etc/ssl
domain=www.example.com
/usr/sbin/acme-client $domain
if [ $? -eq 0 ] ; then
/usr/sbin/ocspcheck -No $dir/$domain.ocsp $dir/$domain.fullchain.pem
/usr/sbin/rcctl restart relayd
fi
/usr/sbin/ocspcheck -i $dir/$domain.ocsp $dir/$domain.fullchain.pem
if [ $? -eq 1 ] ; then
/usr/sbin/ocspcheck -No $dir/$domain.ocsp $dir/$domain.fullchain.pem
/usr/sbin/rcctl restart relayd
fi
exit 0
relayd
— это балансировщик нагрузки, шлюз уровня приложения, прозрачный прокси, SSL/TLS-шлюз. Именно он (в связке с веб-сервером httpd
) отвечает за HTTPS-соединение. Создадим конфигурационный файл /etc/relayd.conf
следующего содержания:
log state changes
log connection
prefork 10
table <www> { 127.0.0.1 }
http protocol "https" {
tls keypair "www.example.com"
return error
match request header set "X-Forwarded-For" value "$REOTE_ADDR"
match request header set "X-Forwarded-Port" value "$REMOTE_PORT"
match method GET tag ok
match method HEAD tag ok
block
pass tagged ok forward to <www>
}
relay "https" {
listen on egress port https tls
protocol "https"
forward to <www> port https
}
Маска файлов, по которой relayd
ищет сертификаты и файлы ключей, подразумевает, что один и тот же сертификат может использоваться на разных портах. Самый простой способ удовлетворить этому требованию — использовать символьные ссылки:
cd /etc/ssl
ln -s www.example.com.fullchain.pem www.example.com:443.crt
ln -s www.example.com.ocsp www.example.com:443.ocsp
cd private
ln -s www.example.com.key www.example.com:443.key
Проверим конфигурацию relayd
на корректность:
relayd -n
Теперь можно запустить relayd
:
rcctl enable relayd
rcctl start relayd
Теперь наш сайт-приветствие открывается по домену и по протоколу HTTPS:
Для некоторых задач простого веб-сервера, пусть даже и с поддержкой HTTPS, может быть недостаточно. Нужна поддержка серверных языков программирования. И такое возможно настроить в OpenBSD. Рассмотрим на примере языка PHP.
Первым делом установим пакет PHP:
pkg_add php
На выбор будет предложена установка одной из нескольких версий. В моём случае это были php-8.0.28p1, php-8.1.19 и php-8.2.6. Я выбрал последнюю, так как это версия с самым долгим сроком поддержки.
Вместе с пакетом php также был установлен менеджер процессов FastCGI (FPM). Давайте добавим этот сервис в автозагрузку и запустим его:
rcctl enable php82_fpm
rcctl start php82_fpm
Теперь нам надо добавить обработку PHP-скриптов на стороне веб-сервера httpd
. Для это отредактируем конфигурационный файл /etc/httpd
и изменим вторую запись server
так, чтобы она выглядела следующим образом:
server "www.example.com" {
listen on lo port https
log style forwarded
location "*.php" {
fastcgi socket "/run/php-fpm.sock"
}
}
Не забудьте перезапустить веб-сервер после внесения изменений в файл конфигурации:
rcctl restart httpd
Пора проверить, как работают PHP-скрипты в нашей конфигурации. Создайте файл /var/www/htdocs/info.php
следующего содержания:
<?php phpinfo(); ?>
При переходе на страницу info.php
на нашем домене должна появиться информация об установленной версии PHP:
В этом материале мы познакомились с операционной системой OpenBSD. С помощью данной инструкции можно установить операционную систему на облачный сервер Timeweb Cloud, а также произвести базовую настройку веб-сервера для размещения сайта с поддержкой PHP. Помимо этого сервер так же работает по защищенному протоколу HTTPS и использует для этого сертификат Let’s Encrypt. Конфигурация сервера позволяет обновлять сертификат автоматически.
Статья обновлена 30.05.2023
полезная инструкция. и услуги- огонь! жаль, что ваши фсбешные связи всё перечёркивают. что ж, буду искать дальше :
ps: успехов вам, конечно, желать не стану :D
Здравствуйте! Спасибо за комплимент по поводу сервиса и инструкции. Кураторам из ФСБ передадим, что вы нас раскрыли. Жаль, что вы не пожелали нам успеха - боимся, что это скажется на работе компании и прибыли в этом году. Переживаем.
Спасибо! Уже несколько раз воспользовался!
Очень круто! Спасибо!!!
Спасибо за фидбэк, очень рады, что вам понравилась инструкция 🙂