Статьи

Молниеносный WordPress с PHP-FPM и nginx

Управляемые серверы работают медленно. Они запускают старые версии PHP на древних копиях Apache и не любят эффект Digg (или любой подобный внезапный приток трафика). В этом уроке я покажу, как шаг за шагом построить сервер, способный выдержать размещение Digg на первой странице. Это будет означать, что ваш бизнес остается в сети, когда это наиболее важно – когда все смотрят.

Мы пройдем процесс создания сверхбыстрого, пуленепробиваемого пользовательского веб-сервера для WordPress. Технологический стек, который мы будем использовать, – это Ubuntu, nginx, PHP-FPM и MySQL. В следующей статье мы рассмотрим добавление memcached в микс, чтобы повысить производительность.

Почему VPS?

VPS обозначает виртуальный частный сервер. По сути, вы получаете кусок большой, дорогой машины по низкой месячной цене. Вы платите за гарантированный объем оперативной памяти и имеете доступ к определенной мощности процессора.

Это может быть гораздо выгоднее, чем управляемый хостинг, если у вас есть несколько запущенных сайтов. Тем не менее, вы должны сами все управлять и заботиться о своем сервере, когда что-то пойдет не так.

Почему nginx?

Nginx – это небольшой, легкий веб-сервер и обратный прокси-сервер. Он работает на 5,2% из первого миллиона веб-серверов . В частности, nginx хорошо подходит для сайтов с высоким трафиком. Его легкий характер по сравнению с Apache означает, что сервер nginx может работать с гораздо меньшим объемом памяти. Это делает его предпочтительным веб-сервером для тех, кто хочет получить максимальную производительность от решения VPS.

Почему PHP-FPM?

В состав версии 5.3.3 PHP (выпущенной в июле этого года) входит новый менеджер FastCGI под названием PHP-FPM. PHP-FPM – это демон, который порождает процессы для управления вашими онлайн-приложениями. Таким образом, вместо того, чтобы на вашем веб-сервере выполнялись плагины для отображения и обработки вашего PHP-кода, ваш PHP-код теперь выполняется непосредственно PHP-FPM.

Для нашего примера установки WordPress мы настроим сервер nginx для обслуживания наших статических файлов. Когда пользователь запрашивает страницу PHP, сервер nginx перенаправляет запрос самому PHP. PHP-FPM запускает свой собственный сервер, ожидая, когда пользователи запросят свои страницы.

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

Почему MySQL?

В основном, потому что другого выбора нет. На данный момент WordPress поддерживает только MySQL. Я всегда использую memcached, чтобы облегчить нагрузку на MySQL. Как я уже упоминал, я расскажу об использовании memcached в следующем посте.

Собираем все вместе

Поскольку все это программное обеспечение является относительно передовым, мы собираемся пойти дальше и построить практически все из исходного кода. Это означает, что в вашей системе должен быть установлен build-essential или эквивалентный пакет. Я предполагаю, что вы знакомы с Linux и SSH.

Если вы застряли в Windows и хотите попробовать эту настройку, я бы рекомендовал установить сервер Ubuntu в бесплатном приложении виртуализации VirtualBox.

Шаг первый: установка nginx

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

Мы начнем с получения зависимостей; затем мы возьмем nginx и соберем его (проверьте страницу загрузки для последней доступной версии):

sudo apt-get install libpcre3 libpcre3-dev libpcrecpp0 libssl-dev zlib1g-dev cd ~/downloads wget http://nginx.org/download/nginx-0.8.53.tar.gz tar zxvf nginx-0.8.53.tar.gz cd nginx-0.8.53 

Теперь, прежде чем мы пройдем через конфигурацию, нам нужно установить несколько параметров. В частности, где должен быть установлен nginx. Мы также настроим nginx для использования модуля SSL, поэтому https работает для нашего сервера:

 ./configure --pid-path=/var/run/nginx.pid --sbin-path=/usr/local/sbin --with-http_ssl_module 

Наконец, мы сделаем make и make install:

 make sudo make install 

Мы сделаем несколько быстрых изменений в файле конфигурации nginx, который находится по адресу /usr/local/nginx/conf/nginx.conf . В верхней части этого файла вы увидите эти две строки:

 # user nobody; worker_processes 1; 

Раскомментируйте пользовательскую строку и никого не меняйте на www-data www-data, затем измените worker_processes на 2 вместо 1. Посмотрите на остальную часть файла; Есть несколько настроек для журналов и других опций, пример объявления сервера и несколько закомментированных примеров. Мы вернемся к этому файлу позже, но сейчас вы можете сохранить его и закрыть.

