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

php-fpm и nginx @ высокая загрузка процессора?

Мой сервер находится в DigitalOcean со следующим планом:

2 Core Processor
2 GB Memory

Мой веб-сайт посещают тысячи посетителей, однако оба ядра процессора имеют @ 100%:

Кажется, проблема в php-fpm и nginx: worker process. Я сделал десятки оптимизаций для своего сервера, но все еще не могу заставить его успокоиться.

Вот мой nginx.conf:

user www-data;
worker_processes 2;
pid /run/nginx.pid;

events {
    worker_connections 2048;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    server_tokens off;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log off;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    gzip_vary on;
    gzip_proxied expired no-cache no-store private auth;
    gzip_comp_level 2;
    gzip_min_length 1000;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Buffers
    ##

    client_body_buffer_size 10K;
    client_header_buffer_size 1k;
    client_max_body_size 8m;
    large_client_header_buffers 2 1k;

    ##
    # nginx-naxsi config
    ##
    # Uncomment it if you installed nginx-naxsi
    ##

    #include /etc/nginx/naxsi_core.rules;

    ##
    # nginx-passenger config
    ##
    # Uncomment it if you installed nginx-passenger
    ##

    #passenger_root /usr;
    #passenger_ruby /usr/bin/ruby;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Вот параметры, которые я включил в php-fpm www.conf:

user = www-data
group = www-data
listen = /var/run/php5-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = ondemand
pm.max_children = 20
pm.start_servers = 2
pm.min_spare_servers = 1
pm.process_idle_timeout = 10s;
pm.max_requests = 500
request_terminate_timeout = 20

Как я могу уберечь свой сервер от перегрузки? Что еще можно изменить?

Запуск PHP стоит дорого с точки зрения использования ЦП и оперативной памяти. Каждый раз, когда вы можете избежать вызова интерпретатора PHP, вам следует. Кэширование - это основной способ сделать это, если контент не создается для каждого пользователя.

Мой маленький AWS t2.micro может обрабатывать около 2500 страниц в секунду из своего кеша Nginx, но около 20 страниц в секунду, если нужно вызвать PHP (HHVM). Это кеширование снижает мой ежемесячный счет, потому что, если бы мне пришлось создавать страницы для каждого пользователя, мне понадобился бы экземпляр гораздо более мощного размера, который стоит дороже.

Микрокеширование - один из вариантов, который хорошо подходит для быстро меняющегося сайта. Кэширование всего за 1 секунду может иметь огромные преимущества. Конечно, если ваш сайт меняется медленно, увеличение времени кеширования еще больше снизит нагрузку на процессор.

Другие варианты включают: - Запуск более эффективного интерпретатора PHP - PHP7 или HHVM - Оптимизация кода PHP - Запуск CDN. Это может легко разгрузить статические ресурсы, и если вы правильно установите заголовки страниц (время истечения срока действия и статус кеширования) и CDN, он сможет обслуживать страницы напрямую. я использую CloudFlare с Правилом страницы, которое сообщает ему «Кэшировать все», включая HTML (который генерируется PHP). Результатом является более быстрый веб-сайт для пользователей, сокращение использования ЦП и полосы пропускания, а CloudFlare предлагает бесплатный план, который подходит многим.

Вы можете использовать другие системы кэширования, такие как Varnish, который часто используется с HAProxy для балансировки нагрузки. Между этими двумя продуктами существует некое пересечение - HAProxy может выполнять кэширование, Varnish может выполнять некоторую балансировку нагрузки. Подробнее о них Вот.