Статьи

Введение в развертывание WordPress с Mina

Как приложение PHP, WordPress обычно развертывается очень старым методом: загрузка файлов через FTP.

У нас есть некоторые инструменты для развертывания, но они часто требуют навыков работы с Ruby. Например, одним из популярных и мощных инструментов является Capistrano, но он также очень тяжел со многими функциями, связанными с Ruby / Rails. Я также думаю, что немного сложно установить Capistrano для разработчика PHP без знания Ruby.

Итак, какие варианты у нас есть как разработчиков WordPress?

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

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

Этот процесс автоматизации может совместно использоваться несколькими разработчиками в команде, создавая уникальный метод для развертывания во всей команде. Одна компания почти обанкротилась из-за отсутствия хорошего процесса развертывания . Метод автоматического развертывания обычно связан с системой управления исходным кодом: Git, SVN, Mercurial и так далее.

В рамках этого урока мы рассмотрим Git. Если у вас был репозиторий Git, не стесняйтесь его использовать; в противном случае, получите бесплатный в BitBucket или GitLab . Эти сервисы позволяют вам создавать частные Git-репозитории.

Прежде чем идти дальше, убедитесь, что мы отвечаем требованиям:

  • соединение SSH
  • хранилище Git
  • Разрешение на редактирование и изменение конфигурации веб-сервера.

[примечание] Я предполагаю, что вы используете WordPress на Apache с PHP, устанавливаемым как модуль Apache PHP. Если вы используете PHP с FPM или CGI, будьте осторожны, когда мы говорим о нашем веб-сервере или нашем процессе PHP. [/нота]

Общая идея заключается в том, что когда мы отправляем на сервер, Git вызывает URL, который может ссылаться на скрипт PHP для выполнения развертывания, извлекая или объединяя новейший код из репозитория.

Хотя это прекрасно работает и очень полезно, оно открывает дыру: мы открыли секретную дверь на сервере. Если кто-то знает этот URL, он может запустить развертывание вручную. Другая опасность заключается в том, что мы должны создавать функции для очистки, отката, блокировки (чтобы убедиться, что выполняется только один процесс развертывания) и так далее.

Если мы начинаем кодировать эти функции, мы заново изобретаем колесо, так почему бы не использовать существующий инструмент?

Mina — инструмент развертывания, цель которого — быть очень быстрым; Вы будете удивлены, насколько быстро это будет, когда попробуете. По данным сайта Мины :

Действительно быстрый инструмент развертывания и автоматизации сервера. Действительно чертовски быстро.

Проще говоря, здесь «как думать о Мине: вместо входа на сервер и введите последовательность команд для развертывания. Мина генерирует сценарий оболочки, который представляет собой набор этих команд.

  1. Создать новый каталог,
  2. Вставьте последний код в этот каталог,
  3. Сделайте символическую ссылку на общие ресурсы,
  4. Укажите общедоступный каталог на этот новый каталог,
  5. Очистите старые данные.

Мина загружает этот скрипт на сервер и выполняет его. Этот процесс генерации выполняется на вашем локальном компьютере.

Все задачи Mina — это просто последовательность команд оболочки. Поскольку это всего лишь команды оболочки, у вас не будет доступа к фантастическому помощнику Ruby, как в Capistrano или Vlad.

Еще один способ думать о Mina заключается в следующем: Mina организует команды вашей оболочки, которые вам нужны для запуска на удаленной машине, в блоки кода (которые называются задачами Mina).

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

1
2
3
4
5
6
7
8
/var/www/yourdomain.com/ # The public directory where your WordPress sits
|- index.php
|- wp-admin
|- wp-content
|- wp-includes
|- wp-login.php
|- wp-activate.php
|- ….

yourdomain.com указывает на /var/www/yourdomain.com/ , и файл index.php , который находится внутри этого каталога, выполняется и отвечает на ваш запрос. С Mina вам придется немного изменить макет каталога.

Мина ожидает эту структуру:

01
02
03
04
05
06
07
08
09
10
/var/www/yourdomain.com/ # The deploy_to path
|- releases/ # Holds releases, one subdir per release
|
|
|
|
|- shared/ # Holds files shared between releases: such as log file, config,…
|
|
|- current/ # A symlink to the current release in releases, this will be new public folder