У nginx нет сценария инициализации, который мы можем запустить при загрузке системы, но есть много хороших доступных онлайн. Давайте возьмем один и настроим его:

 cd ~/downloads wget http://nginx-init-ubuntu.googlecode.com/files/nginx-init-ubuntu_v2.0.0-RC2.tar.bz2 tar xfv nginx-init-ubuntu_v2.0.0-RC2.tar.bz2 sudo mv nginx /etc/init.d/nginx sudo update-rc.d -f nginx defaults 

Nginx теперь запускается при запуске вашей системы, и вы можете управлять им с помощью следующих команд:

 sudo /etc/init.d/nginx stop sudo /etc/init.d/nginx start sudo /etc/init.d/nginx restart 

Это оно! На этом этапе вы сможете запустить nginx, нажать http: // localhost / в своем браузере и увидеть страницу «Welcome to nginx!» По умолчанию. Далее мы установим PHP 5.3.3, а затем, наконец, все настроим.

Шаг второй: установка PHP 5.3.3

Теперь мы установим PHP из исходного кода. Не стесняйтесь изменять любые параметры ./configure по своему --enable-fpm важными для наших целей являются строки --enable-fpm и --with-fpm :

 sudo apt-get install autoconf2.13 libbz2-dev libevent-dev libxml2-dev libcurl4-openssl-dev libjpeg-dev libpng-dev libxpm-dev libfreetype6-dev libt1-dev libmcrypt-dev libmysqlclient-dev libxslt-dev mysql-common mysql-client mysql-server cd ~/downloads wget http://us3.php.net/get/php-5.3.3.tar.gz/from/us.php.net/mirror/ tar zxvf php-5.3.3.tar.gz cd php-5.3.3 ./buildconf --force ./configure --prefix=/opt/php5 --with-config-file-path=/opt/php5/etc --with-curl --with-pear --with-gd --with-jpeg-dir --with-png-dir --with-zlib --with-xpm-dir --with-freetype-dir --with-t1lib --with-mcrypt --with-mhash --with-mysql --with-mysqli --with-pdo-mysql --with-openssl --with-xmlrpc --with-xsl --with-bz2 --with-gettext --with-fpm-user=www-data --with-fpm-group=www-data --enable-fpm --enable-exif --enable-wddx --enable-zip --enable-bcmath --enable-calendar --enable-ftp --enable-mbstring --enable-soap --enable-sockets --enable-sqlite-utf8 --enable-shmop --enable-dba --enable-sysvmsg --enable-sysvsem --enable-sysvshm make sudo make install и sudo apt-get install autoconf2.13 libbz2-dev libevent-dev libxml2-dev libcurl4-openssl-dev libjpeg-dev libpng-dev libxpm-dev libfreetype6-dev libt1-dev libmcrypt-dev libmysqlclient-dev libxslt-dev mysql-common mysql-client mysql-server cd ~/downloads wget http://us3.php.net/get/php-5.3.3.tar.gz/from/us.php.net/mirror/ tar zxvf php-5.3.3.tar.gz cd php-5.3.3 ./buildconf --force ./configure --prefix=/opt/php5 --with-config-file-path=/opt/php5/etc --with-curl --with-pear --with-gd --with-jpeg-dir --with-png-dir --with-zlib --with-xpm-dir --with-freetype-dir --with-t1lib --with-mcrypt --with-mhash --with-mysql --with-mysqli --with-pdo-mysql --with-openssl --with-xmlrpc --with-xsl --with-bz2 --with-gettext --with-fpm-user=www-data --with-fpm-group=www-data --enable-fpm --enable-exif --enable-wddx --enable-zip --enable-bcmath --enable-calendar --enable-ftp --enable-mbstring --enable-soap --enable-sockets --enable-sqlite-utf8 --enable-shmop --enable-dba --enable-sysvmsg --enable-sysvsem --enable-sysvshm make sudo make install 

Далее мы настроим PHP, скопировав файлы php.ini и php-fpm.conf по умолчанию и php-fpm.conf PHP-FPM при загрузке системы:

 sudo mkdir /var/log/php-fpm sudo chown -R www-data:www-data /var/log/php-fpm sudo cp -f php.ini-production /opt/php5/etc/php.ini sudo chmod 644 /opt/php5/etc/php.ini sudo cp /opt/php5/etc/php-fpm.conf.default /opt/php5/etc/php-fpm.conf sudo cp -f sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm sudo chmod 755 /etc/init.d/php-fpm sudo update-rc.d -f php-fpm defaults 

Ницца! Теперь PHP-FPM будет запускаться как демон при запуске.

Если вы получаете это или подобное при попытке запустить PHP-FPM:

 Starting pfp-fpm ................................ failed. 

