У нас есть VPS-сервер, выделенный для единый сайт. Изо дня в день кажется, что он работает нормально (скажем, 20-50 одновременных пользователей), но как только мы набираем около 90+ одновременных пользователей, сервер начинает аварийно завершать работу / тайм-аут. Он начнет показывать ошибку тайм-аута шлюза 504 nginx.
У нас были некоторые проблемы в начале года, когда загрузка некоторых страниц с большим объемом данных занимала около 7 секунд, которые нам удалось решить на 90% путем оптимизации запросов mysql. и используя кеш myqsl. Однако, похоже, это не помогает!
Когда я говорю, что данные тяжелые, он загружает примерно 5000 записей из БД, через структуру.
Сервер работает под управлением Ubuntu 15.10 с 4 процессорами и 4 ГБ памяти. Mysql находится на собственном сервере с 1 ГБ памяти. Сервер mysql, похоже, не достигает 30% использования даже при 100 пользователях.
Mysql настроен на 64 МБ query_cache_size
и 6 МБ query_cache_limit
У нас установлен APC но, похоже, в целом нет большой разницы
Это наш nginx.conf
user www-data;
worker_processes 4;
pid /run/nginx.pid;
events {
worker_connections 1024;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 15;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
client_body_buffer_size 32k;
client_header_buffer_size 8k;
large_client_header_buffers 8 64k;
#client_body_buffer_size 10K;
#client_header_buffer_size 1k;
client_max_body_size 12m;
#large_client_header_buffers 2 1k;
fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=microcache:100m inactive=10m max_size=1024m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
#access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
gzip_comp_level 3;
gzip_vary on;
gzip_proxied any;
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 application/javascript text/x-js;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Это серверный блок
server {
listen 80 default;
server_name www.website.com;
root /var/www/website.com/httpdocs;
index index.php index.html index.htm;
location / {
try_files $uri @handler;
}
error_page 404 /assets/error-404.html;
error_page 500 /assets/error-500.html;
location @handler {
expires off;
include fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
# fastcgi caching
#Cache everything by default
set $no_cache 0;
if ($request_method !~ ^(GET|HEAD)$) {
set $no_cache "1";
}
#Don't cache the following URLs
if ($request_uri ~* "/(admin/|member/)")
{
set $no_cache 1;
}
#fastcgi_no_cache $no_cache;
#fastcgi_cache_bypass $no_cache;
#fastcgi_cache microcache;
#fastcgi_cache_key $scheme$host$request_uri$request_method;
#fastcgi_cache_valid 200 301 302 10m;
#fastcgi_cache_use_stale updating error timeout invalid_header http_500;
#fastcgi_pass_header Set-Cookie;
#fastcgi_pass_header Cookie;
#fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
fastcgi_param SCRIPT_FILENAME $document_root/framework/main.php;
fastcgi_param SCRIPT_NAME /framework/main.php;
fastcgi_param QUERY_STRING url=$uri&$args;
fastcgi_buffer_size 32k;
fastcgi_buffers 4 32k;
fastcgi_busy_buffers_size 64k;
}
}
Это pool.d / www.conf details
pm = dynamic
pm.max_children = 30
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 4
pm.max_requests = 500
PHP настроен на 128 Мб памяти , однако размер каждого процесса обычно составляет ~ 70 МБ
. Мне не удалось получить вершину , когда он был на 100 пользователей, но это обычное состояние:
total used free shared buffers cached
Mem: 3951 3793 157 114 273 2918
-/+ buffers/cache: 602 3348
Swap: 0 0 0
Вы увидите, что я сделал некоторые эксперименты с fastcgi_cache nginx, что привело к огромной разнице в производительности (время загрузки 50–100 мсек), однако на веб-сайте есть множество пользовательских функций (загрузка, изменение и т. д.), которые не работали при его включении.
Я бы хотел хотел бы еще раз взглянуть на fastcgi_cache, но я чувствую, что мы должны иметь возможность получить лучший результат на этом текущем сервере и без него?!
Мы уже какое-то время боролись с этим, так что любая помощь будет большой.
Вы установили pm.max_children
на 30, что означает, что одновременно может выполняться только 30 одновременных сценариев PHP.
Когда больше пользователей посещают на ваших сайтах нет свободных PHP-процессов для обслуживания запроса. nginx
ждет некоторое время, прежде чем вернуть ошибку 504 Gateway Time-out
.
Похоже, у вас достаточно свободной памяти, так как столбец cached
показывает 2,9 ГБ свободной памяти.
Вы должны проверить среднее использование памяти вашими процессами PHP с помощью команды top
. Нас интересует использование памяти в столбце RES
. Разделите 2 ГБ на это число, и вы получите безопасное число для параметра pm.max_children
.
Вам также следует подумать об увеличении значения для pm.start_servers
, ] pm.min_spare_servers
и pm.max_spare_servers
.
Запасные серверы - это процессы, которые доступны для немедленного обслуживания запросов. В противном случае менеджеру процессов PHP потребуется запустить процесс отдельно, что займет некоторое время.