Статьи

Девять советов по улучшению производительности WordPress с NGINX

WordPress является крупнейшей в мире платформой для создания веб-сайтов и доставки веб-приложений. Около  четверти  всех сайтов теперь построены на программном обеспечении WordPress с открытым исходным кодом, включая сайты для eBay, Mozilla, RackSpace, TechCrunch, CNN, MTV, New York Times, Wall Street Journal.

WordPress.com, самый популярный сайт для пользовательских блогов, также работает на WordPress с открытым исходным кодом. NGINX поддерживает WordPress.com . Среди клиентов WordPress многие сайты начинаются с WordPress.com, а затем переходят на программное обеспечение с открытым исходным кодом WordPress; все больше и больше сайтов используют программное обеспечение NGINX.

Привлекательность WordPress заключается в его простоте, как для конечных пользователей, так и для внедрения. Тем не менее, архитектура сайта WordPress создает проблемы при увеличении использования — и несколько шагов, включая кэширование и комбинирование WordPress и NGINX, могут решить эти проблемы.

В этом блоге мы предлагаем девять советов по производительности, которые помогут преодолеть типичные проблемы производительности WordPress:

  1. Кэшировать статические ресурсы
  2. Кешировать динамические файлы
  3. Переместить в NGINX
  4. Добавить поддержку постоянных ссылок в NGINX
  5. Настройте NGINX для FastCGI
  6. Настройте NGINX для W3_Total_Cache
  7. Настройте NGINX для WP-Super-Cache
  8. Добавьте меры безопасности в вашу конфигурацию NGINX
  9. Настройте NGINX для поддержки WordPress Multisite

Производительность WordPress на сайтах LAMP

Большинство сайтов WordPress работают в традиционном программном стеке LAMP: ОС Linux, программное обеспечение веб-сервера Apache, программное обеспечение базы данных MySQL — часто на отдельном сервере баз данных — и язык программирования PHP. Каждый из них является очень известным, широко используемым инструментом с открытым исходным кодом. Большинство людей в мире WordPress «говорят» на ЛАМПЕ, поэтому легко получить помощь и поддержку.

Когда пользователь посещает сайт WordPress, браузер, использующий комбинацию Linux / Apache, создает от шести до восьми подключений на пользователя. Когда пользователь перемещается по сайту, PHP собирает каждую страницу на лету, собирая ресурсы из базы данных MySQL для ответа на запросы.

Стеки LAMP хорошо работают от нескольких до, возможно, сотен одновременных пользователей. Тем не менее, внезапное увеличение трафика является обычным явлением в Интернете, и, как правило, это хорошо.

Но когда сайт LAMP-стека становится занятым, и количество одновременных пользователей достигает сотен или тысяч, у него могут возникнуть серьезные узкие места. Две основные причины узких мест:

  1. Веб-сервер Apache — Apache потребляет значительные ресурсы для каждого соединения. Если Apache принимает слишком много одновременных подключений, память может быть исчерпана, а производительность снижается, поскольку данные должны перемещаться на диск и обратно. Если количество соединений ограничено для защиты времени отклика, новые соединения должны ждать, что также приводит к ухудшению работы пользователей.
  2. Взаимодействие PHP / MySQL — вместе сервер приложений, работающий на PHP, и сервер базы данных MySQL могут обслуживать максимальное количество запросов в секунду. Когда количество запросов превышает максимум, пользователям приходится ждать. Превышение максимального значения на относительно небольшую величину может привести к значительному замедлению реакции всех пользователей. Превышение его в два или более раз может привести к значительным проблемам с производительностью.

Узкие места в производительности на сайте LAMP особенно устойчивы к обычному инстинктивному отклику, который заключается в обновлении до более мощного оборудования — больше процессоров, больше дискового пространства и так далее. Постепенное увеличение производительности оборудования не может угнаться за экспоненциальным увеличением спроса на системные ресурсы, которое испытывают Apache и комбинация PHP / MySQL, когда они перегружаются.

