Настройка конфигурации NGINX + PHP-FPM 7.4 на Ubuntu 22.04 + Fastpanel для MODX 2.8.7
Добрый день.
Поднимаю сервер VDS для MODX 2.8.5. Ubuntu 22.04 + Fastpanel. Связка NGINX + PHP-FPM 7.4. Cертификат Let's Encrypt Wildcard создан через панель. Стандартную настройку конфигов сделал такую (настройки сохраняются в разделе «Ручная настройка» в панели управления. Учтите, что при ручных настройках панель начнет вас предупреждать о попытке поменять стандартные настройки и будет просить ввести код подтверждения, если вы это сделаете — то ручные настройки затрутся и придётся настраивать заново).
UPD 07.08.2024
Обновление конфига после обновления панели: здесь
UPD 26.02.2024
В конфиг добавлена поддержка HTTP2. На данный момент в составе пакета Fastpanel идёт NGINX 1.24, в котором можно включить только HTTP2. Протоколы QUIC и HTTP3 поддерживаются в версии 1.25, или же можно пересобрать NGINX из исходников с модулем --with-http_v3_module и установкой библиотеки SSL с поддержкой HTTP/3, например BoringSSL, LibreSSL или QuicTLS., но я не обновлял NGINX отдельно от Fastpanel, не пересобирал, и не тестировал.
Также, включил поддержку TLSv1.3. Здесь есть нюанс: в конфигах панели для каждого хоста это не получится сделать, т.к. у панели есть основной конфиг на протоколы и он будет противоречить конфигу хоста. Он располагается по данному пути: /etc/nginx/conf.d/ssl.conf. Этот путь можно проверить командой nginx -t в консоли.
Для редактирования конфига выполните команду (в Ubuntu) nano /etc/nginx/conf.d/ssl.conf.
Стандартно он выглядит так:
Изменим его так:
Ручные настройки в панели:
FrontEnd
BackEnd
После настроек ещё раз выполните в консоли команду nginx -t, чтобы проверить конфиг на возможные ошибки. Если всё в порядке, перезапустите NGINX командой systemctl restart nginx, а лучше перезагрузите сервер.
И самое главное — не забывайте сделать бэкап вашего сервера целиком перед настройкой!
Поднимаю сервер VDS для MODX 2.8.5. Ubuntu 22.04 + Fastpanel. Связка NGINX + PHP-FPM 7.4. Cертификат Let's Encrypt Wildcard создан через панель. Стандартную настройку конфигов сделал такую (настройки сохраняются в разделе «Ручная настройка» в панели управления. Учтите, что при ручных настройках панель начнет вас предупреждать о попытке поменять стандартные настройки и будет просить ввести код подтверждения, если вы это сделаете — то ручные настройки затрутся и придётся настраивать заново).
Обновление конфига после обновления панели: здесь
UPD 26.02.2024
В конфиг добавлена поддержка HTTP2. На данный момент в составе пакета Fastpanel идёт NGINX 1.24, в котором можно включить только HTTP2. Протоколы QUIC и HTTP3 поддерживаются в версии 1.25, или же можно пересобрать NGINX из исходников с модулем --with-http_v3_module и установкой библиотеки SSL с поддержкой HTTP/3, например BoringSSL, LibreSSL или QuicTLS., но я не обновлял NGINX отдельно от Fastpanel, не пересобирал, и не тестировал.
Также, включил поддержку TLSv1.3. Здесь есть нюанс: в конфигах панели для каждого хоста это не получится сделать, т.к. у панели есть основной конфиг на протоколы и он будет противоречить конфигу хоста. Он располагается по данному пути: /etc/nginx/conf.d/ssl.conf. Этот путь можно проверить командой nginx -t в консоли.
Для редактирования конфига выполните команду (в Ubuntu) nano /etc/nginx/conf.d/ssl.conf.
Стандартно он выглядит так:
ssl_ciphers EECDH:+AES256:-3DES:RSA+AES:RSA+3DES:!NULL:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Изменим его так:
ssl_prefer_server_ciphers off;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_session_cache shared:SSL:1m;
ssl_stapling on;
ssl_stapling_verify on;
Ручные настройки в панели:
FrontEnd
server {
# Тут и далее указать ваш ip сервера вместо 10.10.10.10;
listen 10.10.10.10:80;
# Тут и далее заменить my-site.ru на ваш домен
server_name my-site.ru www.my-site.ru;
return 301 https://my-site.ru$request_uri;
}
server {
listen 10.10.10.10:443 ssl http2;
server_name my-site.ru www.my-site.ru;
# Изменить имя сертификата на ваш (нужно выпустить wildcard, для корректной работы переадресации с www и работы на поддоменах)
ssl_certificate /var/www/httpd-cert/my-site.ru_2023-06-27-00-03_12.crt;
ssl_certificate_key /var/www/httpd-cert/my-site.ru_2023-06-27-00-03_12.key;
charset utf-8;
gzip on;
gzip_min_length 1000;
gzip_proxied any;
gzip_types text/plain application/xml application/x-javascript text/javascript text/css text/json;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
gzip_comp_level 5;
# Тут и далее заменить my_site_user на ваше имя пользователя
set $root_path /var/www/my_site_user/data/www/my-site.ru;
root $root_path;
index index.html index.htm index.php;
disable_symlinks if_not_owner from=$root_path;
# Редирект с www на адрес без www
if ($host ~* '^www\.(.*)$') {
return 301 $scheme://$1$request_uri;
}
# Редирект с index.php на корень сайта:
if ($request_uri ~* '^/index.php$') {
return 301 /;
}
# Убираем повторяющиеся слеши из адреса
# Вариант, работающий только при merge_slashes = on
if ($request_uri ~ ^[^?]*//) {
rewrite ^ $uri permanent;
}
# Универсальный вариант
#if ($request_uri ~ ^(?P<left>[^?]*?)//+(?P<right>[^?]*)) {
# rewrite ^ $left/$right permanent;
#}
# Удаление слеша на конце всех URL, если необходимо.
# Если изменили адрес админки MODX, то нужно указать его в условии этого правила, иначе будет бесконечный редирект.
# if ($request_uri ~ ".*/$") {
# rewrite ^/((?!core|connectors|manager|setup).*)/$ /$1 permanent;
# }
# Запрет для всех для при обращении к ядру MODx из браузера
location ~ ^/core/.* {
deny all;
return 403;
}
location ~ ^/config.core.php {
return 404;
}
location @rewrite {
rewrite ^/(.*)$ /index.php?q=$1;
}
location ~ \.php$ {
# Базовая авторизация в служебные каталоги
# Логин и пароль можно создать тут https://hostingcanada.org/htpasswd-generator/ и добавить в содержимое файла .htpasswd
# Если делаете несколько разных логинов - необходимо добавлять их с новой строчки
location ~* ^/(manager|connectors)/ {
auth_basic "Restricted Access";
auth_basic_user_file /var/www/my_site_user/data/.htpasswd;
try_files $uri $uri/ @rewrite;
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/my-site.ru.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
}
}
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/my-site.ru.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
}
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpeg|avi|zip|gz|bz2|rar|swf|ico|7z|doc|docx|map|ogg|otf|pdf|ttf|tif|txt|wav|webp|woff|woff2|xls|xlsx|xml)$ {
try_files $uri @rewrite;
access_log off;
expires 10d;
break;
}
location @fallback {
fastcgi_pass unix:/var/run/my-site.ru.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
location ~ /\.ht {
deny all;
}
include "/etc/nginx/fastpanel2-sites/my_site_user/my-site.ru.includes";
include /etc/nginx/fastpanel2-includes/*.conf;
error_log /var/www/my_site_user/data/logs/my-site.ru-frontend.error.log;
access_log /var/www/my_site_user/data/logs/my-site.ru-frontend.access.log;
}
BackEnd
[my-site.ru]
user = my_site_user
group = my_site_user
listen = /var/run/my-site.ru.sock
listen.owner = my_site_user
listen.group = www-data
listen.mode = 0666
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 1000
php_admin_value[date.timezone] = "Europe/Moscow"
php_admin_value[open_basedir] = "/var/www/my_site_user/data"
php_admin_value[display_errors] = "off"
php_admin_value[log_errors] = "On"
php_admin_value[mail.add_x_header] = "On"
php_admin_value[max_execution_time] = "120"
php_admin_value[max_input_vars] = "10000"
php_admin_value[opcache.blacklist_filename] = "/opt/opcache-blacklists/opcache-*.blacklist"
php_admin_value[opcache.max_accelerated_files] = "100000"
php_admin_value[output_buffering] = "4096"
php_admin_value[post_max_size] = "512M"
php_admin_value[sendmail_path] = "/usr/sbin/sendmail -t -i -f 'my-site.ru@yandex.ru'"
php_admin_value[session.save_path] = "/var/www/my_site_user/data/tmp"
php_admin_value[short_open_tag] = "On"
php_admin_value[upload_max_filesize] = "512M"
php_admin_value[memory_limit] = "512M"
php_admin_value[cgi.fix_pathinfo] = "0"
php_admin_value[session.gc_probability] = "1"
php_admin_value[session.gc_divisor] = "100"
php_admin_value[session.gc_maxlifetime] = "28800"
php_admin_value[upload_tmp_dir] = "/var/www/my_site_user/data/tmp"
php_admin_value[error_log] = "/var/www/my_site_user/logs/php_errors.log"
catch_workers_output = no
access.format = "%{REMOTE_ADDR}e - [%t] \"%m %r%Q%q %{SERVER_PROTOCOL}e\" %s %{kilo}M \"%{HTTP_REFERER}e\" \"%{HTTP_USER_AGENT}e\""
access.log = /var/www/my_site_user/data/logs/my-site.ru-backend.access.log
После настроек ещё раз выполните в консоли команду nginx -t, чтобы проверить конфиг на возможные ошибки. Если всё в порядке, перезапустите NGINX командой systemctl restart nginx, а лучше перезагрузите сервер.
И самое главное — не забывайте сделать бэкап вашего сервера целиком перед настройкой!
Комментарии: 12
Спасибо, что поделились настройкой конфигов, но у меня так и получилось запустить (перенести) сайт. При первом «запуске» — сайт работает, но при переходе по всем ссылкам сайта получаю главную страницу (при этом в браузере ссылки меняются). Если вручную внести ваш конфиг, то при переходе по ссылкам сайта получаю — 404 Not Found. Меняли ли вы сам конфиг nginx.config сервера?
Вот так вот без логов и подробностей сложно сказать что пошло не так. Чаще всего на практике проблемы возникают с правами. Не так юзера назвали, не того юзера прописали в php-fpm pool, название сокета может не совпадать в nginx конфиге и php-fpm pool
Вам нужно изучить логи сайта /var/www/my_site_user/logs/php_errors.log, а так же заглянуть в логи /var/log/php7.4-fpm.log, возможно еще /var/log/nginx/error.log
Там по любому будет обозначено, где проблема.
Вам нужно изучить логи сайта /var/www/my_site_user/logs/php_errors.log, а так же заглянуть в логи /var/log/php7.4-fpm.log, возможно еще /var/log/nginx/error.log
Там по любому будет обозначено, где проблема.
Спасибо, в логах имеем вот такие ошибки
php-erorrs.log
php-erorrs.log
thrown in /var/www/my_site_user/data/www/my-site.ru/core/cache/includes/elements/modplugin/8.include.cache.php on line 34 [29-Nov-2023 14:22:16 Europe/Moscow] PHP Fatal error: Uncaught Error: Call to a member function clearCache() on null in /var/www/my_site_use/data/www/my-site.ru/core/cache/includes/elements/modplugin/8.include.cache.php:34
my-site.ru-frontend.error.logthrown in /var/www/my_site_user/data/www/my-site.ru/core/cache/includes/elements/modplugin/8.include.cache.php on line 34" while reading upstream, client: XX.XXXX.XX, server: my-site.ru, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/my-site.ru.sock:", host: "my-site.ru", referrer: ""
2023/11/29 12:20:00 [error] 42300#42300: *803 FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught Error: Call to a member function clearCache() 2023/11/29 12:20:17 [error] 42300#42300: *806 FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught Error: Call to a member function clearCache() on null in /var/www/my_site_user/data/www/my-site.ru/core/cache/includes/elements/modplugin/8.include.cache.php:34
Stack trace:
#0 /var/www/my_site_user/data/www/my-site.ru/core/model/modx/modscript.class.php(76): include()
#1 /var/www/my_site_user/data/www/my-site.ru/core/model/modx/modx.class.php(1674): modScript->process(NULL)
#2 /var/www/my_site_user/data/www/my-site.ru/core/model/modx/modx.class.php(2769): modX->invokeEvent('OnWebPageComple...')
#3 [internal function]: modX->_postProcess()
php-erorrs.log ругается на плагин с id 8. Вот тут обсуждали похожую тему: modx.pro/help/19871
Сам конфиг nginx не менял, его и не надо менять, т.к он переопределяется настройками в панели. Если вы переносили сайт, а не чистую установку делали — на всякий случай проверьте все пути в конфигах config.core.php и /core/config/config.inc.php, они должны быть вида /var/www/site_user/data/www/site.ru/… — при условии что вы создавали пользователя site_user через панель и там же добавляли сайт. Также посмотрите настройки url в системных настройках: сис. настройки -> core -> дружественные URL.
Спасибо! Все проверил. У вас в «Режиме работы PHP» выбрано «Версия PHP — PHP-FPM-php74»?
Да
Для выполнения данной настройки, следуйте приведенным ниже инструкциям:
Установите Nginx и PHP-FPM:
a. Обновите список пакетов и установите Nginx:
sudo apt update
sudo apt install nginx
b. Установите PHP-FPM и необходимые расширения:
sudo apt install php-fpm php-mysql
Настройте Nginx для обработки PHP-кода:
Создайте файл конфигурации виртуального хоста для вашего домена (например, example.com) в каталоге /etc/nginx/sites-available:
sudo nano /etc/nginx/sites-available/example.com
Вставьте следующую конфигурацию:
server {
listen 80;
listen [::]:80;
root /var/www/example.com;
index index.php index.html;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
# Обработка PHP-запросов
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
}
3. Создайте симлинк на созданный файл конфигурации:
```sh
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
Перезагрузите Nginx:
sudo systemctl reload nginx
Установите FastPanel и настройте MODX:
Для установки FastPanel, вам потребуется зарегистрировать аккаунт на их сервере и следовать инструкциям по установке. Процесс может отличаться в зависимости от того, используете ли вы установщик FastPanel или устанавливаете самостоятельно.
После успешной установки FastPanel, вы можете использовать его для настройки MODX. Вам потребуется создать новый сайт в панели управления и выбрать MODX в качестве используемой CMS. Затем следуйте инструкциям, предоставленным FastPanel для завершения настройки.
Обратите внимание, что процесс настройки может быть различным в зависимости от версии MODX, которую вы используете. В данном случае, мы используем MODX Revolution 2.8.5.
Пожалуйста, убедитесь, что вы следуете инструкциям, соответствующим вашей версии MODX.
Установите Nginx и PHP-FPM:
a. Обновите список пакетов и установите Nginx:
sudo apt update
sudo apt install nginx
b. Установите PHP-FPM и необходимые расширения:
sudo apt install php-fpm php-mysql
Настройте Nginx для обработки PHP-кода:
Создайте файл конфигурации виртуального хоста для вашего домена (например, example.com) в каталоге /etc/nginx/sites-available:
sudo nano /etc/nginx/sites-available/example.com
Вставьте следующую конфигурацию:
server {
listen 80;
listen [::]:80;
root /var/www/example.com;
index index.php index.html;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
# Обработка PHP-запросов
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
}
3. Создайте симлинк на созданный файл конфигурации:
```sh
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
Перезагрузите Nginx:
sudo systemctl reload nginx
Установите FastPanel и настройте MODX:
Для установки FastPanel, вам потребуется зарегистрировать аккаунт на их сервере и следовать инструкциям по установке. Процесс может отличаться в зависимости от того, используете ли вы установщик FastPanel или устанавливаете самостоятельно.
После успешной установки FastPanel, вы можете использовать его для настройки MODX. Вам потребуется создать новый сайт в панели управления и выбрать MODX в качестве используемой CMS. Затем следуйте инструкциям, предоставленным FastPanel для завершения настройки.
Обратите внимание, что процесс настройки может быть различным в зависимости от версии MODX, которую вы используете. В данном случае, мы используем MODX Revolution 2.8.5.
Пожалуйста, убедитесь, что вы следуете инструкциям, соответствующим вашей версии MODX.
Зачем? это из ЧатГПТ скопировано? Во время установки панели всё должно установиться и так, а все настройки можно сделать прямо в панели. У некоторых хостеров можно выбрать готовые образы сразу с предустановленной панелью.
Попробовал настроить таким образом получил что сайт в целом не открывается, открывается пустая страница и скачивается файл index.php.
Видимо обновилось что-то?
Видимо обновилось что-то?
Все настройки взяты с рабочего проекта, может быть, что-то было неправильно сделано…
31 июля 2024 разработчики обновили панель, после чего у меня перестал работать сайт. Пришлось поправить конфиг. Актуальный конфиг теперь такой:
server {
listen 10.10.10.10:80;
server_name my-site.ru www.my-site.ru;
return 301 https://my-site.ru$request_uri;
}
server {
listen 10.10.10.10:443 ssl http2;
server_name my-site.ru www.my-site.ru;
# Изменить имя сертификата, если создан другой сертификат (нужно выпустить wildcard, для корректной работы переадресации с www)
ssl_certificate /var/www/httpd-cert/my-site.ru_2023-06-27-00-03_12.crt;
ssl_certificate_key /var/www/httpd-cert/my-site.ru_2023-06-27-00-03_12.key;
charset utf-8;
gzip on;
gzip_min_length 1000;
gzip_proxied any;
gzip_types gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
gzip_comp_level 5;
set $root_path /var/www/my_site_user/data/www/my-site.ru;
root $root_path;
index index.php;
disable_symlinks if_not_owner from=$root_path;
location / {
root $root_path;
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?q=$1 last;
}
}
# Редирект с www на адрес без www
if ($host ~* '^www\.(.*)$') {
return 301 $scheme://$1$request_uri;
}
# Редирект с index.php на корень сайта:
if ($request_uri ~* '^/index.php$') {
return 301 /;
}
# Убираем повторяющиеся слеши из адреса
# Вариант, работающий только при merge_slashes = on
if ($request_uri ~ ^[^?]*//) {
rewrite ^ $uri permanent;
}
# Универсальный вариант
#if ($request_uri ~ ^(?P<left>[^?]*?)//+(?P<right>[^?]*)) {
# rewrite ^ $left/$right permanent;
#}
# Удаление слеша в конце URL
# Если изменили адрес админки MODX, то нужно указать его в условии этого правила, иначе будет бесконечный редирект.
#if ($request_uri ~ ".*/$") {
# rewrite ^/((?!core|connectors|manager|setup).*)/$ /$1 permanent;
#}
# Добавление слеша в конце URL
#if ($request_uri !~* "(?:\?)|(?:\.\w+$)|(?:\/$)") {
# return 301 $request_uri/;
#}
# Запрет для всех для при обращении к ядру MODx из браузера
location ~ ^/core/.* {
deny all;
return 403;
}
location ~ ^/config.core.php {
return 404;
}
location @rewrite {
rewrite ^/(.*)$ /index.php?q=$1;
}
location ~ \.php$ {
# Базовая авторизация в служебные каталоги
location ~* ^/(manager|connectors)/ {
auth_basic "Restricted Access";
auth_basic_user_file /var/www/my_site_user/data/.htpasswd;
try_files $uri $uri/ @rewrite;
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/my-site.ru.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
}
}
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/my-site.ru.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
}
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpeg|avi|zip|gz|bz2|rar|swf|ico|7z|doc|docx|map|ogg|otf|pdf|ttf|tif|txt|wav|webp|woff|woff2|xls|xlsx|xml)$ {
try_files $uri @rewrite;
access_log off;
expires 30d;
break;
}
location @fallback {
fastcgi_pass unix:/var/run/my-site.ru.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
location ~ /\.ht {
deny all;
}
include "/etc/nginx/fastpanel2-sites/my_site_user/my-site.ru.includes";
include /etc/nginx/fastpanel2-includes/*.conf;
error_log /var/www/my_site_user/data/logs/my-site.ru-frontend.error.log;
access_log /var/www/my_site_user/data/logs/my-site.ru-frontend.access.log;
}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.