Image

База знаний → Настройка php-fpm на VPS для сайтов с большой посещаемостью

Сайты с высокой посещаемостью требуют специальной настройки служб, в зависимости от выбранного сервиса существуют рекомендации по достижению высокой производительности VPS сервера.

Обычного увеличения ресурсов недостаточно чтобы получить высокую производительность VPS сервера - необходимо также настроить службы.

По умолчанию службы имеют базовые настройки и подходят для типичных проектов с небольшой или средней посещаемостью.

Чтобы было примерное понимание, мы обозначим для себя критерии посещаемости:

  • Небольшая посещаемость сайта - до 10 000 в месяц (~300 в день, 1 посещение каждые 5 минут)
  • Средняя посещаемость сайта - от 10 000 до 90 000 - возьмем среднее значение - 50 000 в месяц (~1600 в день, 1 посещение каждую минуту)
  • Высокая посещаемость сайта - от 100 000 в месяц и более, т.е. от 2 посещений каждую минуту и выше.

Разберем конфигурацию где в качестве проксирующего веб сервера выступает nginx и в качестве основного обработчика php-fpm, в нашем примере php8.3-fpm.

В качестве сервера мы использовали VPS - Linux Debian 12, 6 CPU Core, 8 Gb RAM, SSD 50 GB.

Настраивать производительность мы будем именно на php8.3-fpm. С конфигурацией по умолчанию мы запустили скрипт анализа ссылок и спустя несколько минут показатель Rate упал с 9 запросов в секунду до 5. Спустя еще 5 минут производительность снизилась до 1.5 запросов в секунду и служба начала захлебываться и вскоре выдала ошибку Bad Gateway.

При этом нагрузка на сервере выросла не так сильно и еще было достаточно ресурсов, чтобы обслуживать запросы.

1. Новый файл конфигурации php-fpm

Создайте новый файл конфигурации в папке /etc/php/8.3/fpm/pool.d/domain.conf

Старый файл переименуйте в www.conf.bak - с таким названием он не будет использоваться и в случае необходимости вы сможете к нему вернутся, убрав префикс .bak

2. Сама конфигурация

[www]
user = www-data
group = www-data
listen = 127.0.0.1:9000
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

; Process manager
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 500
pm.max_spawn_rate = 32
pm.process_idle_timeout = 10s

; Connection settings
listen.backlog = 65535
listen.allowed_clients = 127.0.0.1

; Timeouts
request_terminate_timeout = 30s
request_slowlog_timeout = 5s
slowlog = /var/log/php8.3-fpm/slow.log

; Status monitoring
pm.status_path = /fpm-status
ping.path = /ping
ping.response = pong

; Logging
access.log = /var/log/php8.3-fpm/access.log
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{milli}dms"
catch_workers_output = yes
decorate_workers_output = no

; Security
security.limit_extensions = .php .php3 .php4 .php5 .php7 .php8
clear_env = no

; Performance tweaks
rlimit_files = 65535
rlimit_core = unlimited

; PHP settings
php_admin_value[error_log] = /var/log/php8.3-fpm/error.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 128M
php_admin_value[post_max_size] = 32M
php_admin_value[upload_max_filesize] = 32M
php_admin_value[max_execution_time] = 30
php_admin_value[session.gc_maxlifetime] = 1440

3. Дополнительные настройки

Если папки для лог событий нет, создайте ее:

mkdir -p /var/log/php8.3-fpm

3.1 Комментарии к конфигурации

  • listen = 127.0.0.1:9000 - укажите как в nginx или наоборот, должно совпадать.
  • pm.max_children = 50 - зависит от оперативной памяти (50MB на каждый child → ~2GB для PHP)
  • pm.start_servers = 10 - ~20% от pm.max_children
  • pm.max_requests = 500 - Перезапустим workers после 500 запросов во избежание утечки памяти (со стороны посетителя никак не заметно и не влияет на работу).
  • request_terminate_timeout = 30s - прерывание зависших запросов.

request_slowlog_timeout = 5s - логируем медленные запросы slowlog = /var/log/php-fpm/slow.log

В логе медленных запросов в случае если сайт работает на CMS большой пользы не принесет, так как там будет некий стек, но увидеть временной интервал начала и завершения будет полезной информацией.

При необходимости просматривать /fpm-status добавьте в nginx следующую конфигурацию в раздел server

    location = /fpm-status {
    allow 127.0.0.1;    # Разрешаем только локальный доступ
    allow 192.168.10.100; # Или вашу доверенную сеть
    deny all;          # Запрещаем всем остальным

    include /etc/nginx/fastcgi_params;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME $request_filename;
    }

Вывод информации будет следующего содержания:

pool:                 www
process manager:      dynamic
start time:           04/Jun/2025:18:16:50 +0000
start since:          814
accepted conn:        239
listen queue:         0
max listen queue:     0
listen queue len:     128
idle processes:       9
active processes:     1
total processes:      10
max active processes: 3
max children reached: 0
slow requests:        0

4. Применение новой конфигурации

Проверьте файл на наличие ошибок командой:

php-fpm8.3 -t

В случае если их нет, перезапустите службу:

systemctl restart php8.3-fpm

5. Повторное тестирование

С новой конфигурацией нагрузка на процессор при аналогичном тестировании заметно увеличилась, в то время как показатели производительности через несколько минут снизились всего на 20% с 9 запросов в секунду до 7 и более не снижались, при этом все запросы (порядка 10 000 запросов в течение 25 минут, что равно 400 запросам в минуту и ~ 7 в секунду) были успешно выполнены, т.е. в ответе на все запросы был код 200.

Даже визуально при одновременном тестировании и переходе по страницам сайта он стал работать заметно быстрее. Теперь с такой конфигурацией веб службы - ресурс сервера полностью задействуется, а не простаивает как это было ранее.





Нет комментариев