Основной альтернативой стека LAMP является стек LEMP — Linux, NGINX, MySQL и PHP. (В аббревиатуре LEMP E обозначает звук в начале «engine-x».) Мы описываем стек LEMP в  Совет 3 .

Совет 1. Кэш статических ресурсов

Статические ресурсы — это неизменяемые файлы, такие как файлы CSS, файлы JavaScript и файлы изображений. Эти файлы часто составляют половину или более данных на веб-странице. Остальная часть страницы — это динамически генерируемый контент, такой как комментарии на форуме, панель мониторинга производительности или персонализированный контент (подумайте о рекомендациях по продукту Amazon.com).

Кэширование статических ресурсов имеет два больших преимущества:

  • Более быстрая доставка пользователю — пользователь получает статический файл из своего кэша браузера или с сервера кэширования ближе к ним в Интернете. Иногда это большие файлы, поэтому уменьшение задержки для них очень помогает.
  • Снижение нагрузки на сервер приложений. Каждый файл, извлекаемый из кэша, — это на один запрос меньше, чем должен обрабатывать веб-сервер. Чем больше вы кешируете, тем больше вы избегаете перебора, потому что ресурсы закончились.

Для поддержки кэширования в браузере установите правильные заголовки HTTP для статических файлов. Посмотрите на Cache-Control заголовок HTTP  , в частности,  max-age настройки,  Expires заголовок и  Entity теги. Вы можете найти хорошее введение  здесь .

Когда локальное кэширование включено и пользователь запрашивает файл, к которому ранее обращались, браузер сначала проверяет, находится ли файл в кэше. Если это так, он спрашивает веб-сервер, изменился ли файл. Если файл не изменился, веб-сервер может немедленно ответить кодом,  304 (Not Modified) означающим, что файл не изменился, вместо того, чтобы возвращать код,  200 OK а затем извлекать и доставлять измененный файл.

Чтобы поддержать кэширование за пределами браузера, ознакомьтесь с советами ниже и рассмотрите сеть доставки контента (CDN). CDN — это популярный и мощный инструмент для кэширования, но мы не будем их здесь подробно описывать. Рассмотрим CDN после реализации других методов, упомянутых здесь. Кроме того, CDN могут быть менее полезны при переходе вашего сайта с HTTP / 1.x на новый стандарт HTTP / 2; исследуйте и тестируйте по мере необходимости, чтобы найти правильный ответ для вашего сайта.

Если вы перешли на NGINX Plus или программное обеспечение NGINX с открытым исходным кодом как часть вашего программного стека, как предложено в  разделе 3 , настройте NGINX для кэширования статических ресурсов. Используйте следующую конфигурацию, заменив www.example.com URL-адресом вашего веб-сервера.

server {
    # substitute your web server's URL for www.example.com
    server_name www.example.com;
    root /var/www/example.com/htdocs;
    index index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        # substitute the socket, or address and port, of your WordPress server
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        #fastcgi_pass 127.0.0.1:9000;
 	}   

    location ~* .(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
        expires max;
        log_not_found off;
        access_log off;
    }
}

Совет 2. Кэширование динамических файлов

WordPress генерирует веб-страницы динамически, что означает, что он генерирует данную веб-страницу каждый раз, когда ее запрашивают (даже если результат такой же, как и раньше). Это означает, что пользователи всегда получают самый свежий контент.

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

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

Чтобы предотвратить замедление доставки страниц из-за увеличения нагрузки, кэшируйте динамический файл. Это делает файл менее динамичным, но делает всю систему более отзывчивой.

