Устанавливаем и настраиваем высокопроизводительный веб сервер для движка Flarum. Он будет работать за Nginx Reverse Proxy с настроенным proxy_pass.
Будут использоваться:
- Debian: v13.1 (Trixie);
- Nginx: v1.26.3;
Подготовка системы:
Создаем системного пользователя: с отключенным шелом и одноименной группой
# useradd flarum -r -m -b /home -U -s /bin/false
# passwd flarum
Создаем необходимые каталоги:
# chmod u=rwx,g=x,o= /home/flarum (710)
# mkdir -p -m 710 /home/flarum/www/{xnet.icu,logs}
Предоставляем пользователю flarum права на них:
# chown -R flarum:flarum /home/flarum/www
Предоставим Nginx доступ в домашнюю директорию пользователя flarum: … добавив пользователя www-data в группу flarum
# usermod -a -G flarum www-data
# gpasswd -d www-data flarum - Удалить пользователя flarum из группы www-data;
# id www-data - Проверить в какие группы входит пользователь www-data;
Установим необходимые пакеты:
# apt update && apt upgrade
# apt install php8.4-{fpm,common,mysql,cli,gd,dev,mbstring,curl} php-{pear,mail} nginx mariadb-server unzip sudo
Настраиваем MariaDB:
# mariadb-secure-installation
MariaDB: создаем Пользователя и БД
Логинимся к БД:
# mysql -u root -p'pass'
# Создаем пользователя:
MariaDB> create user 'flarum'@'localhost' identified by 'pass';
# Создаем БД:
MariaDB> create database `flarum` character set = 'utf8mb4';
# Присваиваем права:
MariaDB> GRANT ALL PRIVILEGES ON `flarum`.* to `flarum`@localhost;
MariaDB> FLUSH PRIVILEGES;
MariaDB> quit;
Установка composer: [link]
# apt install curl git
# curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
- или так:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6') { echo 'Installer verified'.PHP_EOL; } else { echo 'Installer corrupt'.PHP_EOL; unlink('composer-setup.php'); exit(1); }"
php composer-setup.php --install-dir=/usr/local/bin --filename=composer
php -r "unlink('composer-setup.php');"
Установка Flarum:
# cd /home/flarum/www/xnet.icu/
# sudo -u flarum composer create-project flarum/flarum .
Настройка nginx.conf:
# cp /etc/nginx/nginx.conf{,.bkp}
# nano /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
worker_cpu_affinity auto;
pid /run/nginx.pid;
#error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;
events {
# Максимальное количество соединений одного воркера;
worker_connections 1024;
# Метод выбора соединений;
use epoll;
# Принимать максимально возможное количество соединений;
multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
types_hash_max_size 2048;
server_tokens off; # Recommended practice is to turn this off
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1.2 TLSv1.3; # Dropping SSLv3 (POODLE), TLS 1.0, 1.1
ssl_prefer_server_ciphers off; # Don't force server cipher order.
##
# Logging Settings
##
access_log off;
#access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/javascript text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Настройка sites-available/xnet.icu
В параметре "set_real_ip_from" задаем ip-адрес вышестоящего Nginx Reverse Proxy с настроенным proxy_pass.
# rm /etc/nginx/sites-enabled/default
# nano /etc/nginx/sites-available/xnet.icu
server {
listen 80;
server_name xnet.icu;
set_real_ip_from local_ip; # Frontend Nginx;
real_ip_header X-Forwarded-For; # Какой заголовок использовать;
real_ip_recursive on; # Брать последний реальный адрес в цепочке, а не адрес прокси;
access_log off;
#access_log /home/flarum/www/logs/xnet.icu_access.log;
error_log /home/flarum/www/logs/xnet.icu_error.log; # + crit
root /home/flarum/www/xnet.icu/public;
index index.php;
# Блокируем запросы с неверными значениями поля "Referer" в заголовке. Помогает при хотлинке изображений;
location ~* \.(?:jpg?g|gif|png|ico)$ {
valid_referers none blocked server_names
*.xnet.icu www.google.ru www.google.com yandex.ru go.mail.ru duckduckgo.com *.vk.com;
if ($invalid_referer) {
return 403;
}
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ [^/]\.php$ {
try_files $uri =404; # Не отдаём несуществующие файлы;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php/php8.4-fpm-flarum.sock;
include fastcgi_params;
fastcgi_param HTTPS on;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_param HTTP_PROXY "";
}
# Expire rules for static content
location ~* \.(?:manifest|appcache|html?|xml|json)$ {
add_header Cache-Control "max-age=0";
}
location ~* \.(?:rss|atom)$ {
add_header Cache-Control "max-age=3600";
}
location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|mp4|ogg|ogv|webm|htc)$ {
add_header Cache-Control "max-age=2592000";
access_log off;
}
location ~* \.(?:css|js)$ {
add_header Cache-Control "max-age=31536000";
access_log off;
}
location ~* \.(?:ttf|ttc|otf|eot|woff|woff2|jpg|jpeg|gif|png|ico)$ {
add_header Cache-Control "max-age=2592000";
access_log off;
}
location = /favicon.ico {
log_not_found off;
}
# Запрет на доступ ко всем скрытым файлам;
location ~ /\. {
deny all;
return 444;
}
# Запрет на доступ к файлам с заданными расширениеми и папкам;
location ~* ^/(\.(yml|log|map|json|md|xml|lock|dist|sh|git)|storage|vendor|db_bkp) {
deny all;
return 444;
}
# Запрет на доступ к загруженным скриптам;
location ~* /(?:assets)/.*\.php$ {
deny all;
return 444;
}
}
Включаем его созданием симлинка в директорию sites-enabled:
# ln -s /etc/nginx/sites-available/xnet.icu /etc/nginx/sites-enabled/
Выставляем рекурсивно права на файлы и каталоги:
# cd /home/flarum/www/xnet.icu
- for directories:
# find . -type d -exec chmod 0710 {} +
- for files:
# find . -type f -exec chmod 0644 {} +
- Set User/Group:
# chown -R flarum:flarum /home/flarum/www
Memcached: - не требуется! Flarum не будет использовать его по умолчанию.
# apt install memcached php-memcached
# cp /etc/php/8.4/fpm/php.ini{,.bkp}
# nano /etc/php/8.4/fpm/php.ini
- Выдаёт факт присутствия PHP на сервере, включая передачу версии PHP в HTTP-заголовке;
expose_php = Off
- Эта директива задаёт максимальное время в секундах, в течение которого скрипт должен полностью загрузиться;
max_execution_time = 30
- Эта директива задаёт максимальное время в секундах, в течение которого скрипт должен разобрать все входные данные, переданные запросами вроде POST или GET;
max_input_time = 30
- Эта директива задаёт максимальный объем памяти в байтах, который разрешается использовать скрипту;
memory_limit = 64M
- Эта настройка определяет, требуется ли выводить ошибки на экран вместе с остальным выводом;
display_errors = Off
- Даже если display_errors включена, ошибки, возникающие во время запуска PHP, не будут отображаться;
display_startup_errors = Off
- Ведение ошибок;
log_errors = On
- Устанавливает максимально допустимый размер данных, отправляемых методом POST. Это значение также влияет на загрузку файлов;
post_max_size = 8M
- Разрешать или не разрешать закачивание файлов;
file_uploads = Off
- Максимальный размер закачиваемого файла;
upload_max_filesize = 2M
- Максимально разрешённое количество одновременно закачиваемых файлов;
max_file_uploads = 5
- Данная директива включает поддержку работы с удалёнными файлами с использованием ftp или http протокола;
allow_url_fopen = Off
- Эта опция позволяет использование обёрток fopen;
allow_url_include = Off
- PHP не примет случайно подделанную ID-сессию;
session.use_strict_mode = 1
- Cookie сессии нельзя читать через JS (XSS-защита);
session.cookie_httponly = 1
- Передача сессионных cookie только по HTTPS;
session.cookie_secure = 1
- Запрещает передачу SID через URL (снижает утечки);
session.use_only_cookies = 1
- Отключает опасные функции, если они не нужны;
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
OPcache: Установка | Настройка во время выполнения
# php -v
# nano /etc/php/8.4/fpm/php.ini
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
FPM:
# cp /etc/php/8.4/fpm/php-fpm.conf{,.bkp}
# cp /etc/php/8.4/fpm/pool.d/www.conf{,.bkp}
# mv /etc/php/8.4/fpm/pool.d/www.conf /etc/php/8.4/fpm/pool.d/www.flarum.conf
# nano /etc/php/8.4/fpm/pool.d/www.flarum.conf
; pool name ('www' here)
[flarum]
user = flarum
group = flarum
listen = /run/php/php8.4-fpm-flarum.sock
listen.owner = flarum
listen.group = flarum
listen.mode = 0660
listen.allowed_clients = 127.0.0.1
- Выбор того, как менеджер процессов будет контролировать создание дочерних процессов;
pm = ondemand | dynamic
- Число дочерних процессов, которые будут созданы, когда pm установлен в static, или же максимальное число процессов, которые будут созданы, когда pm установлен в dynamic;
pm.max_children = 5
- Число дочерних процессов, создаваемых при запуске. Используется, только когда pm установлен в dynamic;
pm.start_servers = 2
- Желаемое минимальное число неактивных процессов сервера. Используется, только когда pm установлено в dynamic;
pm.min_spare_servers = 1
- Желаемое максимальное число неактивных процессов сервера. Используется, только когда pm установлен в dynamic;
pm.max_spare_servers = 3
- Число секунд, по истечению которых простаивающий процесс будет завершён. Используется только если pm установлено как ondemand;
pm.process_idle_timeout = 10s; | ;
- Число запросов дочернего процесса, после которого процесс будет перезапущен. Это полезно для избежания утечек памяти при использовании сторонних библиотек;
pm.max_requests = 500
Flarum-Postinstall:
Полезные команды.
- Очистить кеш:
# sudo -u flarum php flarum cache:clear
- Отобразить версию компонентов Flarum:
# php flarum info
- Обновление пакетов:
# sudo -u flarum composer update
- Удаление пакетов:
# sudo -u flarum composer remove
Обновление Flarum: [link]
# cd /home/flarum/www/xnet.icu/
# php flarum info
# sudo -u flarum composer update --prefer-dist --no-plugins --no-dev -a --with-all-dependencies
- Без плагинов:
# sudo -u flarum composer update --prefer-dist --no-dev -a -W
- Последний шаг - запустить изменения в базе данных и очистить кеш:
# sudo -u flarum php flarum migrate
# sudo -u flarum php flarum cache:clear
- По возможности перезапускаем процесс PHP:
# systemctl restart php8.4-fpm.service
Upgrade to Carbon2:
# sudo -u flarum ./vendor/bin/upgrade-carbon
Обновление Composer:
# sudo -u flarum composer --version
- Обновить Composer до последней версии:
# composer self-update
- Перейти на Composer 1.x или 2.x
# composer self-update --1 или --2
- Откатить Composer на предыдущую версию:
# composer self-update --rollback
- Очистить кеш Composer:
# sudo -u flarum composer clear-cache
Проверка расширений на совместимость с установленной версией Flarun:
extiverse.com | packagist.org | extensions
Установка расширений:
После установки расширения сделать # sudo -u flarum php flarum cache:clear
<- Развернуть ->
- Перевод:
https://discuss.flarum.org/d/1545-russian-language-pack
# sudo -u flarum composer require flarum-lang/russian
# sudo -u flarum composer update flarum-lang/russian
- Перевод расширений:
# sudo -u flarum composer require marketplace/flarum-l10n-ext-russian
# sudo -u flarum composer update marketplace/flarum-l10n-ext-russian
- Спойлер
https://discuss.flarum.org/d/18796-friendsofflarum-bbcode-details
# sudo -u flarum composer require fof/bbcode-details
# sudo -u flarum composer update fof/bbcode-details
- Ссылки в шапке
https://discuss.flarum.org/d/18335-friendsofflarum-links
# sudo -u flarum composer require fof/links
# sudo -u flarum composer update fof/links
- Свои страницы
https://discuss.flarum.org/d/18301-friendsofflarum-pages
# sudo -u flarum composer require fof/pages
# sudo -u flarum composer update fof/pages
- reCAPTCHA
https://discuss.flarum.org/d/18399-friendsofflarum-recaptcha
# sudo -u flarum composer require fof/recaptcha
# sudo -u flarum composer update fof/recaptcha
BBClone - статистика для сайта: [link]
<- Развернуть ->
# wget -P /tmp https://www.bbclone.de/dist/bbclone-0.8.0.zip
# unzip /tmp/bbclone-0.8.0.zip -d /home/flarum/www/xnet.icu/public/
# cd /home/flarum/www/xnet.icu/public/bbclone/
# nano ../index.php
<?php
define("_BBC_PAGE_NAME", "xNET");
define("_BBCLONE_DIR", "bbclone/");
define("COUNTER", _BBCLONE_DIR."mark_page.php");
if (is_readable(COUNTER)) include_once(COUNTER);
?>
- for directories:
# find . -type d -exec chmod 0710 {} +
- for files:
# find . -type f -exec chmod 0644 {} +
- Set User/Group:
# chown -R flarum:flarum ../bbclone
# nano conf/config.php - отключаем показ конфига.
$BBC_SHOW_CONFIG = "";
Оптимизация изображений без потери качества:
# apt install optipng jpegoptim
# cd /home/flarum/www/xnet.icu/public/assets/images/
# find -type f -iname "*.jpg" -exec jpegoptim --strip-all --all-progressive -pm85 {} \; -exec chmod 644 {} \;
# find -type f -iname "*.png" -exec optipng -strip all -o4 {} \; -exec chmod 644 {} \;
# chown -R flarum:flarum .
Полезные ссылки:
Настройка веб сервера: | Полный тюнинг движка | Очень шустрый блог на WordPress |
Проверяем сайт на скорость работы: | tools.pingdom | developers.google | loadimpact |