Настройка NGINX для поддержки нескольких сайтов WordPress

WordPress – самая популярная система управления контентом (CMS). Сайты на WordPress можно поддерживать при помощи веб-серверов HTTP, например, Apache или NGINX.

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

Требования

  • Пользователь с доступом к sudo.
  • Предварительно установленный стек LEMP на Ubuntu или Debian.

Также имейте в виду, что в руководстве PHP-FPM будет использовать UNIX-сокет.

Базовая оптимизация NGINX

Рабочие процессы и подключения NGINX

Согласно рекомендациям количество рабочих процессов NGINX должно совпадать с количеством процессоров. Чтобы узнать количество процессоров, введите:

cat /proc/cpuinfo | grep processor

Откройте главный конфигурационный файл NGINX:

sudo nano /etc/nginx/nginx.conf

Измените количество рабочих процессов NGINX согласно условиям системы:

worker_processes 1;

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

worker_connections 768;

Утилита gzip

Утилита gzip сжимает файлы, что позволяет увеличить скорость WordPress; чем меньше размер данных, запрашиваемых пользователем, тем быстрее сервер оработает их и вернёт ответ. Файлы CSS и HTML содержат много одинаковых строк, повторяющийся текст и пробелы. Gzip использует алгоритм DEFLATE, который удаляет повторяющиеся строки, ссылаясь на первую такую строку. Благодаря этому файл становится гораздо меньше. Найдите раздел Gzip и включите его:

gzip on;
gzip_types text/css text/x-component application/x-javascript application/javascript text/javascript text/x-js text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon;

Сохраните и закройте файл:

Создание файлов .conf

Для многосайтовых настроек WordPress нужно создать несколько файлов .conf, которые будут загружаться из блоков server; благодаря этому вам не придётся повторно записывать одинаковые конфигурации для каждого блока server.

Создайте три файла для хранения конфигураций:

  • common.conf: общие настройки сайтов.
  • wordpress.conf: настройки сайтов WordPress.
  • multisite.conf: специальные конфигурации для многосайтовой установки WordPress с подкаталогами.

Все файлы нужно хранить в каталоге global. Создайте этот каталог:

sudo mkdir /etc/nginx/global

Откройте его:

cd /etc/nginx/global

Файл common.conf

Создайте первый файл – common.conf.

sudo nano common.conf

Поместите в него следующие настройки:

# Global configuration file.
# ESSENTIAL : Configure Nginx Listening Port
listen 80;
# ESSENTIAL : Default file to serve. If the first file isn't found,
index index.php index.html index.htm;
# ESSENTIAL : no favicon logs
location = /favicon.ico {
log_not_found off;
access_log off;
}
# ESSENTIAL : robots.txt
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# ESSENTIAL : Configure 404 Pages
error_page 404 /404.html;
# ESSENTIAL : Configure 50x Pages
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/www;
}
# SECURITY : Deny all attempts to access hidden files .abcde
location ~ /\. {
deny all;
}
# PERFORMANCE : Set expires headers for static files and turn off logging.
location ~* ^.+\.(js|css|swf|xml|txt|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|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 30d;
}

  • Строка listen 80; определяет порт, который будет слушать сервер.
  • Строка «index index.php…» определяет стандартный файл для обслуживания. Если первый файл, указанный в этой строке, не найден, сервер будет искать второй файл и т.д. Если у вас есть HTML-сайты, добавьте в строку index.html и index.htm.
  • Строка «location = /robots.txt {allow all;}» открывает доступ к файлу robots.txt; чтобы задать другой каталог для robots.txt, добавьте псевдоним:

location /robots.txt {
alias /var/www/example.com/public/sample_robots.txt;
}

Строка «location ~ /\. {deny all;}» блокирует скрытые файлы (их имя начинается с точки).