Чтобы включить кэширование в WordPress, используйте один из нескольких популярных плагинов — описанных ниже. Плагин кеширования WordPress запрашивает новую страницу, а затем кэширует ее в течение короткого периода времени — возможно, всего несколько секунд. Таким образом, если сайт получает несколько запросов в секунду, большинство пользователей получают свою копию страницы из кэша. Это помогает время поиска для всех пользователей:

  • Большинство пользователей получают кэшированную копию страницы. Сервер приложений вообще не работает.
  • Пользователи, которые получают свежую копию, получают ее быстро. Сервер приложений только должен генерировать новую страницу очень часто. Когда сервер генерирует новую страницу (для первого пользователя, которая появляется после истечения срока действия кэшированной страницы), он делает это намного быстрее, поскольку не перегружен запросами.

Вы можете кэшировать динамические файлы для WordPress, работающего в  стеке LAMP  или в стеке LEMP (описано в разделе 3 ). Есть несколько плагинов для кэширования, которые вы можете использовать с WordPress. Вот самые популярные плагины кэширования и методы кэширования, перечисленные от самых простых до самых мощных:

  • Hyper-Cache  и  Quick-Cache  — эти два плагина создают один файл PHP для каждой страницы или публикации WordPress. Это поддерживает некоторые динамические функциональные возможности, в то же время обходя обработку ядра WordPress и соединение с базой данных, что ускоряет работу пользователя. Они не обходят всю обработку PHP, поэтому они не дают такой же прирост производительности, как следующие опции. Они также не требуют изменений в конфигурации NGINX.
  • WP Super Cache  — самый популярный кеширующий плагин для WordPress. Он имеет множество настроек, которые представлены через простой в использовании интерфейс, показанный ниже. Мы показываем пример конфигурации NGINX в Совете 7 .
  • W3 Total Cache  — это второй по популярности плагин кеша для WordPress. Он имеет даже больше настроек, чем WP Super Cache, что делает его мощным, но несколько сложным вариантом. Для примера конфигурации NGINX см.  Совет 6 .
  • FastCGI  — CGI означает Common Gateway Interface, независимый от языка способ запрашивать и получать файлы в Интернете. FastCGI — это не плагин, а способ взаимодействия с кешем. FastCGI можно использовать как в Apache, так и в NGINX, где это наиболее популярный подход динамического кэширования; мы опишем, как настроить NGINX для его использования в  совете 5 .

Документация по этим плагинам и методикам объясняет, как настроить их в типичном стеке LAMP. Варианты конфигурации включают кеширование базы данных и объекта; минимизация для HTML, CSS и JavaScript файлов; и варианты интеграции для популярных CDN. Для настройки NGINX см. Советы, указанные в списке.

Примечание.  Кэши не работают для пользователей, вошедших в WordPress, поскольку их просмотр страниц WordPress персонализирован. (Для большинства сайтов, вероятно, будет зарегистрировано лишь небольшое количество пользователей.) Кроме того, большинство кэшей не показывают кэшированную страницу пользователям, которые недавно оставили комментарий, так как этот пользователь захочет видеть их комментарии, когда они обновите страницу. Для кэширования неперсонализированного содержимого страницы вы можете использовать метод, называемый  фрагментным кэшированием , если это важно для общей производительности.

Совет 3. Перейти к NGINX

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

Кроме того, Apache загружает еще одну копию  mod_php модуля в память для каждого соединения, даже если он обслуживает только статические файлы (изображения, CSS, JavaScript и т. Д.). Это потребляет еще больше ресурсов для каждого соединения и дополнительно ограничивает емкость сервера.

Чтобы начать решать эти проблемы, перейдите от стека LAMP к стеку LEMP — замените Apache на (e) NGINX. NGINX обрабатывает многие тысячи одновременных подключений с фиксированной областью памяти, поэтому вам не нужно ни молотить, ни ограничивать одновременные подключения небольшим числом.

NGINX также лучше справляется со статическими файлами благодаря встроенным легко настраиваемым   элементам управления кэшированием . Нагрузка на сервер приложений снижается, и ваш сайт может обслуживать гораздо больше трафика, обеспечивая более быстрый и приятный опыт для ваших пользователей.

