Веб-сервер, HTTPS и права
Клиент поддерживает обычный PHP 8.2 runtime. Выберите один вариант веб-сервера и не смешивайте правила разных конфигураций.
Перед настройкой
Замените в примерах:
cabinet.example.comна домен сайта;/var/www/cabinet.example.comна каталог клиента;- путь к PHP-FPM socket на установленную версию PHP;
- пути TLS-сертификатов на реальные.
DNS-запись домена должна указывать на сервер. До запуска установщика откройте HTTPS и убедитесь, что сертификат выпущен для нужного домена.
Вариант 1. Nginx + PHP-FPM
server {
listen 443 ssl http2;
server_name cabinet.example.com;
root /var/www/cabinet.example.com;
index index.php;
ssl_certificate /etc/letsencrypt/live/cabinet.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cabinet.example.com/privkey.pem;
client_max_body_size 32m;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ^~ /install/data/ { deny all; }
location ^~ /install/templates/ { deny all; }
location ^~ /internal_data/ { deny all; }
location ^~ /src/ { deny all; }
location ~ /.(?!well-known) { deny all; }
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS on;
}
}
server {
listen 80;
server_name cabinet.example.com;
return 301 https://$host$request_uri;
}
Проверка:
sudo nginx -t
sudo systemctl reload nginx
curl -I https://cabinet.example.com/
curl -I https://cabinet.example.com/src/config.php
Первый запрос должен вернуть страницу или редирект приложения. Запрос к src/config.php должен вернуть 403 или 404.
Вариант 2. Apache 2.4 + PHP-FPM
Включите модули:
sudo a2enmod rewrite proxy_fcgi setenvif headers ssl
sudo a2enconf php8.2-fpm
VirtualHost:
<VirtualHost *:443>
ServerName cabinet.example.com
DocumentRoot /var/www/cabinet.example.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/cabinet.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/cabinet.example.com/privkey.pem
<Directory /var/www/cabinet.example.com>
Options -Indexes
AllowOverride All
Require all granted
</Directory>
<DirectoryMatch "^/var/www/cabinet\.example\.com/(src|internal_data|install/data|install/templates)(/|$)">
Require all denied
</DirectoryMatch>
ProxyPassMatch "^/(.*\.php)$" "unix:/run/php/php8.2-fpm.sock|fcgi://localhost/var/www/cabinet.example.com/"
LimitRequestBody 33554432
</VirtualHost>
<VirtualHost *:80>
ServerName cabinet.example.com
Redirect permanent / https://cabinet.example.com/
</VirtualHost>
Корневой .htaccess из дистрибутива выполняет маршрутизацию в index.php. Проверка:
sudo apachectl configtest
sudo systemctl reload apache2
Вариант 3. LiteSpeed или OpenLiteSpeed
Создайте Virtual Host с document root /var/www/cabinet.example.com, включите rewrite и загрузку .htaccess, затем подключите PHP 8.2 через LiteSpeed SAPI. Добавьте четыре запретных context:
/src/
/internal_data/
/install/data/
/install/templates/
Для каждого context установите Accessible: No. В listener привяжите домен к HTTPS Virtual Host, установите сертификат и включите HTTP -> HTTPS redirect.
После graceful restart проверьте главную, /install/ и запрет /src/config.php. Не полагайтесь только на rewrite из .htaccess: защищённые каталоги должны блокироваться на уровне Virtual Host.
Вариант 4. Caddy + FrankenPHP
cabinet.example.com {
root * /var/www/cabinet.example.com
encode zstd gzip
@protected path /src/* /internal_data/* /install/data/* /install/templates/*
respond @protected 404
@hidden path_regexp hidden (^|/)\.
respond @hidden 404
php_server
request_body {
max_size 32MB
}
}
Caddy автоматически получает TLS-сертификат, если DNS уже указывает на сервер и порты 80/443 доступны снаружи.
Reverse proxy и Cloudflare
Если HTTPS завершается на Cloudflare или внешнем proxy:
- используйте режим Full (strict);
- установите origin-сертификат;
- разрешайте proxy headers только от доверенных адресов proxy;
- не доверяйте входящим
CF-Connecting-IPиX-Forwarded-Forот произвольного клиента; - не кэшируйте
/admin.php,/install/,/sign-in,/sign-up,/cabinet/и POST-запросы.
Права файлов
Рекомендуемая модель:
sudo chown -R app:www-data /var/www/cabinet.example.com
sudo find /var/www/cabinet.example.com -type d -exec chmod 750 {} \;
sudo find /var/www/cabinet.example.com -type f -exec chmod 640 {} \;
sudo chmod 600 /var/www/cabinet.example.com/src/config.php
sudo chmod -R u+rwX,g+rwX /var/www/cabinet.example.com/internal_data
Пользователь PHP должен иметь запись в internal_data, data и во временно изменяемые файлы продукта при обновлении в один клик. Не используйте 777.
- sudo chmod -R 777 /var/www/cabinet.example.com
+ sudo chown -R app:www-data /var/www/cabinet.example.com
+ sudo find /var/www/cabinet.example.com -type d -exec chmod 750 {} \;
+ sudo find /var/www/cabinet.example.com -type f -exec chmod 640 {} \;
+ sudo chmod 600 /var/www/cabinet.example.com/src/config.php
Финальная проверка
- HTTP перенаправляется на HTTPS;
- сертификат действителен для домена;
- главная и
/sign-inоткрываются; /src/config.phpи/internal_data/возвращают403или404;- PHP-файлы, которых нет на диске, не передаются в PHP runtime;
- размер загрузки соответствует настройкам PHP и веб-сервера;
- установщик проходит проверку прав.