Настройка высокого-raffic nginx и сервера Wordpress

Я проводил нагрузочные тесты (через blitz.io), поскольку я пытаюсь настроить производительность сервера на пуле серверов рабочий php 5.5, Wordpress 3.9.1 и nginx 1.6.2.

Мой беспорядок возникает, когда я перегружаю единственный сервер со слишком большим трафиком. Я полностью понимаю, что существуют конечные ресурсы на сервере, и на некотором уровне он должен будет начать отклонять соединения и/или возвращаться 502 (или подобный) ответы. Что смущает меня, хотя, то, почему мой сервер, кажется, возвращает 502 с настолько рано в рамках нагрузочного теста.

Я попытался настроить nginx для принятия нескольких соединений:

nginx.conf

worker_processes auto;
worker_rlimit_nofile 100000;

events {
    worker_connections 1024;
    use epoll;
    multi_accept on;
}

site.conf

location ~ \.php$ {
      try_files $uri =404;
      include /etc/nginx/fastcgi_params;
      fastcgi_pass unix:/var/run/php5-fpm.sock;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_read_timeout 60s;
      fastcgi_send_timeout 60s;
      fastcgi_next_upstream_timeout 0;
      fastcgi_connect_timeout 60s;
   }

php www.conf

pm = static
pm.max_children = 8

Я ожидаю, что нагрузочный тест будет насыщать рабочих PHP скорее быстро. Но я также ожидаю, что nginx продолжит принимать соединения и после того, как fast_cgi тайм-ауты будут поражены, начнут возвращать своего рода код Ошибки HTTP.

То, что я на самом деле вижу, является nginx возврат 502 с почти сразу после того, как тест запускается.

nginx error.log

2014/11/01 20:35:24 [error] 16688#0: *25837 connect() to unix:/var/run/php5-fpm.sock failed 
(11: Resource temporarily unavailable) while connecting to upstream, client: OBFUSCATED, 
server: OBFUSCATED, request: "GET /?bust=1 HTTP/1.1", upstream: 
"fastcgi://unix:/var/run/php5-fpm.sock:", host: "OBFUSCATED"

Что я пропускаю? Почему незаконченные запросы не стоят в очереди, и затем или завершаются или испытывают таймаут позже в процессе?

0
задан 1 November 2014 в 23:14
2 ответа

Это означает, что часть php вышла из строя и больше не слушает сокет unix.

Так что nginx не будет ставить что-либо в очередь, поскольку он просто не может связаться с прокси-сервером для отправки запроса, и на этом этапе вы можете легко представить, что запросы обрабатываются очень быстро на стороне nginx.

Если ваш php-сервер не выйдет из строя, запросы будут действительно в режиме ожидания относительно значений fastcgi_connect_timeout и fastcgi_read_timeout , ожидая появления какого-либо события. Если эти таймауты были достигнуты, вы должны увидеть коды ошибок 504 .

Ваши worker_connections , кстати, кажутся немного низкими по сравнению с rlimit.

Также может быть пора начать использование блока восходящего потока , чтобы решить, как должен вести себя nginx, когда целевые серверы не работают, с помощью проверок работоспособности. С его помощью вы можете управлять продолжительностью задержки, по достижении которой сервер будет отмечен как неработающий. После того, как он считается отключенным, запросы не дойдут до него до тех пор, пока не будет выполнено условие проверки работоспособности, чтобы пометить его снова.

0
ответ дан 5 December 2019 в 13:04

Ваша проблема, скорее всего, связана с конфигурацией PHP-FPM, потому что вы используют статический диспетчер процессов только с 8 дочерними процессами. Практически любое нагрузочное тестирование будет использовать эти 8 дочерних процессов мгновенно и потребовать большего - когда нет незанятого дочернего процесса для обработки кода PHP, вы получите 502 ошибки, которые видите.

Вам следует переключитесь на динамический или даже лучше (на мой взгляд) ondemand.

Кроме того, установите для max_children достаточно высокое значение, в зависимости от того, какие типы нагрузочных тестов вы выполняете. Не зная подробностей выполняемых вами тестов, я не могу предложить никаких значений для max_children. В моем случае, когда у меня есть несколько сайтов, которые в целом получают ~ 2500 уникальных посетителей и ~ 15000 просмотров страниц ежедневно, для моего max_children установлено значение 64, и оно никогда не приближается к этому числу. Я установил его выше, чем мне нужно, потому что нагрузочное тестирование показало, что мой сервер может обрабатывать намного больше трафика, чем он получает в настоящее время.

Как только вы успешно проведете нагрузочные тесты, у вас будет лучшее представление о том, как настроить ваша конфигурация PHP-FPM. Я бы сказал, установите max_children равным 64, как я; просто проверьте журнал PHP-FPM, чтобы узнать, не превышаете ли вы этот предел, и при необходимости увеличьте его.

0
ответ дан 5 December 2019 в 13:04

Теги

Похожие вопросы