Тестирование, развертывание и обновление сайта PHP - PullRequest
4 голосов
/ 17 февраля 2011

Довольно скоро я опубликую свой проект веб-сайта, и, прежде чем он увидит свет, я хотел бы подготовить какую-то "обновленную модель". Я использую Debian с Apache, PHP 5.3 и MySQL (последнее, что я думаю), не установленным как один пакет, а скорее отдельно.

Мне пришла в голову простая идея проведения процесса, поэтому, пожалуйста, посмотрите и укажите на слабые места:

  • Тестирование - Где-то я обнаружил, что обычной практикой является развертывание тестовой версии сайта на поддомене beta.mysite.com для проведения оттуда тестов. Тесты будут использовать ту же базу данных, что и живой сайт. После первоначального выпуска каждый новый кандидат на тестирование будет отдельной ветвью (объединенной при развертывании, но все равно ничего не знает о ветвлении).
  • Развертывание - Если на бета-фазе все работает правильно, скопируйте и перезапишите старую версию страницы.

Проблемы, которые я могу определить сразу:

  1. Тесты будут в порядке, пока база данных остается неизменной. Что делать, если он все-таки изменился?
  2. Я бы хотел, чтобы обновление было максимально прозрачным, без каких-либо режимов обслуживания или чего-либо еще, но я боюсь, что копирование файлов приведет к проблемам в этом отношении.

Есть что-нибудь еще, что может быть проблемой здесь, или, может быть, есть более лучший способ сделать это?

Ответы [ 3 ]

5 голосов
/ 17 февраля 2011

1.Тестирование

Обычно вы никогда не тестируете что-либо в производственной среде, особенно в производственной базе данных, по трем причинам:

  • Производительность: тестирование может выполняться с использованием ЦПинтенсивно тратить и другие драгоценные ресурсы ваших серверов.Поскольку вы не хотите снижать производительность производственной среды во время тестов, вам не следует использовать производственную среду для этого.

  • Защита данных: Вы не делаетеЯ не хочу изменять данные в вашей производственной базе данных во время тестов.Это означает, что не только ваши тесты могут иметь ограниченный диапазон (т. Е. Вы, вероятно, дважды подумаете, прежде чем тестировать какую-либо ошибку, которая может уничтожить все данные, относящиеся к вашим реальным пользователям, что позволит хакеру использовать эту ошибку позже.), но вы можете случайно изменить данные , запустив непроверенный код в производственной базе данных.

  • Безопасность: , если вы находитесь в контекстекомпании и вашей команды, вы, вероятно, поручаете работу, связанную с тестами, специальному тестировщику.Предоставление этому тестеру доступа к производственной среде не является хорошей идеей из соображений безопасности.

1.1 Тестовая среда

Тестовая среда должна бытькак можно ближе к производственной среде.Например, если вы тестируете приложение, которое вы поставляете для Windows XP с .NET Framework 3.5, вам не следует тестировать его под Windows 7 с .NET Framework 4, потому что все будет работать во время тестов и не получится после того, как ваши клиенты начнут использовать приложение.

Пример: однажды я работал над приложением, которое использовало альтернативные потоки данных NTFS.Все отлично работало как во время разработки, так и во время тестов, когда никто не задумывался о том, что в 2009 году FAT32 все еще жив.Конечно, после запуска клиент установил приложение на флэш-накопитель, отформатированный в FAT32, и он упал.

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

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

1.2 База данных: тестирование узких мест

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

1.3 База данных: тестирование правильности вывода

Другой случай, когда вы хотите, чтобы ваши тестовые данные отличались от производственных данных, - это избегать внедрения HTML и проверять правильность вывода.Если у вас есть веб-сайт электронной коммерции, у вас есть таблица SQL Products, и у каждого продукта есть заголовок, который будет отображаться на веб-сайте.В тестовой среде у вас должны быть продукты с именами, такими как:

1. A very long name of a product goes here. Oh, this name is really huge!
2. javascript:alert('<a>&\é<%щ你好')
3. 
4. '; delete * from Users

Эти имена гарантируют, что:

  1. Длинные имена отображаются правильно,
  2. Именаправильное экранирование, поддерживается Юникод и правильная кодировка,
  3. Пустые имена не нарушают компоновку,
  4. Внедрение SQL не допускается, но без экранирования во время вывода (в случае, когда заголовок может бытьизменено через сайт).

Если вы начнете заполнять производственную базу данных подобными вещами, ваши пользователи, вероятно, подумают, что ваш сайт сломан или взломан.

2.Развертывание

Все зависит от фактического количества запросов в секунду.

2.1 Небольшие веб-сайты

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

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

2.2 Фермы серверов

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

1 голос
/ 17 февраля 2011

Вы правы, копирование файлов может занять некоторое время и потенциально может нарушить работу сайта при копировании.Лучшим вариантом было бы использовать rsync, чтобы копировались только измененные файлы, что было бы быстрее.

Еще лучше использовать символические ссылки.Укажите на веб-сервере символическую ссылку, которая указывает на каталог «production».Сделайте то же самое для каталога test / beta.Когда тестирование будет завершено, наведите производственную символическую ссылку на тестовый каталог, который теперь станет вашим рабочим каталогом.

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

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

1 голос
/ 17 февраля 2011

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

...