Сайты с высокой посещаемостью требуют специальной настройки служб, в зависимости от выбранного сервиса существуют рекомендации по достижению высокой производительности 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.
Даже визуально при одновременном тестировании и переходе по страницам сайта он стал работать заметно быстрее. Теперь с такой конфигурацией веб службы - ресурс сервера полностью задействуется, а не простаивает как это было ранее.