Мина добавляет три каталога:

  1. releases : каждое развертывание будет храниться в отдельных каталогах внутри этой папки, что позволяет нам поддерживать версию 1, версию 2, версию 3 и так далее.
  2. shared : содержит общие файлы / папки, которые используются несколькими пользователями. Примером является wp-content/uploads . При каждом развертывании у нас будет новый каталог wp-content/uploads который отличается от предыдущего каталога wp-content/uploads . И контент внутри ушел. Поэтому мы будем использовать общий каталог: shared/wp-content/uploads . У нас будет: /var/www/yourdomain.com/releases/7/wp-contents/uploads — символическая ссылка указывает на /var/www/yourdomain.com/shared/wp-content/uploads .
  3. current : указывает на текущий выпуск. Пример: /var/www/yourdomain.com/current указывает на /var/www/yourdomain.com/releases/7.

Согласно Википедии :

Символическая ссылка (также символическая ссылка или программная ссылка) — это специальный тип файла, который содержит ссылку на другой файл или каталог в форме абсолютного или относительного пути и влияет на разрешение имени пути. Символьные ссылки уже присутствовали к 1978 году в мини-операционных системах от DEC и RDOS от Data General. Сегодня они поддерживаются стандартом операционной системы POSIX, большинством Unix-подобных операционных систем, таких как FreeBSD, GNU / Linux и Mac OS X, а также операционными системами Windows, такими как Windows Vista, Windows 7 и в некоторой степени в Windows 2000. и Windows XP в виде файлов ярлыков.

Yourdomain.com теперь должен Yourdomain.com на /var/www/yourdomain.com/current вместо /var/www/yourdomain.com . Веб-сервер будет запускать файл /var/www/yourdomain.com/current/index.php при посещении http://yourdomain.com . Мы должны перенастроить веб-сервер (Apache, Nginx), чтобы указать docroot (или public directory ) на этот current каталог.

Откройте ваш /etc/httpd/conf/httpd.conf , найдите строку DocumentRoot и измените ее на.

1
DocumentRoot /var/www/yourdomain.com/current

Отредактируйте ваш /etc/nginx/nginx.conf и обновите определение root .

1
2
3
4
5
server {
server_name log.axcoto.com www.log.axcoto.com;
root /srv/http/domain/log.axcoto.com/current/;
# …
}

Mina является самоцветом Ruby, поэтому вам нужно установить Ruby. Установка довольно есы. Если вы используете OS X или Linux, скорее всего, у вас уже установлен Ruby; в противном случае вы можете следовать этим инструкциям для установки Ruby:

Когда у вас есть Ruby, приступайте к установке гема. Просто беги:

1
$ gem install mina

Убедитесь, что Мина работает правильно.

1
$ mina -V

Вы должны увидеть нечто подобное.

1
Mina, version v0.3.0

Одна из вещей, которая делает приложения PHP менее безопасными, — установка неправильных разрешений.

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

Показательный пример: они могут прочитать файл в / etc, узнать конфигурацию сервера, а затем начать выполнять команды оболочки через PHP.

Я думаю, что мы должны рассматривать экземпляр WordPress как установку только для чтения. Для установки тем и плагинов мы можем установить их путем локального добавления файлов, а затем повторно развернуть через Mina. Развертывание с помощью Mina дешево и очень быстро, на моем сервере DigitalOcean с 512 МБ ОЗУ развертывание занимает менее 30 секунд.

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

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

Как указано в начале урока, у вас должен быть Git-репозиторий для вашего сайта WordPress. Напомним, что нам нужно здесь:

Давайте предположим, что …

  1. Ваш проект WordPress будет в ~ / Site / WordPress.
  2. Ваш git-репозиторий WordPress — [email protected]/yourname/wordpress
  3. Вы можете получить доступ к вашему серверу через ssh, используя учетную запись, которая называется yourname на yourdomain.com

