Как мы уже говорили, веб-сервер обычно состоит из трёх компонентов: собственно веб-сервера, обработчика PHP и базы данных. С неё и начнём.
pkg_add mariadb-server
Сервер баз данных установлен, теперь его надо развернуть. MariaDB - форк MySQL и у нас в системе появился новый пользователь с именем _mysql
Развёртываем базы данных - под этим пользователем, разумеется.
mysql_install_db --user=mysql
Правим /etc/my.cnf (сохраняем предыдущую версию)
cd /etc && mv my.cnf my.cnf.orig && mcedit my.cnf
[client-server]
socket=/var/run/mysql/mysql.sock
[client]
default-character-set=utf8mb4
[mysqld]
bind-address=localhost
data=/var/mysql
log-basename=mysqld
general-log
slow_query_log
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
lc_messages=ru_RU
lc_time_names=ru_RU
Теперь обезопасим себя (потому и сокет пока такой)
rcctl start mysqld && mysql_secure_installation
Сервер без пароля - задаём новый пароль (как всегда два раза), на все другие вопросы тоже даём положительный ответ.
Теперь нюансы (да, дьявол кроется в деталях). Во-первых, в составе OpenBSD УЖЕ есть вебсервер. Во-вторых, OpenBSD довольно защищённая система и многие её демоны запускаются в chroot. И пользователь www в ней уже есть. Путь по умолчанию для вебсервера (и заодно обработчика PHP) /var/www - но постойте, как же тогда PHP получит доступ к MariaDB?
Есть два пути. Первый, небезопасный - запускать MariaDB на сетевом интерфейсе. Второй интереснее - поместить файл сокета MariaDB в папку /var/www. Итак, правим /etc/my.cnf:
[client-server]
socket=/var/www/run/mysql/mysql.sock
То есть мы поместили его не в /var/run, а в /var/www/run
Теперь перезапустим MariaDB
rcctl restart mysqld
Заходим консольным клиентом на сервер (вводим пароль)
mysql -u root -p
и проверяем список баз:
show databases;
и переменные кодировки:
show variables like 'char%';
show variables like 'collation%';
Выходим из консоли, набрав exit или нажав Ctrl+D Всё, наш сервер баз данных работает и поддерживает русскую кодировку utf8mb4. Осталось сделать так, чтобы при перезапуске системы он запускался сам и нам не пришлось бы запускать его самостоятельно. Правим pkg_scripts в уже знакомом нам файле /etc/rc.conf
pkg_scripts="mysqld"
Настройка MariaDB завершена.
Ставим php. У нас их три варианта (8.1 8.2 8.3) - какой ставить? Лично я выбрал, предварительно установив pear-utils (и pear конечно). PEAR - PHP Extension and Application Repository Он поставился вместе с php-8.2 - его и поставим
pkg_add pecl82-imagick pecl82-lzf pecl82-mailparse pecl82-mcrypt pecl82-memcached pecl82-pledge pecl82-raphf pecl82-redis pecl82-ssh2 pecl82-xdebug
pkg_add php-bz2 php-curl php-gd php-gmp php-intl php-mysqli php-pdo_mysql php-xsl php-zip
Обратите внимание, что во второй команде мы всегда ставим цифру 2 при выборе - другие версии нам пока ставить нельзя. Почему я выбираю всё? Я не знаю, какой сайт у вас будет и какие возможности потребуются, поэтому беру по максимуму. Когда вы будете более опытными, можете выбирать только те компоненты, которые вам понадобятся.
Перенесём все файлы из папки /etc/php-8.2.sample
в папку /etc/php-8.2
Теперь правим файлы (и папки) настройки:
mv php-fpm.conf php82-fpm.conf && mv php-fpm.d php82-fpm.d
и редактируем php-8.2.ini
в нём нам требуется изменить три строки:
cgi.fix_pathinfo=0
pdo_mysql.default_socket = run/mysql/mysql.sock
mysqli.default_socket = run/mysql/mysql.sock
Обратите внимание, мы не пишем в пути /var/www - потому что это будет работать уже в chroot
Теперь правим php82-fpm.conf - собственно, правка заключается в замене php-fpm на php82-fpm везде. Проверяем:
grep php82-fpm php82-fpm.conf
pid = run/php82-fpm.pid
error_log = log/php82-fpm.log
syslog.ident = php82-fpm
include=/etc/php82-fpm.d/*.conf
listen = /var/www/run/php82-fpm.sock
Вот теперь можно ставить другие версии PHP - теперь они не пересекаются по файлам и не будут писать в одни и те же файлы.
Теперь поправим скрипт запуска, добавив к нему строку
-y /etc/php82-fpm.conf
mcedit /etc/rc.d/php82_fpm
И пробуем запустить:
rcctl start php82_fpm
Традиционно правим pkg_scripts (который, напомню, отвечает за автозапуск демонов) в файле /etc/rc.conf
pkg_scripts="mysqld php82_fpm"
В принципе всё, так как мы можем использовать httpd, который входит в состав системы, но мы пойдём другим, более длинным путём. Ставим nginx
pkg_add nginx
Создаём папку /etc/nginx/conf.d - туда мы будем класть дополнительные конфигурации для отдельных сайтов. Правим основной файл nginx.conf
mkdir /etc/nginx/conf.d
cd /etc/nginx
cp nginx.conf nginx.conf.orig
mcedit nginx.conf
Файл длинный, поэтому просто приведу его здесь без комментариев:
user www;
worker_processes 1;
#load_module "modules/ngx_stream_module.so";
error_log logs/error.log notice;
pid logs/nginx.pid;
worker_rlimit_nofile 1024;
events {
worker_connections 800;
}
http {
include mime.types;
default_type application/octet-stream;
index index.html index.htm;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
server_tokens off;
server {
listen wwwx:80;
server_name wwwx;
root /var/www/html;
charset utf-8;
access_log logs/wwwx.access.log main;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/html;
}
location ~ \.php$ {
try_files $uri $uri/ =404;
fastcgi_pass unix:run/php82-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
include "/etc/nginx/conf.d/*.conf";
}
В принципе мануалов по настройке nginx полно, так что с этим тоже можно справиться. Обратите внимание на несколько моментов:
charset - задаём кодировку отдаваемого контента.
fastcgi_pass unix:run/php82-fpm.sock; - мы изменили имя файла сокета для подключения к PHP
include - в этой строке мы задаём путь, где будут лежать дополнительные конфигурации для сайтов.
/var/www/htdocs мы везде поменяли на /var/www/html - там лежит начальная страница nginx.
в /etc/rc.conf
pkg_scripts="mysql php82_fpm nginx"
и наконец
rcctl start nginx
Заходим по адресу http://wwwx и видим:
А если у вас внешняя статика и вы пробросили порт с роутера на виртуалку или вообще подняли OpenBSD на VDS, то чтобы браузеры не писали "не защищено", надо подсунуть nginx сертификат для сайта. Получить его можно за денежку или бесплатный от LetsEncrypt. Для второго случая установите certbot
pkg_add certbot
Проверка php! Создаём в папке /var/www/html файлик test.php с таким содержанием:
<?php phpinfo(); ?>
Переходим на страницу http://wwwx/test.php и наблюдаем:
Не забудьте поправить /etc/rc.conf
pkg_scripts="mysqld php82_fpm nginx"
На этом мы завершаем нашу третью часть.