Оптимизация для Wordpress: SSD VDS 4GB RAM 4 Core для сетки сайтов

Detektiv
На сайте с 28.02.2008
Offline
117
1383

Нужна помощь сообщества, в следующем вопросе - можно ли что-то "подшаманить", чтобы всё "летало" и MySQL не умирал, или надо переезжать на конфигурацию с лучшими характеристиками.

Пациент: VDS

  • 4 Core
  • 4 GB RAM
  • 40 GB SSD

Сайты проксируются через CloudFlare

my.cnf:


datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
max_connections=256
max_user_connections=128
wait_timeout=1024
query-cache-type=1
query-cache-size=128M
query-cache-limit=8M
interactive_timeout=1024
max_heap_table_size = 128M
tmp_table_size = 128M
thread_cache_size = 32
long_query_time=1
#log-queries-not-using-indexes
#log-slow-queries=/var/log/mysql/log-slow-queries.log

#innodb_use_native_aio = 0
innodb_file_per_table=1

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

nginx.conf:


# Server globals
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;


# Worker config
events {
worker_connections 4096;
use epoll;
}


http {
# Main settings
sendfile on;
tcp_nopush on;
tcp_nodelay on;
client_header_timeout 1m;
client_body_timeout 10;
client_header_buffer_size 2k;
client_body_buffer_size 256k;
client_max_body_size 10m;
large_client_header_buffers 4 8k;
send_timeout 2;
keepalive_timeout 30;
keepalive_requests 100;
reset_timedout_connection on;
server_tokens off;
server_name_in_redirect off;
server_names_hash_max_size 8192;
server_names_hash_bucket_size 512;


# Log format
log_format main '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format bytes '$body_bytes_sent';
#access_log /var/log/nginx/access.log main;
access_log off;
error_log /var/log/nginx/error.log crit;


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


# Compression
gzip on;
gzip_comp_level 9;
gzip_min_length 1024;
gzip_buffers 8 64k;
gzip_disable "msie6";
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
gzip_proxied any;


# Proxy settings
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_header Set-Cookie;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k;


# SSL PCI Compliance
ssl_ciphers RC4:HIGH:!aNULL:!MD5:!kEDH;
ssl_session_cache shared:SSL:10m;
ssl_prefer_server_ciphers on;


# Error pages
error_page 403 /error/403.html;
error_page 404 /error/404.html;
error_page 502 503 504 /error/50x.html;


# Cache
proxy_cache_path /var/cache/nginx levels=2 keys_zone=cache:10m inactive=60m max_size=512m;
proxy_temp_path /var/cache/nginx/temp;
proxy_cache_key "$host$request_uri $cookie_user";
proxy_ignore_headers Expires Cache-Control;
proxy_cache_use_stale error timeout invalid_header http_502;
proxy_cache_valid any 3d;

map $http_cookie $no_cache {
default 0;
~SESS 1;
~wordpress_logged_in 1;
}


# Wildcard include
include /etc/nginx/conf.d/*.conf;
}

mysqltuner.pl


>> MySQLTuner 1.4.0 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering
[OK] Currently running supported MySQL version 5.5.37
[OK] Operating on 64-bit architecture

-------- Storage Engine Statistics -------------------------------------------
[--] Status: +ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MRG_MYISAM
[--] Data in MyISAM tables: 13M (Tables: 87)
[--] Data in InnoDB tables: 80M (Tables: 258)
[--] Data in PERFORMANCE_SCHEMA tables: 0B (Tables: 17)
[--] Data in MEMORY tables: 0B (Tables: 3)
[!!] Total fragmented tables: 22

-------- Security Recommendations -------------------------------------------
[OK] All database users have passwords assigned

-------- Performance Metrics -------------------------------------------------
[--] Up for: 5m 22s (1K q [3.376 qps], 28 conn, TX: 9M, RX: 201K)
[--] Reads / Writes: 96% / 4%
[--] Total buffers: 536.0M global + 2.8M per thread (256 max threads)
[OK] Maximum possible memory usage: 1.2G (66% of installed RAM)
[OK] Slow queries: 0% (1/1K)
[OK] Highest usage of available connections: 0% (2/256)
[OK] Key buffer size / total MyISAM indexes: 8.0M/3.1M
[OK] Key buffer hit rate: 98.8% (68K cached / 795 reads)
[OK] Query cache efficiency: 57.1% (560 cached / 981 selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 0% (2 temp sorts / 209 sorts)
[!!] Temporary tables created on disk: 44% (44 on disk / 98 total)
[OK] Thread cache hit rate: 92% (2 created / 28 connections)
[OK] Table cache hit rate: 84% (37 open / 44 opened)
[OK] Open file limit used: 3% (40/1K)
[OK] Table locks acquired immediately: 100% (608 immediate / 608 locks)
[!!] Connections aborted: 7%
[OK] InnoDB buffer pool / data size: 128.0M/80.6M
[OK] InnoDB log waits: 0
-------- Recommendations -----------------------------------------------------
General recommendations:
Run OPTIMIZE TABLE to defragment tables for better performance
MySQL started within last 24 hours - recommendations may be inaccurate
Enable the slow query log to troubleshoot bad queries
When making adjustments, make tmp_table_size/max_heap_table_size equal
Reduce your SELECT DISTINCT queries without LIMIT clauses
Your applications are not closing MySQL connections properly
Variables to adjust:
tmp_table_size (> 128M)
max_heap_table_size (> 128M)

httpd.conf


ServerTokens OS
ServerRoot "/etc/httpd"
PidFile run/httpd.pid
Timeout 30
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 10

<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 10
ServerLimit 256
MaxClients 200
MaxRequestsPerChild 4000
</IfModule>

<IfModule worker.c>
StartServers 2
MaxClients 200
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 4000
</IfModule>

<IfModule itk.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>

Теперь про сайты:

80% - Wordpress сайтов по 100-5000 страниц

Основные плагины:

  • W3 Total Cache
  • WordPress SEO
  • Cyr-And-Lat
  • Contact Form 7
  • Hide My WP - скрывает админку от брутфорса.

20% планируется использовать под разные скрипты, но сейчас они не активны.

Суммарная посещаемость у данных 20+ сайтов 1500-2500 уников и до 5000 хитов в сутки (планируем увеличить посещаемость в раз 15)

Собственно, сам VDS, точнее MySQL умирает периодически, может раз в неделю, может каждый день умирать. Оживает только ребутом по ssh. Статика отдается очень быстро, это единственное что хорошего в этом VDS.

Также MySQL можно заставить умереть краулером Screaming Frog SEO Spider. Хотя, конкуренты в моей тематике тоже используют wordpress, но прогнав их через Screaming Frog SEO Spider они живут.

P.S.

Frog'ом парсится с такой скоростью:

Мой статический сайт: ~235 URl/s

Мой сайт на Wordpress: ~15 URl/s (умирает после 2-3 страниц - "connection timeout")

Конкурент на Wordpress: ~35 URl/s

Конкурент на ModX: ~125 URl/s

P.P.S.

Результаты tools.pingdom.com:

Мой статический сайт: Perf. grade 97/100 | Requests 40 | Load time 832ms | Page size 460.1kB

Мой сайт на Wordpress: Perf. grade: 69/100 | Requests 95 | Load time 1.31s | Page size 1.3MB

Конкурент на Wordpress: Perf. grade 78/100 | Requests 158 | Load time 2.83s | Page size 1.5MB

Конкурент на ModX: Perf. grade 86/100 | Requests 83 | Load time 242ms | Page size 805.8kB

K5
На сайте с 21.07.2010
Offline
209
#1
4GB RAM

и

***91;OK***93; Maximum possible memory usage: 1.2G (66% of installed RAM)

как то не вяжется

free -m

что говорит?

аська 45два48499два записки на работе (http://memoryhigh.ru) помогу с сайтом, удалю вирусы, настрою впс -> отзывы ТУТ (/ru/forum/836248) и ТАМ (http://www.maultalk.com/topic140187.html) !!!всегда проверяйте данные людей, которые сами пишут вам в аську или скайп!!!
Andreyka
На сайте с 19.02.2005
Offline
822
#2

Конечно можно

Nginx + кеш вместо w3c творят чудеса

Не стоит плодить сущности без необходимости
Detektiv
На сайте с 28.02.2008
Offline
117
#3
kgtu5:
как то не вяжется

Вы правы, как оказалось конфигурация не та, изменил на 6GB RAM и 4 Core - теперь всё летает.

Andreyka:
Nginx + кеш вместо w3c

Nginx вместе с W3 уже был активен.

P.S. пообщавшись со специалистами, пришел к выводу что текущая конфигурация VDS слабовата для поставленных задач (к тому же она оказалась в два раза слабее).

P.P.S. Важный момент, после публикации этого топика, ко мне начали стучаться "клоны" у которых в нике изменена одна-две буквы из раздела "Администрирование серверов и сайтов", и предлагать всё настроить, будьте внимательны.

K5
На сайте с 21.07.2010
Offline
209
#4
изменил на 6GB RAM

точно? до того тоже думали - 4, а оказалось 2...

теперь всё летает

интересно через сколько дней ситуация повториться?

Detektiv
На сайте с 28.02.2008
Offline
117
#5
kgtu5:
интересно через сколько дней ситуация повториться?

Понимаю ваш сарказм, поэтому буду искать админа не на разовую работу, а на сопровождение.

K5
На сайте с 21.07.2010
Offline
209
#6
сарказм

есть из-за чего - для примера my.cnf wait_timeout=1024

зачем держите соединение 17минут?

---------- Добавлено 04.02.2015 в 20:22 ----------

да и сравнение modx (как собственно и статичного) и wordpress некорректно - все таки это разные движки, разные разработчики, разная логика, кеширование в modx с движком идет, а не сторонними плагинами прикручено

V
На сайте с 05.08.2007
Offline
87
#7
Andreyka:
Конечно можно
Nginx + кеш вместо w3c творят чудеса
Detektiv:

Nginx вместе с W3 уже был активен.

Detektiv, обратите внимание, не "Nginx вместе с W3", а "Nginx + кеш вместо w3c".

С уважением, Victor (http://adm-lib.ru)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий