Миграция WordPress с Apache на Nginx на сервере Ubuntu

WordPress – это популярная система управления контентом, предназначенная для администрирования сайта или ведения блогов. Платформа WordPress очень гибкая и проста в установке и настройке.

WordPress может взаимодействовать с большинством современных веб-серверов. Самый популярный (возможно, стандартный) вариант – это веб-сервер Apache. Apache отличается надёжностью и постоянной поддержкой сообщества, но иногда (особенно при обслуживании большого количества запросов) он сталкивается с проблемами, связанными с использованием ресурсов.

Nginx – веб-сервер, получивший свою популярность благодаря простоте, гибкости и низкому потреблению ресурсов. Потому многие пользователи постепенно переходят с Apache на Nginx для размещения установки WordPress. В сети можно найти множество руководств по установке WordPress на Nginx, но они не подходят в случае, если нужно переместить уже существующую установку.

Данное руководство поможет выполнить миграцию установки WordPress с веб-сервера Apache на Nginx на сервере Ubuntu 12.04.

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

Установка Nginx и PHP5-FPM

Для начала нужно установить сервер Nginx. Его пакеты доступны в стандартных репозиториях Ubuntu.

sudo apt-get update
sudo apt-get install nginx

В отличие от Apache, Nginx по умолчанию не включает основные функции обработки PHP; вместо этого он передаёт эти запросы на выделенный обработчик PHP.

Утилита php5-fpm – стандартный пакет для обработки PHP на сервере Nginx. Чтобы WordPress мог обрабатывать файлы PHP, нужно установить этот пакет.

sudo apt-get install php5-fpm

Теперь все необходимые компоненты установлены.

Настройка PHP5-FPM

На данном этапе нужно подготовить обработчик PHP.

Отредактируйте конфигурационный файл php5-fpm:

sudo nano /etc/php5/fpm/php.ini

Найдите параметр cgi.fix_pathinfo и отредактируйте его следующим образом:

cgi.fix_pathinfo=0

Это мера предосторожности. Если оставить стандартное значение того параметра, 1, то в случае, если запрашиваемый файл не найден, php5-fpm будет пытаться обработать и вернуть файл с наиболее похожим именем. Это серьёзная угроза для безопасности, поскольку так злоумышленник сможет извлечь с сайта конфиденциальную информацию. Лучше настроить php5-fpm для обработки только тех файлов, которые точно соответствуют запросу, а в противном случае возвращать ошибку. Для этого и нужно задать значение 0.

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

Теперь нужно отредактировать другой конфигурационный файл PHP, чтобы настроить взаимодействие с веб-сервером.

sudo nano /etc/php5/fpm/pool.d/www.conf

Найдите директиву listen =. Нужно настроить её для взаимодействия с веб-сервером при помощи сокетов.

listen = /var/run/php5-fpm.sock

Затем сохраните и закройте файл.

Чтобы изменения вступили в силу, перезапустите сервис php5-fpm.

sudo service php5-fpm restart

Создание виртуального хоста Nginx

Теперь нужно подготовить блок server веб-сервера Nginx.

Примечание: Блоки server – полная аналогия виртуальным хостам Apache. Они содержат индивидуальные настройки сайтов. Как правило, блоки server называются виртуальными хостами (понятие из терминологии Apache).

Как и Apache, Nginx в системе Ubuntu настраивает сайты в каталоге sites-available directory, а затем включает их при помощи символьной ссылки в каталог sites-enabled. Чтобы обслуживать установку WordPress при помощи Nginx, нужно отредактировать конфигурационный файл виртуального хоста по умолчанию

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

Удалите всё содержимое файла, чтобы потом заполнить его новыми параметрами.

Сначала нужно создать блок server; это базовый компонент индивидуальных настроек отдельного сайта. Согласно настройкам, Nginx обрабатывает эти файлы при запуске или перезагрузке сервера.

server {
}

Для начала важно запомнить, что каждый параметр Nginx должен заканчиваться символом точки с запятой (;). В противном случае Nginx не сможет прочесть файл, что, вероятно, вызовет сбой сервера.

В блоке server нужно задать порт, на котором сайт будет прослушивать соединения пользователей. По умолчанию HTTP-трафик обслуживается в браузере на порт 80. Его Nginx должен прослушивать.

Также нужно указать каталог document root, в котором будут храниться файлы WordPress.

Согласно руководству по установке WordPress, файлы сайта хранятся в /var/www.

Примечание: Согласно другим инструкциям, файлы сайта могут храниться в каталогах /var/www/wordpress, /home/wordpress/public_html и т.п. В таком случае вам нужно отредактировать директиву root , указав правильный каталог.

server {
listen 80;
root /var/www;
}