Строка «location ~* ^.+\.(js|css|swf…» отвечает за использование кэша. Значение 30d будет хранить статические файлы (например, изображения) в течение 30 дней.

Сохраните и закройте файл.

Файл wordpress.conf

Теперь нужно создать файл настроек для сайтов WordPress:

sudo nano wordpress.conf

В файл вставьте следующий код:

# WORDPRESS : Rewrite rules, sends everything through index.php and keeps the appended query string intact
location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}
# SECURITY : Deny all attempts to access PHP Files in the uploads directory
location ~* /(?:uploads|files)/.*\.php$ {
deny all;
}
# REQUIREMENTS : Enable PHP Support
location ~ \.php$ {
# SECURITY : Zero day Exploit Protection
try_files $uri =404;
# ENABLE : Enable PHP, listen fpm sock
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
# PLUGINS : Enable Rewrite Rules for Yoast SEO SiteMap
rewrite ^/sitemap_index\.xml$ /index.php?sitemap=1 last;
rewrite ^/([^/]+?)-sitemap([0-9]+)?\.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;
#Yeah! you did it.

Правило try_files $uri $uri/ /index.php?q=$uri&$args позволяет настроить пользовательскую структуру ссылки.

Строка location ~* /(?:uploads|files)/.*\.php$ {deny all;} предотвращает загрузку и выполнение вредоносного кода.

Строка location ~ \.php$ {…} позволяет NGINX передавать php-скрипты в PHP5.

Правило безопасности try_files $uri =404; возвращает ошибку 404 если запрашиваемый файл не найден.

Примечание: В этот файл можно добавить больше правил. К примеру, дополнительных правил требуют отдельные плагины.

Файл multisite.conf

В отличие от односайтовой установки WordPress, которая не требует настройки перезаписи ссылок, многосайтовая установка нуждается в чистых URL-ах. Создайте файл для такой установки:

sudo nano multisite.conf

В этот файл добавьте следующие настройки:

# Rewrite rules for WordPress Multi-site.
if (!-e $request_filename) {
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 last;
rewrite ^/[_0-9a-zA-Z-]+(/.*\.php)$ $1 last;
}

Сохраните и закройте файл.

Виртуальные хосты nginx

Теперь можно создать первый блок server (так называются виртуальные хосты nginx). Все необходимые конфигурации распределены между файлами .conf, потому копировать стандартный файл блока server нет смысла. Отключите этот файл.

sudo rm /etc/nginx/sites-enabled/default

Создайте новый файл для блока server:

sudo nano /etc/nginx/sites-available/demo

В зависимости от ваших целей и требований сервера скопируйте в него наиболее подходящие из предложенных ниже конфигураций.

Простая установка WordPress

Чтобы настроить один сайт с доменом www.demo.com, нужно создать блок server и поместить в него следующие правила.

Укажите, какой блок должен использоваться для этого домена, добавьте файлы common.conf и wordpress.conf, а затем укажите путь к установке WordPress.

server {
# URL: Correct way to redirect URL's
server_name demo.com;
rewrite ^/(.*)$ http://www.demo.com/$1 permanent;
}
server {
server_name www.demo.com;
root /home/demouser/sitedir;
access_log /var/log/nginx/www.demo.com.access.log;
error_log /var/log/nginx/www.demo.com.error.log;
include global/common.conf;
include global/wordpress.conf;
}

Обратите внимание на следующие данные:

  • server_name: задаёт виртуальный хост для этого сайта.
  • root: путь к главному каталогу сайта.
  • access log и error log: пути к логам.

Как видите, в файле находится два блока server; это потому, что www.demo.com и demo.com – это два разных URL-а.

Примечание: Подробнее о постоянном редиректе домена с префиксом www на домен без www можно прочесть здесь.

Можно также указать несколько доменов:

server {
# URL: Correct way to redirect URL's
server_name demo.com sub.demo.com example.com;

Многосайтовая установка с подкаталогами

Добавьте правила перезаписи в multisite.conf:

# URL: add a permanent redirect if required.
server {
server_name www.demo1.com;
root /home/demouser/sitedir1;
access_log /var/log/nginx/www.demo1.com.access.log;
error_log /var/log/nginx/www.demo1.com.error.log;
include global/common.conf;
include global/wordpress.conf;
include global/multisite.conf;
}

Многосайтовая установка с поддоменами

Для поддержки такой установки нужно отредактировать блок server, добавив в домен специальный символ:

server {
server_name *.demo2.com;
root /home/demouser/sitedir2;
access_log /var/log/nginx/demo2.com.access.log;
error_log /var/log/nginx/demo2.com.error.log;
include global/common.conf;
include global/wordpress.conf;
}

HTML  и другие сайты

Для поддержки сайтов html или веб-приложений нужно указать пользовательские правила или создать дополнительные файлы .conf, а затем добавить их в блок server:

# URL: add a permanent redirect if required.
server {
server_name www.demo3.com;
root /home/demouser/sitedir3;
access_log /var/log/nginx/demo3.com.access.log;
error_log /var/log/nginx/demo3.com.error.log;
# custom rules
}

Сохраните и закройте файл.

Включение блоков server

Теперь нужно включить виртуальные хосты, создав символьную ссылку между каталогами sites-available и sites-enabled.

sudo ln -s /etc/nginx/sites-available/demo /etc/nginx/sites-enabled/demo

Перезапустите NGINX, чтобы обновить настройки.

sudo service nginx reload;

Дополнительные рекомендации

Чтобы создать другие виртуальные хосты, просто повторите описанный выше процесс, указав новый каталог document root и другой домен.

Кроме того, несколько блоков server можно совместить в один:

server {
server_name demo.com;
rewrite ^/(.*)$ http://www.demo.com/$1 permanent;
}
server {
server_name www.demo.com;
root /home/demouser/sitedir;
access_log /var/log/nginx/www.demo.com.access.log;
error_log /var/log/nginx/www.demo.com.error.log;
include global/common.conf;
include global/wordpress.conf;
}
server {
server_name www.demo1.com;
root /home/demouser/sitedir1;
access_log /var/log/nginx/www.demo1.com.access.log;
error_log /var/log/nginx/www.demo1.com.error.log;
include global/common.conf;
include global/wordpress.conf;
include global/multisite.conf;
}
# More server blocks....

Tags: , , ,

Добавить комментарий