Если вы не знакомы с Git, пожалуйста, прочитайте следующие уроки:

  1. https://net.tutsplus.com/sessions/git-succinctly/
  2. https://net.tutsplus.com/tutorials/other/easy-version-control-with-git/
  3. https://net.tutsplus.com/tag/git/

Если ваш исходный код WordPress не является репозиторием Git, давайте сделаем это сейчас; в противном случае перейдите к следующему шагу.

1
2
3
4
5
$ cd ~/Site/wordpress
$ git init
$ git remote add origin [email protected]:kureikain/wordpress.git
$ git add .
$ git push origin master

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

1
$ mina init

Это создаст вам config папки с одним файлом deploy.rb внутри.

01
02
03
04
05
06
07
08
09
10
11
$ ls
config wp-blog-header.php wp-load.php
index.php wp-comments-post.php wp-login.php
latest.tar.gz wp-config-sample.php wp-mail.php
license.txt wp-content wp-settings.php
readme.html wp-cron.php wp-signup.php
wp-activate.php wp-includes wp-trackback.php
wp-admin wp-links-opml.php xmlrpc.php
 
$ ls config
deploy.rb

Теперь откройте config / deploy.rb на предыдущем шаге и давайте определим некоторую конфигурацию.

Этот файл deploy.rb содержит конфигурацию развертывания и набор задач Mina. Каждая задача обернута внутри task :taskname блок имени task :taskname . Внутри каждой задачи мы можем вызвать другую задачу с помощью invoke Чтобы запустить команду на сервере, вы указываете ее с помощью команды queue .

Например, задача может выглядеть так:

1
2
3
4
5
task :down do
  invoke :maintenance_on
  invoke :restart
  queue ‘rm -rf /tmp/cache’
end

Имея это в виду, давайте начнем редактировать этот файл deploy.rb.

Закомментируйте эти строки, так как мы не будем их использовать.

1
2
#require ‘mina/bundler’
#require ‘mina/rails’

Код по умолчанию выглядит следующим образом

1
2
3
4
5
set :user, ‘username’
set :domain, ‘foobar.com’
set :deploy_to, ‘/var/www/foobar.com’
set :repository, ‘git://…’
set :branch, ‘master’
  1. domain является доменом для доменного имени вашего сайта WordPress.
  2. deploy_to — это место, где вы хотите найти свой проект WordPress.
  3. repository — это ваш адрес хранилища Git.
  4. Разветвите ветку развертывания. Git поддерживает множество веток, и некоторые люди хотят иметь ветку развертывания для целей развертывания.

Давайте обновим его с помощью конфигурации нашего сервера:

1
2
3
4
5
set :domain, ‘yourdomain.com’
set :deploy_to, ‘/var/www/yourdomain.com’
set :repository, ‘https://[email protected]/kureikain/wordpress.git’
set :branch, ‘master’
set :user, ‘your_username’ # Username in the server to SSH to.

Убедитесь, что вы можете получить доступ к repository на удаленной машине.

Далее мы будем обрабатывать папку wp-content/uploads . Эта папка содержит загруженный пользователем контент. Каждый раз, когда мы внедряем, это будет папка, отличная от той, которую мы используем в настоящее время, потому что недавно развернутый код находится в другой папке внутри releases .

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

Найдите эту строку:

1
set :shared_paths, [‘config/database.yml’, ‘log’]

И измените его на:

1
set :shared_paths, [ ‘wp-content/uploads’]

shared_paths представляет собой набор общих ресурсов (файл / папка) между различными выпусками и может отличаться между выпусками. Как и файлы журналов, загруженный пользователем контент должен быть помещен в shared_paths. Если мы этого не сделаем, мы потеряем данные с каждым новым выпуском.

Например: когда пользователь загружает файл, WordPress сохраняет его в /var/www/yourdomain.com/current/wp-content/upload/2014/01/29/picture.png . Но /var/www/yourdomain.com/current является символической /var/www/yourdomain.com/releases/4/ на /var/www/yourdomain.com/releases/4/ которая является нашей текущей версией. Поэтому фактический файл находится по адресу: /var/www/yourdomain.com/releases/4/wp-content/upload/2014/01/29/picture.png .

