Установите apache documentRoot на символическую ссылку (для простоты развертывания) - PullRequest
10 голосов
/ 02 июня 2010

мы ищем способ указать нашему Apache DocumentRoot символическую ссылку. Например. DocumentRoot / var / www / html / finalbuild

finalbuild должен указывать на папку где-то вроде / home / user / build3

когда мы перемещаем новую сборку в / home / user / build4, мы хотим использовать сценарий оболочки, который изменяет символическую ссылку "finalebuild" на этот новый каталог / home / user / build4 и выполняет изящный перезапуск apache для новая версия веб-приложения запущена и работает без особых рисков.

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

Ответы [ 2 ]

7 голосов
/ 12 января 2012

Мы используем capistrano для использования аналогичной установки. Однако мы столкнулись с несколькими проблемами:

После перехода к настройкам все шло нормально, но затем мы заметили, что после запуска cap deploy, хотя символическая ссылка была изменена, чтобы указывать на ревизию заголовка, браузер по-прежнему отображал старые страницы. даже после нескольких обновлений и добавления различных параметров GET.

Сначала мы думали, что это кэширование браузера, поэтому для разработки мы отключили кэширование браузера через заголовки HTTP, но это ничего не изменило. Затем я проверил, чтобы убедиться, что мы не выполняем полностраничное кэширование на стороне сервера, и мы этого не сделали. Но затем я заметил, что если я удалю файл в ревизии, на которую ссылалась символическая ссылка, мы получим 404, так что Apache обслуживает новые страницы, но он все еще следовал «старой символической ссылке» и обслуживал страницы от неправильный каталог.

Это на виртуальном хостинге, поэтому я не смог перезапустить Apache. Поэтому я попытался удалить символическую ссылку и каждый раз создавать новую. Казалось, это работает иногда , но не надежно. Это работало, вероятно, 25 ~ 50% времени.

В конце концов я обнаружил, что если я:

  1. удалил существующую символическую ссылку (удалив ее или переименовав);
  2. сделал запрос страницы, в результате чего Apache попытался разрешить символическую ссылку, но обнаружил, что она отсутствует (в результате 404)
  3. затем создал новую символическую ссылку на новый каталог

Это может привести к корректному обновлению документа в большинстве случаев. Однако даже это не идеально, и примерно в 2-5% случаев, когда сценарий развертывания запускает wget для извлечения страницы сразу после переименования старой символической ссылки, он возвращает старую страницу, а не 404.

Похоже, что Apache либо кэширует файловую систему, либо, возможно, команда mv изменила файловую систему только в памяти, когда Apache считывал из файловой системы на диске (на самом деле не имеет никакого смысла). В любом случае я принял чью-то рекомендацию запустить sync после изменения символической ссылки, что должно синхронизировать файловую систему на диске с памятью, и, возможно, небольшая задержка также поможет wget вернуть 404.

3 голосов
/ 17 ноября 2010

Я использовал символические ссылки в качестве apache DocumentRoot в производственном процессе без необходимости постепенного перезапуска. В общем, идея должна работать. Ошибка 403, вероятно, указывает на ошибку прав доступа, не связанную с изменением символической ссылки. Добавленная складка, которую вы хотели бы добавить, - , делающая символьную ссылку атомарной , чтобы символическая ссылка всегда существовала То есть символическая ссылка ни разу не существует, даже на мгновение.

Решением этой проблемы является изменение, создав новую символическую ссылку и переименовав ее в старую символическую ссылку. В Unix-подобных системах переименование является атомарной операцией, и поэтому «изменение» символической ссылки также будет атомарным. Вручную процесс выглядит так:

$ ln -s new current_tmp && mv -Tf current_tmp current
...