Затеем нужно добавить директиву, которая определяет, какие  файлы Nginx будет обслуживать в первую очередь. Файл, который используется для описания каталога, называется индексом каталога. В WordPress такой файл называется index.php. Другие индексные файлы, записанные в формате HTML, можно использовать в качестве запасного варианта.

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

Кроме того, в директиве server_name после основного домена можно добавить альтернативные доменные имена сайта (например, домен с префиксом www):

server {
listen 80;
root /var/www;
index index.php index.html index.htm;
server_name your_domain.com www.your_domain.com;
}

Остальная информация блока server должна быть поделена на блоки location. Блоки location содержат правила, которые определяют действия сервера, если запрос соответствует определенному шаблону.

Создайте блок location для обработки файлов из root-каталога сайта (который был ранее указан в директиве root). Этот блок будет содержать общие правила обслуживания этих файлов.

Добавьте правило, благодаря которому Nginx будет пытаться найти файл, точно соответствующий запросу после доменного имени. Если такого файла не существует, веб-сервер должен попытаться найти каталог с таким же именем. Если такого каталога также не существует, веб-сервер передаст запрос в PHP-скрипт, который попытается найти другой способ обработки запроса.

После этого нужно добавить правило для обработки пересылки данных PHP на php5-fpm. Для подключения оно использует данные конфигурационных файлов php5-fpm.

server {
listen 80;
root /var/www;
index index.php index.html index.htm;
server_name your_domain.com www.your_domain.com;
location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}

После этого нужно добавить несколько правил Nginx для обслуживания запросов favicon и robot.txt (они используются поисковыми системами для индексирования сайтов). Эти запросы не нужно регистрировать в логах.

Затем добавьте блок location, который отвечает за доступ к скрытым папкам (в системах Linux их имен начинаются с точки). Это заблокирует обслуживание таких файлов, поскольку они могут содержать конфигурации Apache.

В завершение нужно заблокировать обслуживание файлов PHP из каталогов uploads и files. Это защитит сервер от выполнения вредоносного кода.

В целом блок server имеет такой вид:

server {
listen 80;
root /var/www;
index index.php index.html index.htm;
server_name your_domain.com www.your_domain.com;
location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
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;
}
location ~* /(?:uploads|files)/.*\.php$ {
deny all;
}
}

Сохраните и закройте файл. Символьная ссылка между этим файлом и каталогом sites-enabled должна уже существовать, потому при запуске Nginx он будет включен.

Переход с Apache на Nginx

На данный момент Apache обслуживает запросы на порте 80. Это значит, что Nginx не сможет подключиться к этому порту. Нужно остановить веб-сервер Apache, прежде чем включить Nginx.

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

Файлы, которые нужно проверить:

/etc/apache2/ports.conf
/etc/apache2/apache2.conf
/etc/apache2/httpd.conf
/etc/apache2/sites-enabled/    ## Search all sites in this directory

Примечание: Также вы можете настроить Nginx как прокси-сервер Apache. Подробнее о такой настройке можно прочитать здесь.

Изменив порт Apache, перезапустите веб-сервер, чтобы обновить настройки, а затем включите Nginx. После этого порт 80 будет занят сервером Nginx, а Apache будет использовать новый порт.

sudo service apache2 reload && sudo service nginx start

Если же в дальнейшем сервер Apache не нужен, так как обслуживание файлов полностью перейдёт к Nginx, выключите Apache:

sudo service apache2 stop && sudo service nginx start

На данном этапе важно либо передать порт 80 серверу Nginx, настроив Apache на другой порт,  либо же полностью остановить Apache. В противном случае Nginx не запустится, потому что порт занят другим веб-сервером.

Если переход был выполнен успешно и теперь контент обслуживается сервером Nginx, можно удалить Apache и его зависимости, если он больше не нужен. Для этого введите:

dpkg --get-selections | grep apache
apache2                         install
apache2-mpm-prefork             install
apache2-utils                   install
apache2.2-bin                   install
apache2.2-common                install
libapache2-mod-auth-mysql       install
libapache2-mod-php5             install

А затем удалите эти пакеты:

sudo apt-get remove apache2 apache2-mpm-prefork apache2-utils apache2.2-bin apache2.2-common libapache2-mod-auth-mysql libapache2-mod-php5

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

sudo apt-get autoremove

Заключение

Теперь установка WordPress обслуживается сервером Nginx. В целом, серверы Apache и Nginx работают почти одинаково, однако Nginx требует меньше ресурсов, а это очень важно, если сайт получает большое количество трафика. Чем меньше ресурсов нужно серверу, тем лучше он справляется с большими объёмами трафика.

Tags: , , , ,

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