Теперь, если вы сделали новый выпуск, current будет указывать на /var/www/yourdomain.com/releases/5 . Файл /var/www/yourdomain.com/current/wp-content/upload/2014/01/29/picture.png больше не существует, поскольку /var/www/yourdomain.com/releases/5/wp-content/uploads — это новая папка без содержимого.

Поэтому мы должны поместить его в shared_paths, и Мина создаст символическую ссылку, чтобы указать /www/yourdomain.com/releases/5/wp-content/uploads на /www/yourdomain.com/shared/wp-content/uploads.

Это задача, которую мы запускаем впервые для подготовки нашей серверной среды. По умолчанию выглядит так:

01
02
03
04
05
06
07
08
09
10
task :setup => :environment do
  queue!
  queue!
 
  queue!
  queue!
 
  queue!
  queue %[echo «——> Be sure to edit ‘shared/config/database.yml’.»]
end

Давайте изменим это на:

1
2
3
task :setup => :environment do
  queue!
end

Наша задача установки просто создает каталог wp-content/uploads .

Задание по умолчанию выглядит следующим образом.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
task :deploy => :environment do
  deploy do
    # Put things that will set up an empty directory into a fully set-up
    # instance of your project.
    invoke :’git:clone’
    invoke :’deploy:link_shared_paths’
    invoke :’bundle:install’
    invoke :’rails:db_migrate’
    invoke :’rails:assets_precompile’
 
    to :launch do
      queue «touch #{deploy_to}/tmp/restart.txt»
    end
  end
end

Нам не нужно ничего, что связано с Rails. Кроме того, поскольку развертывание WordPress не требовало перезапуска веб-сервера или PHP, нам нужно только вызвать задачу git: clone и deploy: link_shared_paths.

Позвольте изменить их на:

1
2
3
4
5
6
7
8
task :deploy => :environment do
  deploy do
    # Put things that will set up an empty directory into a fully set-up
    # instance of your project.
    invoke :’git:clone’
    invoke :’deploy:link_shared_paths’
  end
end

К сожалению, у Мины нет официального метода отката, поэтому я создал задачу для нашего собственного процесса отката. Задача отката сделает то, что она удалит текущий выпуск и перенаправит current символическую ссылку на предыдущий выпуск. Добавьте эту задачу в конец вашего deploy.rb

