Перенос WordPress с Apache на Nginx

Самая приятная новость последних дней это мой переезд на новый сервер. На этот раз он не виртуальный, а физический. Преимуществ и удобств после расставания со старым хостером просто масса. Но обо всем по порядку. Раз уж я начал заниматься переносом, то подумал почему бы не провести оптимизацию и программной составляющей. Я давно собирался уйти от монструозного Apache2 на какой-нибудь более легкий веб сервер, но первое правило администратора гласит — если работает, не трогай. А когда появился вроде как официальный повод тронуть, то я тут же им воспользовался.

Все мои сервера в Сети управляются операционной системой Debian. О совсем очевидных тонкостях настройки системы и установки программного обеспечения я рассказывать не буду. Эта статья для тех кто имеет доступ на свой сервер с правами root, а значит он должен знать что делает.

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

mysqldump -u username -ppassword databasename > wp.sql
    tar -cf /path/to/wordpress/wp.tar


Затем перенести их на новый сервер. Прежде чем импортировать дамп надо создать пустую базу в MySQL сервере:

    $ mysql -u root -p
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 5340 to server version: 3.23.54

    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

    mysql> CREATE DATABASE databasename;
    Query OK, 1 row affected (0.00 sec)

    mysql> GRANT ALL PRIVILEGES ON databasename.* TO 'username'@'localhost'
    -> IDENTIFIED BY 'password';
    Query OK, 0 rows affected (0.00 sec)

    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.01 sec)

    mysql> EXIT
    Bye
    $


Вот теперь можно распаковать архив движка и импортировать базу со старого сервера:

    tar -xf wp.tar
    mysql -u username -ppassword -D databasename < wp.sql


Не забудьте в файлике wp-conf.php прописать новые параметры базы данных в том случае, если имена поменялись.

Настала очередь настройки непосредственно веб сервера. Помимо самого Nginx нам, как минимум, необходим еще FastCGI — клиент-серверный протокол взаимодействия вебсервера и приложения. Тут наиболее оптимальным вариантом будет использовать PHP-FPM. Все пакеты есть в репозитарии:

apt-get install nginx php5-fpm


В главном конфигурационном файле nginx.conf я практически ничего не менял, за исключением параметра worker_processes. Гуру рекомендуют приравнивать его количеству процессорных ядер. Теперь можно создавать конфиг сайта. У меня он получился следующим:

    server {

    listen   80;
    server_name  snupt.com;

    access_log  /var/log/nginx/snupt.com.access.log;

    location / {
    root   /var/www/nginx/snupt.com;
    index  index.php index.html index.htm;

    if (-f $request_filename) {
    expires 30d;
    break;
    }

    if (!-e $request_filename) {
    rewrite ^.+?(/.*\.php)$ $1 last;
    rewrite ^ /index.php last;
    }

    }

    location ~ \.php$ {
    fastcgi_pass   unix:/tmp/fastcgi_sock;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /var/www/nginx/snupt.com$fastcgi_script_name;
    include fastcgi_params;
    }

    }

В конфиге /etc/php5/fpm/pool.d/www.conf нужно поменять строчку listen = 127.0.0.1:9000 поменять на listen = /tmp/fastcgi_sock. Сокеты работают быстрее TCP соединения. В такой комбинации WordPress работает нормально и не чудит с постоянными ссылками. Ко всему прочему еще можно несколько ускорить работу сайта за счет кэширования php кода. Наиболее оптимальное решение предоставляет PHP-APC — программа, ускоряющая исполнение сценариев PHP интерпретатором путём кэширования их байткода:

apt-get install php-apc


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

Updated: С таким конфигом который представлен в статье связка PHP + Nginx емеет уязвимость на сайтах с возможностью загрузки файлов. Для того чтобы решить ее необходимо в /etc/php5/fpm/php.ini дописать строку:

cgi.fix_pathinfo=0


Или изменить конфиг сайта следующим образом:

location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    try_files $fastcgi_script_name =404;
    fastcgi_param  SCRIPT_FILENAME  /var/www/nginx/snupt.com$fastcgi_script_name;
    include fastcgi_params;
    }

Подробности по ссылке — Уязвимость связки PHP+nginx. Благодарю пользователя qwerty за подсказку.

0 комментариев

Оставить комментарий

Комментировать при помощи:
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.