Вы можете использовать NGINX на всех веб-серверах в своем развертывании или же вы можете поместить сервер NGINX «напротив» Apache в качестве обратного прокси-сервера — сервер NGINX получает запросы клиентов, обслуживает статические файлы и отправляет запросы PHP в Apache, который обрабатывает их.

Для динамически генерируемых страниц — основного варианта использования WordPress — выберите инструмент кэширования, как описано в  разделе 2 . Ниже приведены советы по настройке NGINX для FastCGI, W3_Total_Cache и WP-Super-Cache. (Hyper-Cache и Quick-Cache не требуют изменений в конфигурации NGINX.)

Совет.  Кэши обычно сохраняются на диск, но вы можете использовать их  tmpfs для хранения кеша в памяти и повышения производительности.

Настроить NGINX для WordPress легко. Просто выполните следующие четыре шага, которые более подробно описаны в указанных советах:

  1. Добавить поддержку постоянных ссылок — Добавить поддержку постоянных ссылок в NGINX. Это устраняет зависимость от  файла конфигурации .htaccess , который зависит от Apache. Смотрите  совет 4 .
  2. Настройка для кэширования — выберите инструмент кэширования и реализуйте его. Доступны следующие варианты: кэш FastCGI, общий кэш W3, супер кэш WP, гипер кэш и быстрый кэш. Смотрите советы  56 и  7 .
  3. Внедрить меры безопасности — принять лучшие практики для безопасности WordPress на NGINX. Смотрите  совет 8 .
  4. Настройка WordPress Multisite. Если вы используете WordPress Multisite, настройте NGINX для архитектуры подкаталогов, поддоменов или нескольких доменов. Смотрите  совет 9 .

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

Вы можете включить постоянные  ссылки  в WordPress с помощью NGINX, включив следующий  location блок в блок главного  сервера  . (Этот  location блок также включен в другие примеры кода ниже.)

try_files Директива говорит NGINX , чтобы проверить , существует ли запрашиваемый URL в файл (  $uri) или каталог ( $uri/) в корневом каталоге документов,  /var/www/example.com/htdocs . Если нет, NGINX выполняет перенаправление в  /index.php , передавая аргументы строки запроса в качестве параметров.

server {
    server_name example.com www.example.com;
    root /var/www/example.com/htdocs;
    index index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}

Совет 5. Настройте NGINX для FastCGI

NGINX может кэшировать ответы от приложений FastCGI, таких как PHP. Этот метод предлагает лучшую производительность.

Для NGINX с открытым исходным кодом используйте код ниже, чтобы включить поддержку очистки. NGINX Plus включает собственную реализацию этого кода.

При использовании FastCGI мы рекомендуем установить   плагин Nginx Helper  и использовать конфигурацию, подобную приведенной ниже, особенно использование  fastcgi_cache_key и блок размещения, включая fastcgi_cache_purge. Плагин автоматически очищает ваш кеш при публикации или изменении страницы или сообщения, публикации нового комментария или удалении кеша вручную с панели администратора WordPress.

Nginx Помощник  плагин может также добавить короткий фрагмент кода HTML в нижней части страницы, подтверждающая кэш работает и отображение некоторых статистических данных. (Вы также можете подтвердить, что кеш работает правильно, используя  $upstream_cache_status переменную.)

fastcgi_cache_path /var/run/nginx-cache levels=1:2       
                   keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