1
2
3
4
5
desc «Rollback to previous verison.»
task :rollback => :environment do
  queue %[echo «—-> Start to rollback»]
  queue %[if [ $(ls #{deploy_to}/releases | wc -l) -gt 1 ];
end

Приведенный выше код выглядит сложным, но на самом деле это однострочная версия следующего кода. Я сломаю это и помещу аннотацию сверху каждой команды.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
# Check whether we have than 1 releases
if [ $(ls /var/www/yourdomain.com/releases | wc -l) -gt 1 ]
then
  echo «—->Relink to previos release»
  # Remove current symlink
  unlink /var/www/yourdomain.com/current
  # Point it to the previous release
  ln -s /var/www/yourdomain.com/releases/»$(ls /var/www/yourdomain.com/releases | tail -2 | head -1)» /var/www/yourdomain.com/current
  echo «Remove old releases»
  # Remove latest release which we already rollback
  rm -rf /var/www/yourdomain.com/releases/»$(ls /var/www/yourdomain.com/releases | tail -1)»
  # Log current version to last_version file
  echo «$(ls /var/www/yourdomain.com/releases | tail -1)» > /var/www/yourdomain.com/last_version
  # Out put some info to user
  echo «Done. Rollback to v$(cat /var/www/yourdomain.com/last_version)»
else
  # If we don’t have more than 1 releases, then we cannot rollback.
  echo «No more release to rollback»
fi

На этом этапе мы настраиваем сервер, редактируем задачу установки, разворачиваем задачу и задачу отката. Давайте начнем на самом деле использовать Мину сейчас.

В этой части я покажу вам, как запустить Mina для настройки сервера, развертывания на сервере и выполнения отката. Mina — это утилита командной строки. Вам нужно иметь доступ к терминалу. Каждое задание Mina будет вызываться из терминала.

Мы запускаем его только в первый раз, когда готовимся к развертыванию на сервере. SSH к серверу и создайте каталог deploy_to . В нашем случае это /var/www/yourdomain.com .

1
2
3
4
# on your remote machine (after you connected via SSH), run this
$ sudo mkdir -p /var/www/yourdomain.com
$ sudo chown -R your_name /var/www/yourdomain.com

После запуска команды chown мы изменим владельца /var/www/yourdomain.com на пользователя your_name . Поэтому веб-сервер не может ничего записать в этот каталог. Наш сайт WordPress будет таким образом более защищенным. Далее, на вашем локальном компьютере, запустите mina setup . Это выводит что-то вроде этого:

01
02
03
04
05
06
07
08
09
10
11
$ mina setup
——> Setting up /var/www/yourdomain.com
 
       total 16
       drwxr-xr-x 4 kurei root 4096 Jan 27 22:51 .
       drwxr-xr-x 3 root root 4096 Jan 27 00:16 ..
       drwxr-xr-x 2 kurei users 4096 Jan 27 22:51 releases
       drwxr-xr-x 2 kurei users 4096 Jan 27 22:51 shared
 
——> Done.
       Elapsed time: 1.00 seconds

Если вы хотите подтвердить, что Мина создала для нас на сервере, давайте проверим это на удаленной машине:

1
2
3
4
5
$ cd /var/www/yourdomain.com
$ ls
releases shared
$ ls shared/wp-content
uploads

На данный момент все почти готово. Помните, что каталог загрузки хранит загруженный пользователем контент. Следовательно, веб-сервер должен иметь возможность записи в него. Мы должны определить, на каком пользователе работает ваш Apache / Nginx (или процесс PHP FPM, зависит от того, как вы конфигурируете свой сервер), и изменить владельца папки для загрузки на него, чтобы веб-сервер мог выполнять запись в эту папку. Обычно, если вы открываете свой файл конфигурации Apache или файл конфигурации Nginx, вы можете найти этого пользователя, что-то похожее:

[Sourecode]
# Для Apache откройте /etc/httpd/conf/httpd.conf
Пользователь www Group www

# Для Nginx откройте /etc/nginx/nginx.conf

пользователь http http; рабочий_процесс 2;
[/ Sourecode]

Предположим, что Apache работает от пользователя www .

[sourecode] ssh [email protected] sudo chown -R www /var/www/yourdomain.com/wp-content/uploads [/ sourecode]

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

Процесс такой:

  • обновить код
  • совершить изменение.
  • нажмите на сервер Git.

Как только ваш код был на Git-сервере.

Давайте развернем

1
$ mina deploy

Через несколько секунд это должно закончиться. Вот пример вывода результатов развертывания:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
$ mina deploy
——> Creating a temporary build path
——> Fetching new git commits
——> Using git branch ‘master’
       Cloning into ‘.’…
       done.
——> Using this git commit
 
       kureikain (347d9b3):
       > Update new config/deploy
 
——> Symlinking shared paths
——> Build finished
——> Moving build to releases/2
——> Updating the current symlink
——> Launching
——> Done.
       Elapsed time: 1.00 seconds

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

1
$ mina rollback

Его вывод что-то вроде

1
2
3
4
5
6
—-> Start to rollback
—-> Relink to previous release
Remove old releases
Done.
Connection to axcoto.com closed.
       Elapsed time: 0.00 seconds

Вы узнали, как развернуть с Миной. Процесс развертывания сейчас довольно быстрый. Ваш сайт будет испытывать нулевое время простоя. Но не останавливайтесь на этом, зайдите на сайт Мины и больше об этом думайте. Я поделился примером проекта WordPress, который использует Mina на GitHub .

В следующей части мы узнаем о WP-CLI. В частности, мы узнаем, как его использовать и выполнять общие задачи администратора, такие как обновление WordPress, установка тем, плагинов и т. Д. Через WP-CLI поверх задачи Mina. Мы также рассмотрим, как мы используем его, чтобы сделать нашу установку WordPress более безопасной.

А пока оставьте комментарий о том, что вы делаете, чтобы сделать развертывание WordPress быстрым.