Настройка конфигурации 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.

Стандартно он выглядит так:

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, а лучше перезагрузите сервер.

И самое главное — не забывайте сделать бэкап вашего сервера целиком перед настройкой!
Дмитрий
10 февраля 2023, 22:22
modx.pro
5
4 533
0

Комментарии: 12

Columb
29 ноября 2023, 04:14
0
Спасибо, что поделились настройкой конфигов, но у меня так и получилось запустить (перенести) сайт. При первом «запуске» — сайт работает, но при переходе по всем ссылкам сайта получаю главную страницу (при этом в браузере ссылки меняются). Если вручную внести ваш конфиг, то при переходе по ссылкам сайта получаю — 404 Not Found. Меняли ли вы сам конфиг nginx.config сервера?
    Николай Савин
    29 ноября 2023, 09:20
    +1
    Вот так вот без логов и подробностей сложно сказать что пошло не так. Чаще всего на практике проблемы возникают с правами. Не так юзера назвали, не того юзера прописали в 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
    Там по любому будет обозначено, где проблема.
      Columb
      29 ноября 2023, 15:28
      0
      Спасибо, в логах имеем вот такие ошибки
      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.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" 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()
        Дмитрий
        29 ноября 2023, 15:46
        +1
        php-erorrs.log ругается на плагин с id 8. Вот тут обсуждали похожую тему: modx.pro/help/19871
      Дмитрий
      29 ноября 2023, 14:51
      +1
      Сам конфиг nginx не менял, его и не надо менять, т.к он переопределяется настройками в панели. Если вы переносили сайт, а не чистую установку делали — на всякий случай проверьте все пути в конфигах config.core.php и /core/config/config.inc.php, они должны быть вида /var/www/site_user/data/www/site.ru/… — при условии что вы создавали пользователя site_user через панель и там же добавляли сайт. Также посмотрите настройки url в системных настройках: сис. настройки -> core -> дружественные URL.

        Columb
        29 ноября 2023, 15:32
        0
        Спасибо! Все проверил. У вас в «Режиме работы PHP» выбрано «Версия PHP — PHP-FPM-php74»?
    Sergei Petrov
    04 декабря 2023, 13:13
    -2
    Для выполнения данной настройки, следуйте приведенным ниже инструкциям:

    Установите 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.
      Дмитрий
      04 декабря 2023, 14:12
      0
      Зачем? это из ЧатГПТ скопировано? Во время установки панели всё должно установиться и так, а все настройки можно сделать прямо в панели. У некоторых хостеров можно выбрать готовые образы сразу с предустановленной панелью.
      Вячеслав Варов
      08 мая 2024, 13:21
      0
      Попробовал настроить таким образом получил что сайт в целом не открывается, открывается пустая страница и скачивается файл index.php.

      Видимо обновилось что-то?
        Дмитрий
        08 мая 2024, 19:59
        0
        Все настройки взяты с рабочего проекта, может быть, что-то было неправильно сделано…
        Дмитрий
        07 августа 2024, 21:24
        0
        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;
        }
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          12