Я настраиваю свой первый VPS, и, похоже, он работает хорошо. Установлены Nginx, php-fpm (как сокет unix), APC, Varnish и MySQL на сервере Ubuntu 12.04 с OnApp, и все работает и чертовски быстро, по крайней мере, на моей стороне.
У меня есть VPS с 1 ядром (Xeon (R) X5660 - это то, что VPS использует iirc), 1,2 ГГц и 768 МБ ОЗУ, все ограничено OnApp. Пройдя тест на пресс, я получил следующее:
ab -c 10 -n 1000 http://198.136.50.39/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 198.136.50.39 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software:
Server Hostname: 198.136.50.39
Server Port: 80
Document Path: /
Document Length: 6482 bytes
Concurrency Level: 10
Time taken for tests: 41.695 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 6952000 bytes
HTML transferred: 6482000 bytes
Requests per second: 23.98 [#/sec] (mean)
Time per request: 416.946 [ms] (mean)
Time per request: 41.695 [ms] (mean, across all concurrent requests)
Transfer rate: 162.83 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 167 203 57.3 182 614
Processing: 173 212 82.9 189 2015
Waiting: 169 206 59.8 185 726
Total: 345 415 126.5 373 2419
Percentage of the requests served within a certain time (ms)
50% 373
66% 388
75% 410
80% 430
90% 504
95% 708
98% 866
99% 931
100% 2419 (longest request)
Пока я проводил тест, я смотрел статистику VPS с помощью htop, и похоже, что он не использовал более 230 МБ ОЗУ во всем тесте, а ЦП оставался на 2 ~ 4% использования, что довольно круто, я думаю . Но похоже, что количество запросов в секунду было довольно низким. Что, вы парни, думаете? Это нормально для моей настройки, и я параноик, или это плохо? С настройками по умолчанию я использовал loadimpact.com, чтобы посмотреть, с 25 пользователями (бесплатный тест по умолчанию) и загрузкой по умолчанию как 130 мс ... после того, как я начал путаться с настройками, снова провел тест, и он подскочил до 250 мс, поэтому я думаю, я делаю что-то не так.
Я начал пытаться оптимизировать MySQL для этого, используя наставления, которые я нашел в Интернете для бюджетных боксов и https://tools.percona.com/. Percona дала мне действительно большие цифры, так что я смешал и то, и другое.
Я также оптимизировал php-fpm и Nginx, читая их вики и руководства по всему Интернету. Я буду использовать этот VPS для веб-сайта WordPress с примерно 5 тыс. Посетителей в день и 13-15 тыс. Просмотров страниц в день. W3 Total Cache настроен для кеширования базы данных и объектов с использованием APC и минимизации / кеширования страниц с расширенным диском ... но прежде чем я перенесу сайт на этот сервер и начну с ним работать, я хочу все оптимизировать и быть уверенным, что он будет быть быстрым.
Я также использую MaxCDN (не активен на банкомате VPS) и буду использовать CloudFlare в качестве DNS-сервера. Кто-нибудь может помочь мне его оптимизировать, пожалуйста?
Моя конфигурация MySQL выглядит так:
[mysqld_safe]
open_files_limit = 8192
[mysqld]
skip_external_locking
skip_slave_start
bind-address = 127.0.0.1
key_buffer = 64M
join_buffer_size = 1M
read_buffer_size = 1M
sort_buffer_size = 2M
max_allowed_packet = 16M
max_connect_errors = 10
thread_stack = 192K
myisam-recover = BACKUP
max_connections = 400
table_cache = 1024
thread_cache_size = 286
interactive_timeout = 25
wait_timeout = 1000
query_cache_type = 1
query_cache_limit = 1M
query_cache_size = 32M
max_write_lock_count = 1
expire_logs_days = 10
max_binlog_size = 100M
innodb_flush_method = O_DIRECT
innodb_buffer_pool_size = 10M
skip_name_resolve
sql_mode = STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY
tmp_table_size = 16M
max_heap_table_size = 16M
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
[mysql]
#no-auto-rehash # faster start of mysql but no tab completition
[isamchk]
key_buffer = 16M
Моя конфигурация Nginx выглядит так:
worker_processes 1;
events {
worker_connections 1024;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 15;
types_hash_max_size 2048;
server_tokens off;
open_file_cache max=1000 inactive=300s;
open_file_cache_valid 360s;
open_file_cache_min_uses 2;
open_file_cache_errors off;
client_body_buffer_size 8K;
client_header_buffer_size 1k;
client_max_body_size 2m;
large_client_header_buffers 2 1k;
client_body_timeout 10;
client_header_timeout 10;
send_timeout 10;
include /etc/nginx/mime.types;
default_type application/octet-stream;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 9;
gzip_buffers 16 8k;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
Конфигурация Nginx моего сайта выглядит так:
server {
listen 8080;
server_name www.ubuntubrsc.com ubuntubrsc.com;
root /var/www;
index index.php index.html index.htm;
include /var/www/nginx.conf;
error_log /var/log/nginx/blog.error_log;
if ($host ~* ^[^.]+\.[^.]+$) {
rewrite ^(.*)$ http://www.$host$1 permanent;
}
location / {
try_files $uri $uri/ /index.php;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
location ~* ^/wp-content/uploads/.*.php$ {
deny all;
access_log off;
log_not_found off;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
location ~ \.(css|js|htc)$ {
root /var/www/ubuntu-online/;
expires 31536000s;
add_header Pragma "public";
add_header Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate";
}
location ~ \.(html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml)$ {
root /var/www/ubuntu-online/;
expires 3600s;
add_header Pragma "public";
add_header Cache-Control "max-age=3600, public, must-revalidate, proxy-revalidate";
}
location ~ \.(gif|gz|gzip|ico|jpg|jpeg|jpe|swf)$ {
root /var/www/ubuntu-online/;
expires 31536000s;
add_header Pragma "public";
add_header Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate";
}
error_page 404 = @wordpress;
log_not_found off;
location @wordpress {
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_NAME /index.php;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
location ~ \.php$ {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
if (-f $request_filename) {
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
}
}
Часть кеша для ubuntu-online связана с тем, что я не знаю, доступны ли настройки W3 Total Cache для всех папок внутри / www / var /, поэтому я добавил те, у которых "root / var / www / ubuntu-online /" будет конечно. Стоит ли их стереть?
На php.ini я отредактировал некоторые вещи для повышения безопасности, такие как open_basedir и другие, а также включил внутренний кеш php, редактирующий 2 строки, но не могу вспомнить, что это было.
Также это настройки APC:
[APC]
apc.enabled = 1
apc.cache_by_default = 1
apc.stat = 1
apc.shm_segments = 1
apc.shm_size = 64
apc.ttl = 7200
И, наконец, мой пул php-fpm:
listen = /var/run/php5-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0666
pm.max_children = 9
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 200
Кроме того, как я узнаю, что Varnish работает с WordPress? Я знаю, что мне нужно сделать несколько конкретных конфигураций, чтобы Varnish и WP хорошо играли вместе, и я следил за этим https://github.com/nicolargo/varnish-nginx-wordpress, но как я узнаю, что это работает?
Заранее спасибо всем (:
У вас очень хорошая настройка для вашей нагрузки. 20rps на php скрипты достаточно для 200k + ежедневных просмотров страниц.
Что нужно настроить для вас: innodb_buffer_pool_size = 10M
- это довольно маленькая стоимость. Все ваши активные данные в innodb должны соответствовать пулу буферов, оставляя достаточно места для журналов транзакций.
worker_connections 1024;
- вы можете выбежать из этого довольно быстро. Я бы посоветовал вам проверить соединения nginx под реальной нагрузкой с помощью модуля stubstatus и настроить эти первые несколько дней, когда ваша служба будет работать.
Вы также можете увеличить параллелизм PHP pm.max_children = 9
- использовать дополнительную оперативную память и процессор. Сделайте это, если у вас есть проблемы с полным бэклогом tcp (ss -nl
)
Вы можете достичь предела max_children, если у вас высокая частота запросов и / или ваши скрипты достаточно медленные. Увеличение максимального числа рабочих потоков / процессов приведет к увеличению средней нагрузки, если ваши скрипты привязаны к процессору.
Позвольте мне показать вам основную и приблизительную математику. У вас есть скрипты, которые работают 100 мс и используют время процессора 5 мс (100 мс - это ожидание ввода-вывода диска / сети) - в среднем.
Если у вас более 9 * 1000/100 = 90 запросов в секунду, ваш бэклог TCP начнет расти, и новые запросы будут ждать некоторое время, пока оно не начнется.
Ваши скрипты будут потреблять 90 * 10/1000 = 45% пользовательского времени процессора от одного ядра процессора. Немного, не правда ли?
Если вы увеличите max_children до 15, у вас может быть 150 запросов в секунду без замедления, но скрипты могут потреблять 75% времени одноядерного процессора.
Это хорошо, пока у вас не будет слишком много нагрузки. Если у вас будет недостаточно ЦП или ОЗУ для работы с выбранным параллелизмом - ваш сервер достигнет средней нагрузки - это означает, что скрипты будут замедляться из-за перегрузки ЦП. Сервер со средней нагрузкой, примерно в 2-4 раза превышающей количество ядер процессора, обычно достаточно отзывчив. Обработка запросов будет несколько медленнее, но вы можете обрабатывать более высокую частоту запросов. Если вам не хватит оперативной памяти - сервер начнет свопинг, загрузку дисков и троттлинг процессора.
Итак, слишком мало max_children - вы не справитесь с высокой частотой запросов. Слишком много - и ваш сервер зависнет при большой нагрузке.