Назад | Перейти на главную страницу

Как определить: что медленнее - nginx или PHP-cgi?

У меня есть сайт с большим объемом трафика. Я использую nginx и php fast-cgi. Однако при загрузке простых php-документов в браузере загрузка страницы занимает до 5-6 секунд. Иногда это даже просто приводит к ошибке nginx «404 not found».

Когда я использую "htop" в debian, я даже близко не использую ресурсы своего сервера. Так что же происходит? Это nginx? Это PHP-fast-cgi? Я не могу сказать, где горлышко бутылки.

Фрагмент моей конфигурации nginx:

user  www-data www-data;
worker_processes  2;

events {
    worker_connections  4048;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  10;
    include /usr/local/nginx/sites-enabled/*;
...
}

Фрагмент моей конфигурации fast-cgi:

EXEC_AS_USER=www-data

# Host and TCP port for FASTCGI-Listener (default: localhost:9000)

FCGI_HOST=localhost
FCGI_PORT=9000

# Environment variables, which are processed by PHP

PHP_FCGI_CHILDREN=8
PHP_FCGI_MAX_REQUESTS=0

Большое спасибо!!

Завершите работу сервера, установите strace на все процессы php и nginx, попробуйте запрос и посмотрите, где он ждет.

В качестве альтернативы поищите инструмент профилирования для php и соберите с его помощью некоторые данные.

  1. Попробуйте настроить FastCGI как сокет unix, а не как интернет-сокет. В некоторых случаях это сэкономит вам до 20% потраченного времени.
  2. Вы можете увеличить количество рабочих_процессов до количества доступных ядер.
  3. Проверьте конфигурацию php-fpm, так как в ней достаточно опций для:
    • убить очень длинные запросы;
    • отчет о длительном запросе.
  4. Измените PHP_FCGI_MAX_REQUESTS на что-нибудь подходящее, например, 1000. Просто на случай повреждения памяти.

Сколько стоит трафик? Всего несколько советов:

  • как можно больше использовать кеш
  • количество рабочих процессов может быть равно количеству ядер процессора
  • закройте живые соединения как можно раньше или отключите их полностью (попробуйте, скажем, keepalive_timeout 5)
  • каждое соединение требует дескриптора файла worker_rlimit_nofile 20000;
  • общее количество пользователей, которых вы можете обслужить за 1 секунду (приблизительно) = worker_processes * worker_connections/ (keepalive_timeout * 2)
  • отключите журналы доступа, если они вам действительно не нужны
  • использовать балансировщик (если это невозможно с одним сервером)