server {
    server_name example.com www.example.com;
    root /var/www/example.com/htdocs;
    index index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log;

    set $skip_cache 0;

    # POST requests and urls with a query string should always go to PHP
    if ($request_method = POST) {
        set $skip_cache 1;
    }   

    if ($query_string != "") {
        set $skip_cache 1;
    }   

    # Don't cache uris containing the following segments
    if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php
                         |sitemap(_index)?.xml") {
        set $skip_cache 1;
    }   

    # Don't use the cache for logged in users or recent commenters
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass
        |wordpress_no_cache|wordpress_logged_in") {
        set $skip_cache 1;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }    

    location ~ \.php$ {
        try_files $uri /index.php;
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;
        fastcgi_cache WORDPRESS;
        fastcgi_cache_valid  60m;
    }

    location ~ /purge(/.*) {
        fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
    }	

    location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png
                      |ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {

        access_log off;	
        log_not_found off;
        expires max;
    }

    location = /robots.txt {
        access_log off;
        log_not_found off;
    }

    location ~ /\. {
        deny  all; 
        access_log off;
        log_not_found off;
    }
}

Совет 6. Настройте NGINX для W3_Total_Cache

W3 Total Cache от Фредерика Таунса из  W3-Edge — это инфраструктура кэширования WordPress, которая поддерживает NGINX. Это альтернатива кешу FastCGI с широким диапазоном настроек.

Плагин кэширования предлагает множество конфигураций кэширования, а также включает опции для кэширования базы данных и объектов, минимизации HTML, CSS и JavaScript, а также опции для интеграции с популярными CDN.

Плагин обрабатывает конфигурацию NGINX путем записи в файл конфигурации NGINX, расположенный в корневом каталоге вашего домена.

server {
    server_name example.com www.example.com;

    root /var/www/example.com/htdocs;
    index index.php;
    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log;

    include /path/to/wordpress/installation/nginx.conf;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }
}

Совет 7. Настройте NGINX для WP Super Cache

WP Super Cache  от Donncha O Caoimh, разработчик WordPress в  Automattic , представляет собой механизм кэширования WordPress, который превращает динамические страницы WordPress в статические файлы HTML, которые NGINX может обслуживать очень быстро. Это был один из первых плагинов для кеширования для WordPress, и его выбор был меньше, чем у других.

Конфигурации NGINX для WP-Super-Cache могут отличаться в зависимости от ваших предпочтений. Ниже приведена одна из возможных конфигураций.

В приведенной ниже конфигурации блок местоположения с именованным в нем суперкашем является частью, специфичной для WP Super Cache, и необходим для работы конфигурации. Остальная часть кода состоит из правил WordPress, позволяющих не кэшировать пользователей, вошедших в WordPress, не кэшировать POST-запросы и устанавливать заголовки expires для статических ресурсов, а также стандартную реализацию PHP; Эти детали могут быть настроены в соответствии с вашими потребностями.

server {
    server_name example.com www.example.com;
    root /var/www/example.com/htdocs;
    index index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log debug;

    set $cache_uri $request_uri;

    # POST requests and urls with a query string should always go to PHP
    if ($request_method = POST) {
        set $cache_uri 'null cache';
    }  
    if ($query_string != "") {
        set $cache_uri 'null cache';
    }   

    # Don't cache uris containing the following segments
    if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php
                          |wp-.*.php|/feed/|index.php|wp-comments-popup.php
                          |wp-links-opml.php|wp-locations.php |sitemap(_index)?.xml
                          |[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {

        set $cache_uri 'null cache';
    }  

    # Don't use the cache for logged-in users or recent commenters
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+
                         |wp-postpass|wordpress_logged_in") {
        set $cache_uri 'null cache';
    }

    # Use cached or actual file if it exists, otherwise pass request to WordPress
    location / {
        try_files /wp-content/cache/supercache/$http_host/$cache_uri/index.html 
                  $uri $uri/ /index.php;
    }    

    location = /favicon.ico {
        log_not_found off; 
        access_log off;
    }

    location = /robots.txt {
        log_not_found off
        access_log off;
    }

    location ~ .php$ {
        try_files $uri /index.php;
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        #fastcgi_pass 127.0.0.1:9000;
    }

    # Cache static files for as long as possible
    location ~*.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css
           |rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2
           |doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
        expires max;
        log_not_found off;
        access_log off;
    }
}

