Найти в Дзене

Опёнок, часть третья. Разворачиваем веб-сервер на OpenBSD.

Как мы уже говорили, веб-сервер обычно состоит из трёх компонентов: собственно веб-сервера, обработчика 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 Сервер без пароля - задаём новый пароль (как всегда два раза), на все другие вопросы

Как мы уже говорили, веб-сервер обычно состоит из трёх компонентов: собственно веб-сервера, обработчика PHP и базы данных. С неё и начнём.

pkg_add mariadb-server

Вместе с сервером БД ставятся и прочие зависимости, включая клиента.
Вместе с сервером БД ставятся и прочие зависимости, включая клиента.

Сервер баз данных установлен, теперь его надо развернуть. MariaDB - форк MySQL и у нас в системе появился новый пользователь с именем _mysql

Развёртываем базы данных - под этим пользователем, разумеется.

mysql_install_db --user=mysql

-2

Правим /etc/my.cnf (сохраняем предыдущую версию)

cd /etc && mv my.cnf my.cnf.orig && mcedit my.cnf

-3
[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

Сервер без пароля - задаём новый пароль (как всегда два раза), на все другие вопросы тоже даём положительный ответ.

-4

Теперь нюансы (да, дьявол кроется в деталях). Во-первых, в составе 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;

-5

и переменные кодировки:

show variables like 'char%';

show variables like 'collation%';

-6

Выходим из консоли, набрав 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 при выборе - другие версии нам пока ставить нельзя. Почему я выбираю всё? Я не знаю, какой сайт у вас будет и какие возможности потребуются, поэтому беру по максимуму. Когда вы будете более опытными, можете выбирать только те компоненты, которые вам понадобятся.

-7

Перенесём все файлы из папки /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
-8

Вот теперь можно ставить другие версии PHP - теперь они не пересекаются по файлам и не будут писать в одни и те же файлы.

Теперь поправим скрипт запуска, добавив к нему строку

-y /etc/php82-fpm.conf

mcedit /etc/rc.d/php82_fpm

-9

И пробуем запустить:

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 и видим:

-10

А если у вас внешняя статика и вы пробросили порт с роутера на виртуалку или вообще подняли OpenBSD на VDS, то чтобы браузеры не писали "не защищено", надо подсунуть nginx сертификат для сайта. Получить его можно за денежку или бесплатный от LetsEncrypt. Для второго случая установите certbot

pkg_add certbot

Проверка php! Создаём в папке /var/www/html файлик test.php с таким содержанием:

<?php phpinfo(); ?>

Переходим на страницу http://wwwx/test.php и наблюдаем:

-11

Не забудьте поправить /etc/rc.conf

pkg_scripts="mysqld php82_fpm nginx"

На этом мы завершаем нашу третью часть.