Вимоги до сервера
Який потрібен PHP, база даних, розширення та права на файли. І що буває, коли хостинг закриває зайве.
На цій сторінці
Магазин працює на звичайному хостингу з PHP та MySQL — окремий сервер і права адміністратора потрібні не завжди. Нижче перелічено те, що магазин перевіряє сам під час встановлення, тож звіряти список вручну не обов’язково: встановлювач покаже позначки навпроти кожного пункту.
PHP
Потрібна версія 8.3 або новіша. На 8.4 магазин теж працює — це рекомендована версія, якщо хостинг її пропонує.
Розширення PHP, без яких магазин не запускається:
| Розширення | Навіщо |
|---|---|
pdo, pdo_mysql |
зв’язок із базою даних |
mbstring |
тексти українською та російською |
openssl |
захищені з’єднання, паролі, платіжні шлюзи |
tokenizer, ctype, json |
робота самого застосунку |
fileinfo |
завантаження файлів і зображень |
gd |
розміри фотографій товарів |
curl |
зв’язок зі службами доставки, платіжними системами та нашим сайтом |
dom, xml |
вивантаження, прайс-листи, обмін із маркетплейсами |
zip |
встановлення доповнень і резервні копії |
intl |
ціни, дати й числа у звичному для країни вигляді |
bcmath |
точний підрахунок грошей |
sodium |
перевірка підпису оновлень |
Жорстких вимог до налаштувань PHP магазин не висуває — за витратами пам’яті він
стежить сам і не бере наступне завдання, коли її залишається мало. Але на
тісному хостингу працювати помітно зручніше, якщо підняти три значення:
memory_limit до 256 МБ, max_execution_time до 60 секунд, а
upload_max_filesize і post_max_size — до розміру найбільшої фотографії, яку
ви збираєтесь завантажувати. Поточні значення видно в панелі керування:
«Системний» → «Інформація про систему».
База даних
MySQL 8.0 або MariaDB 10.6 і новіші. Кодування — utf8mb4.
Базу треба створити заздалегідь, і вона має бути порожньою: встановлювач ставиться лише в порожню базу, інакше чужі таблиці зіткнуться з таблицями магазину. Якщо в базі щось є, встановлювач покаже кількість таблиць і запропонує очистити її — але тільки після вашого підтвердження.
В імені бази даних не повинно бути крапок. Крапка в імені ламає запити, і магазин перестане відкриватися одразу після встановлення.
Веб-сервер
Nginx або Apache. Коренем сайту має бути тека public, а не корінь
магазину: так відвідувач не зможе звернутися до файлів налаштувань напряму.
Головне правило для nginx — те саме, що й у будь-якого застосунку на Laravel:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
Воно майже завжди стоїть за замовчуванням. Без нього магазин не зможе домальовувати відсутні розміри фотографій: файл на диску є, а запит до магазину не доходить.
Для Apache налаштовувати нічого не треба — правила вже лежать у файлі
.htaccess усередині теки public.
Приклад налаштування сайту в nginx
Так налаштовано наш демонстраційний магазин. Шляхи та адресу замініть на свої, решту можна брати як є.
server {
listen 80;
listen 443 ssl;
http2 on;
server_name shop.example.com;
# Корінь сайту — тека public усередині магазину, а не сам магазин
root /www/wwwroot/shop.example.com/public;
index index.php;
ssl_certificate /шлях/до/сертифіката/fullchain.pem;
ssl_certificate_key /шлях/до/сертифіката/privkey.pem;
# Увесь трафік захищеним з’єднанням: адреси листів і зворотні адреси
# платіжних систем мають збігатися з адресою сайту
if ($server_port !~ 443) {
rewrite ^(/.*)$ https://$host$1 permanent;
}
# Стільки магазин зможе прийняти за один раз — фотографії товарів
# та архіви доповнень упираються саме в це значення
client_max_body_size 50m;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ [^/]\.php(/|$) {
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi-84.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
# Службові файли назовні не віддаємо: у .env лежать паролі
location ~ ^/(\.user\.ini|\.htaccess|\.git|\.env|\.svn|LICENSE|README\.md) {
return 404;
}
# Зображення та стилі хай лежать у браузері, а не запитуються щоразу
location ~* \.(gif|jpe?g|png|webp|avif|svg|ico)$ {
expires 30d;
access_log off;
}
location ~* \.(js|css)$ {
expires 12h;
access_log off;
}
access_log /www/wwwlogs/shop.example.com.log;
error_log /www/wwwlogs/shop.example.com.error.log;
}
Адреса сокета PHP (fastcgi_pass) у кожного хостингу своя: на панелях це
зазвичай /tmp/php-cgi-84.sock, на власному сервері — /run/php/php8.4-fpm.sock.
Подивіться, як налаштовані сусідні сайти, і візьміть таку саму.
Не підмінюйте сторінку 404 засобами сервера. Панелі хостингу часто додають
error_page 404 /404.htmlі вмикаютьfastcgi_intercept_errors. Тоді замість сторінки «товар не знайдено», намальованої в оформленні магазину, відвідувач побачить стандартну сторінку сервера — і піде із сайту, замість того щоб повернутися до каталогу.
Якщо сайтом керує панель хостингу, редагуйте налаштування в панелі, а не у файлі: панель перезаписує свої файли за будь-якої зміни сайту, і правка, зроблена руками, тихо зникне.
Права на файли
Теки, до яких магазин пише:
storage— фотографії, вивантаження, журнали, резервні копії;bootstrap/cache— службові файли;- файл
.env— налаштування підключення (у нього пише встановлювач).
Усі файли магазину мають належати тому самому користувачу, від імені якого
працює веб-сервер. Найчастіша причина «фотографії не відкриваються» —
завантаження файлів на сервер від імені root, після чого сайт не може їх
прочитати.
Фотографії та тека storage
Товари лежать у сховищі, а відвідувач отримує їх за адресою public/storage —
це посилання на сховище. Магазин створює його сам під час встановлення. Якщо
хостинг забороняє такі посилання, встановлювач скаже про це й покаже команду:
php artisan storage:link
Доки посилання немає, у магазині не відкривається жодне зображення: фотографії на місці, а покупець бачить порожні рамки.
Планувальник завдань
Магазину потрібен один рядок у планувальнику (cron) — про нього окрема сторінка, Обслуговування. Без нього магазин працює, але не йдуть листи покупцям, не виконуються вивантаження та імпорт, не застосовуються оновлення.
Обмеження хостингу
Масові хостинги закривають частину можливостей PHP, і за зовнішніми ознаками цього не видно. Магазин перевіряє їх сам і майже все обходить власними силами:
proc_open— запуск окремих програм. Без нього магазин виконує завдання всередині свого процесу. Єдине, що справді перестає працювати, — автоматичні копії бази даних: їх знімає окрема програма сервера.pcntl_signal— сигнали процесів. Магазин ними не користується: чергу розбирає власна команда, яка працює й без них.symlink— посилання на теки. Доки доступ до фотографій відкрито, це просто до відома; якщо посилання немає і створити його не можна — фотографії не з’являться.
Що саме закрито на вашому сервері, завжди видно в панелі керування: розділ «Системний» → «Діагностика».