Перейти к основному содержимому

Веб-сервер, HTTPS и права

Клиент поддерживает обычный PHP 8.2 runtime. Выберите один вариант веб-сервера и не смешивайте правила разных конфигураций.

Перед настройкой​

Замените в примерах:

  • cabinet.example.com на домен сайта;
  • /var/www/cabinet.example.com на каталог клиента;
  • путь к PHP-FPM socket на установленную версию PHP;
  • пути TLS-сертификатов на реальные.

DNS-запись домена должна указывать на сервер. До запуска установщика откройте HTTPS и убедитесь, что сертификат выпущен для нужного домена.

Вариант 1. Nginx + PHP-FPM​

nginx.conf
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;
}

Проверка:

Проверка Nginx
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​

Включите модули:

Модули Apache
sudo a2enmod rewrite proxy_fcgi setenvif headers ssl
sudo a2enconf php8.2-fpm

VirtualHost:

apache-vhost.conf
<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. Проверка:

Проверка Apache
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:

OpenLiteSpeed protected contexts
/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​

Caddyfile
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:

  1. используйте режим Full (strict);
  2. установите origin-сертификат;
  3. разрешайте proxy headers только от доверенных адресов proxy;
  4. не доверяйте входящим CF-Connecting-IP и X-Forwarded-For от произвольного клиента;
  5. не кэшируйте /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 и веб-сервера;
  • установщик проходит проверку прав.