Установите apache documentRoot на символическую ссылку (для простоты развертывания)
Мы ищем способ указать нашему Apache DocumentRoot символическую ссылку. Например, DocumentRoot / var / www / html / finalbuild
finalbuild должен указывать на папку где-то вроде /home/user/build3
когда мы перемещаем новую сборку в /home/user/build4, мы хотим использовать сценарий оболочки, который изменяет символическую ссылку "finalebuild" на этот новый каталог /home/user/build4, и изящно перезапускаем apache, чтобы получить новое веб-приложение. версия работает и работает с небольшим риском.
Какой лучший способ создать эту символическую ссылку и впоследствии изменить эту ссылку с помощью сценария оболочки?
2 ответа
Мы используем Capistrano для использования аналогичной установки. Однако мы столкнулись с несколькими проблемами:
После переключения на настройку все шло нормально, но потом мы начали замечать, что после запуска cap deploy
даже если символическая ссылка была изменена, чтобы указывать на ревизию заголовка, браузер по-прежнему будет отображать старые страницы даже после нескольких обновлений и добавления различных параметров GET.
Сначала мы думали, что это кэширование браузера, поэтому для разработки мы отключили кэширование браузера через заголовки HTTP, но это ничего не изменило. Затем я проверил, чтобы убедиться, что мы не выполняем полностраничное кэширование на стороне сервера, и мы этого не сделали. Но затем я заметил, что если я удалю файл в ревизии, на которую ссылалась символическая ссылка, мы получим 404, так что Apache обслуживает новые страницы, но он все еще следовал "старой символической ссылке" и обслуживал страницы от неправильный каталог.
Это на виртуальном хостинге, поэтому я не смог перезапустить Apache. Поэтому я попытался удалить символическую ссылку и каждый раз создавать новую. Казалось, это иногда работает, но не надежно. Это работало, вероятно, 25~50% времени.
В конце концов я обнаружил, что если я:
- удалил существующую символическую ссылку (удалив ее или переименовав);
- сделал запрос страницы, в результате чего Apache попытался разрешить символическую ссылку, но обнаружил, что она отсутствует (в результате 404)
- затем создал новую символическую ссылку на новый каталог
Это может привести к корректному обновлению документации в большинстве случаев. Однако даже это не идеально, и примерно в 2-5% случаев, когда запускается сценарий развертывания wget
чтобы получить страницу сразу после переименования старой символической ссылки, она вернула бы старую страницу, а не 404.
Похоже, что Apache либо кэширует файловую систему, либо, возможно, mv
Команда только изменила файловую систему в памяти, когда Apache считывал из файловой системы на диске (на самом деле не имеет никакого смысла). В любом случае, я принял чью-то рекомендацию бежать sync
после изменения символической ссылки, которая должна синхронизировать файловую систему на диске с памятью, и, возможно, небольшая задержка также поможет wget
вернуть 404.
Я использовал символические ссылки в качестве apache DocumentRoot в производственном процессе без необходимости постепенного перезапуска. В общем, идея должна работать. Ошибка 403, вероятно, указывает на ошибку прав доступа, не связанную с изменением символической ссылки. Добавленная складка, которую вы хотели бы добавить, делает переключатель символьной ссылки атомарным, чтобы символическая ссылка всегда существовала. То есть символическая ссылка ни разу не существует, даже на мгновение.
Решение этой проблемы состоит в том, чтобы произвести изменение путем создания новой символической ссылки, а затем переименовать ее поверх старой символической ссылки. В Unix-подобных системах переименование является атомарной операцией, и поэтому "изменение" символической ссылки также будет атомарным. Вручную процесс выглядит так:
$ ln -s new current_tmp && mv -Tf current_tmp current