Убедитесь, что ваш файл /etc/init.d/php-fpm имеет правильный путь к PHP-FPM, а также убедитесь, что вы коснулись файла .pid, чтобы процесс мог работать.

 sudo touch /var/run/php-fpm.pid 

Успех! Теперь у нас есть работающий сервер nginx и работающий сервер PHP-FPM. Все, что нам нужно сделать, это объединить их в конфигурации нашего сайта.

Шаг третий: Настройка нашего сайта WordPress

Далее мы загрузим WordPress и установим его в наш каталог localhost для тестирования. Я предполагаю, что мы уже настроили нашу базу данных MySQL с пользователем специально для нашей установки; MySQL настроен точно так же, используете ли вы nginx и PHP-FPM или обычный стек Apache и PHP.

Сначала мы настроим каталоги, необходимые для нашей локальной установки:

 mkdir ~/public_html mkdir ~/public_html/localhost/ mkdir -p ~/public_html/localhost/{public,private,logs,backup} cd ~/downloads wget http://wordpress.org/latest.zip unzip latest.zip mv wordpress/* ~/public_html/localhost/public cd ~/public_html/localhost/public vim wp-config-sample.php 

Введите свою конфигурацию MySQL в wp-config-sample.php. Затем сохраните файл и переименуйте его в wp-config.php. Теперь у вас есть только один шаг! Заставить nginx и PHP-FPM распознавать новый сервер WordPress.

Шаг четвертый: Настройка nginx для PHP-FPM

Мы настроим nginx для работы с обычными папками sites-enabled и sites-enabled Debian / Ubuntu для конфигурации sites-enabled за сайтом. Вы создаете файлы конфигурации сайта на sites-available , а затем вставляете символические ссылки на sites-enabled чтобы активировать их. Давайте сначала создадим эти две папки:

 sudo mkdir /usr/local/nginx/sites-available sudo mkdir /usr/local/nginx/sites-enabled 

Теперь вам нужно указать nginx загрузить все файлы конфигурации внутри sites-enabled . Для этого снова отредактируйте файл /usr/local/nginx/conf/nginx.conf . Где-то внутри блока http { ... } добавьте строку:

 include /usr/local/nginx/sites-enabled/*; 

Затем вырежьте весь блок server { ... } в nginx.conf – это конфигурация сервера по умолчанию, которую мы nginx.conf нашими виртуальными хостами на sites-available .

Теперь по хорошей части. Мы создадим виртуальный хост для нашего сайта WordPress, на sites-available . Создайте файл с именем localhost (или wordpress , или как угодно) внутри каталога, sites-available для sites-available . Вот что нужно в него вставить (замените «имя пользователя» на ваше имя пользователя):

 server { listen 80; server_name localhost; access_log /home/username/public_html/localhost/logs/access.log; error_log /home/username/public_html/localhost/logs/error.log; location / { root /home/username/public_html/localhost/public; index index.php index.html index.htm; if (-f $request_filename) { expires 30d; break; } if (!-e $request_filename) { rewrite ^(.+)$ /index.php?q=$1 last; } } location ~ .php$ { fastcgi_pass localhost:9000; # port where FastCGI processes were spawned fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /home/username/public_html/localhost/public/$fastcgi_script_name; # same path as above fastcgi_param PATH_INFO $fastcgi_script_name; include /usr/local/nginx/conf/fastcgi_params; } } 

Конфигурация относительно проста: сначала мы определяем корневой веб-каталог и указываем, какие индексные файлы должен искать сервер. Затем мы устанавливаем 30-дневный заголовок expires для статических файлов и перенаправляем любые другие запросы на index.php в нашем каталоге WordPress. Слишком много доступных параметров конфигурации для nginx, чтобы охватить их все здесь, но в вики nginx есть полный список .

Теперь осталось только добавить свой новый сайт на sites-enabled . Мы делаем это с помощью ссылки:

 ln -s /usr/local/nginx/sites-available/localhost /usr/local/nginx/sites-enabled/localhost sudo /etc/init.d/nginx restart 

Откройте браузер и перейдите по http://locahost/ (или там, где находится ваш сервер). Вы должны увидеть страницу установки WordPress. Установите свой WordPress как обычно. При настройке чистых URL-адресов в администраторе WordPress вам необходимо удалить index.php из структуры постоянной ссылки. (Например, вместо «example.com/index.php/2010/10/10/my-post/» у вас будет «example.com/2010/10/10/my-post/».)

Вот и все! Теперь у вас есть один скудный, средний сервер для вашего сайта WordPress. В следующем посте я рассмотрю несколько дополнительных настроек в нашей настройке nginx, и мы также добавим memcached в микс. Будьте на связи!