Как приложение 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 Hooks
Общая идея заключается в том, что когда мы отправляем на сервер, Git вызывает URL, который может ссылаться на скрипт PHP для выполнения развертывания, извлекая или объединяя новейший код из репозитория.
Хотя это прекрасно работает и очень полезно, оно открывает дыру: мы открыли секретную дверь на сервере. Если кто-то знает этот URL, он может запустить развертывание вручную. Другая опасность заключается в том, что мы должны создавать функции для очистки, отката, блокировки (чтобы убедиться, что выполняется только один процесс развертывания) и так далее.
Если мы начинаем кодировать эти функции, мы заново изобретаем колесо, так почему бы не использовать существующий инструмент?
Что такое Мина?
Mina — инструмент развертывания, цель которого — быть очень быстрым; Вы будете удивлены, насколько быстро это будет, когда попробуете. По данным сайта Мины :
Действительно быстрый инструмент развертывания и автоматизации сервера. Действительно чертовски быстро.
Проще говоря, здесь «как думать о Мине: вместо входа на сервер и введите последовательность команд для развертывания. Мина генерирует сценарий оболочки, который представляет собой набор этих команд.
- Создать новый каталог,
- Вставьте последний код в этот каталог,
- Сделайте символическую ссылку на общие ресурсы,
- Укажите общедоступный каталог на этот новый каталог,
- Очистите старые данные.
Мина загружает этот скрипт на сервер и выполняет его. Этот процесс генерации выполняется на вашем локальном компьютере.
Все задачи Mina — это просто последовательность команд оболочки. Поскольку это всего лишь команды оболочки, у вас не будет доступа к фантастическому помощнику Ruby, как в Capistrano или Vlad.
Еще один способ думать о Mina заключается в следующем: Mina организует команды вашей оболочки, которые вам нужны для запуска на удаленной машине, в блоки кода (которые называются задачами Mina).
Шаг 1. Подготовьте макет сервера для 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
|
Мина добавляет три каталога:
-
releases
: каждое развертывание будет храниться в отдельных каталогах внутри этой папки, что позволяет нам поддерживать версию 1, версию 2, версию 3 и так далее. -
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
. -
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
каталог.
Изменить DocumentRoot для Apache
Откройте ваш /etc/httpd/conf/httpd.conf
, найдите строку DocumentRoot
и измените ее на.
1
|
DocumentRoot /var/www/yourdomain.com/current
|
Изменить корень документа для Nginx
Отредактируйте ваш /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/;
# …
}
|
Шаг 2. Установка Мины
Mina является самоцветом Ruby, поэтому вам нужно установить Ruby. Установка довольно есы. Если вы используете OS X или Linux, скорее всего, у вас уже установлен Ruby; в противном случае вы можете следовать этим инструкциям для установки Ruby:
- https://net.tutsplus.com/tutorials/why-you-should-use-rvm/
- https://net.tutsplus.com/tutorials/ruby/how-to-install-ruby-on-a-mac/
Когда у вас есть Ruby, приступайте к установке гема. Просто беги:
1
|
$ gem install mina
|
Убедитесь, что Мина работает правильно.
1
|
$ mina -V
|
Вы должны увидеть нечто подобное.
1
|
Mina, version v0.3.0
|
Развертывание WordPress с Миной
Одна из вещей, которая делает приложения PHP менее безопасными, — установка неправильных разрешений.
Возьмем WordPress для примера: я могу захотеть загрузить плагин или загрузить тему, чтобы попробовать его. Для этого я загружаю их в панель управления WordPress. Если я или один из администраторов сайта теряет пароль администратора, кто-то входит, и они могут загрузить файл PHP и запустить его как плагин, и взломать не только мой сайт, но и весь мой сервер.
Показательный пример: они могут прочитать файл в / etc, узнать конфигурацию сервера, а затем начать выполнять команды оболочки через PHP.
Я думаю, что мы должны рассматривать экземпляр WordPress как установку только для чтения. Для установки тем и плагинов мы можем установить их путем локального добавления файлов, а затем повторно развернуть через Mina. Развертывание с помощью Mina дешево и очень быстро, на моем сервере DigitalOcean с 512 МБ ОЗУ развертывание занимает менее 30 секунд.
Для загруженного пользователем содержимого (например, изображений и аудиофайлов) мы будем ссылаться на них вне каталога исходного кода, и было бы лучше, если бы мы могли настроить сервер так, чтобы он не выполнял какой-либо файл PHP внутри этой папки содержимого, загруженного пользователем, но это выходит за рамки этого урока.
Сейчас мы попытаемся использовать Mina для быстрого развертывания, добавив тему или плагин, и мы сделаем это локально, чтобы избежать предоставления веб-серверу разрешения на запись в эти каталоги.
Шаг 1. Настройка Mina с помощью WordPress
Как указано в начале урока, у вас должен быть Git-репозиторий для вашего сайта WordPress. Напомним, что нам нужно здесь:
Давайте предположим, что …
- Ваш проект WordPress будет в ~ / Site / WordPress.
- Ваш git-репозиторий WordPress — [email protected]/yourname/wordpress
- Вы можете получить доступ к вашему серверу через ssh, используя учетную запись, которая называется yourname на yourdomain.com
Если вы не знакомы с Git, пожалуйста, прочитайте следующие уроки:
- https://net.tutsplus.com/sessions/git-succinctly/
- https://net.tutsplus.com/tutorials/other/easy-version-control-with-git/
- 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
|
Шаг 2. Настройте 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’
|
-
domain
является доменом для доменного имени вашего сайта WordPress. -
deploy_to
— это место, где вы хотите найти свой проект WordPress. -
repository
— это ваш адрес хранилища Git. - Разветвите ветку развертывания. 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 будет вызываться из терминала.
Шаг 1. Подготовьтесь
Мы запускаем его только в первый раз, когда готовимся к развертыванию на сервере. SSH к серверу и создайте каталог deploy_to
. В нашем случае это /var/www/yourdomain.com
.
1
2
3
4
|
$ ssh [email protected]
# 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]
Шаг 2. Развертывание
Каждый раз, когда мы хотим развернуть код, мы используем эту задачу.
Процесс такой:
- обновить код
- совершить изменение.
- нажмите на сервер 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
|
Шаг 3. Откат
Если в выпуске есть критические ошибки или мы просто хотим откатить код до предыдущего выпуска по тем или иным причинам, мы делаем это:
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 быстрым.