Совет 8. Добавьте меры безопасности в вашу конфигурацию NGINX

Для защиты от атак вы можете контролировать доступ к ключевым ресурсам и ограничивать способность ботов перегружать утилиту входа в систему.

Разрешить только определенные IP-адреса для доступа к панели управления WordPress.

# Restrict access to WordPress Dashboard
location /wp-admin {
    deny  192.192.9.9;
    allow 192.192.1.0/24;
    allow 10.1.1.0/16;
    deny  all;
}

Разрешить загрузку только определенных типов файлов, чтобы предотвратить загрузку и запуск программ со злонамеренным намерением.

# Deny access to uploads which aren’t images, videos, music, etc.
location ~* ^/wp-content/uploads/.*.(html|htm|shtml|php|js|swf)$ {
    deny all;
}

Запретить доступ к  wp-config.php , файлу конфигурации WordPress. Другой способ запретить доступ — переместить файл на один уровень выше корневого домена.

# Deny public access to wp-config.php
location ~* wp-config.php {
    deny all;
}

Ограничение скорости  wp-login.php,  чтобы заблокировать против атак грубой силы.

# Deny access to wp-login.php
location = /wp-login.php {
    limit_req zone=one burst=1 nodelay;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    #fastcgi_pass 127.0.0.1:9000;
}

Совет 9. Используйте NGINX с WordPress Multisite

WordPress Multisite, как следует из его названия, является версией программного обеспечения WordPress, которая позволяет вам управлять двумя или более сайтами из одного экземпляра WordPress. WordPress.com  обслуживание, в котором находится тысячи пользователей блогов, запускается из WordPress MultiSite.

Вы можете запускать отдельные сайты либо из подкаталогов одного домена, либо из отдельных поддоменов.

Используйте этот блок кода для добавления поддержки структуры подкаталогов.

# Add support for subdirectory structure in WordPress Multisite
if (!-e $request_filename) {
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;
    rewrite ^(/[^/]+)?(/wp-.*) $2 last;                     
    rewrite ^(/[^/]+)?(/.*\.php) $2 last;                   
}

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

# Add support for subdomains
server_name example.com *.example.com;

Более старые версии WordPress Multisite (3.4 и более ранние) используют  readfile() для обслуживания статического контента. Тем не менее, readfile() это PHP-код, который вызывает значительное снижение производительности при выполнении. Мы можем использовать NGINX, чтобы обойти эту ненужную обработку PHP. Фрагменты кода ниже разделены линиями-разделителями (==============).

# Avoid PHP readfile() for /blogs.dir/structure in the subdirectory path.
location ^~ /blogs.dir {
    internal;
    alias /var/www/example.com/htdocs/wp-content/blogs.dir;
    access_log off;
    log_not_found off;
    expires max;
}

============================================================

# Avoid php readfile() for /files/structure in the subdirectory path
location ~ ^(/[^/]+/)?files/(?.+) {
    try_files /wp-content/blogs.dir/$blogid/files/$rt_file /wp-includes/ms-files.php?file=$rt_file;
    access_log off;
    log_not_found off;
    expires max;
}

============================================================

# WPMU files structure for the subdomain path
location ~ ^/files/(.*)$ {
    try_files /wp-includes/ms-files.php?file=$1 =404;
    access_log off;
    log_not_found off;
    expires max;
}

============================================================

# Map blog ID to specific directory
map $http_host $blogid {
    default           0;
    example.com       1;
    site1.example.com 2;
    site1.com       2;
}

Вывод

Масштабируемость является проблемой для все большего числа разработчиков сайтов, поскольку они достигают успеха на своих сайтах WordPress. (И для новых сайтов, которые хотят избежать проблем с производительностью WordPress). Добавление кеширования WordPress и объединение WordPress и NGINX — это надежные ответы.