Я установил веб-сервер с nginx и другой сервер с php-fpm на виртуальных машинах Linode. Nginx перенаправляет все запросы PHP на серверную часть PHP, и это отлично работает.
Проблема в том, что фактические веб-файлы должны существовать как на веб-сервере, так и на рабочем месте PHP и должны быть синхронизированы.
Как это достигается? Я думал, что оптимальным решением будет использование общего хранилища (NFS) и установка хранилища на каждом сервере, но у меня нет опыта в этом. Есть хорошие руководства по этому поводу? Возможно ли такое с Линоде?
Еще одно решение (хотя и не хорошее) - запускать что-то вроде rysnc каждые 3 секунды, но будет задержка синхронизации, не говоря уже о всей этой дополнительной сетевой активности.
Спасибо за идеи.
Лучше, чем запускать rsync каждые три секунды (или что-то подобное), запускать rsync всякий раз, когда файлы действительно изменяются. Это легко сделать с помощью Incron. Incron похож на cron, но вместо того, чтобы указывать что-то вроде «запускать каждую минуту», вы можете сказать «запускать каждый раз при изменении файла». Вы можете указать incrontab следующим образом:
/path/to/webroot IN_MODIFY,IN_CREATE rsync -az $@/$# user@otherserver:$@/$#
/path/to/webroot IN_DELETE rsync --delete $@ user@otherserver:$@
Ваши исходные файлы меняются так часто, что вы даже можете подумать о rsyncing каждые 3 секунды, или это динамически генерируемые файлы?
Если это действительно исходные файлы, лучше всего будет инициировать повторную синхронизацию при обнаружении изменения во время последнего изменения файла / папки.
Если создается динамически, вам следует подумать о том, чтобы сохранить контент в базе данных, совместно используемой обеими машинами, и воссоздать их в виде файлов, если версия базы данных новее, чем физический файл (сравните поле отметки времени с отметкой времени файла).
http://www.csync.org/ похож на rsync, но разработан с учетом этой конкретной ситуации; Я думаю, вам все еще может понадобиться что-то, чтобы вызвать его, например, incron
У нас есть аналогичная установка с nginx перед серверами приложений ruby. В этом сценарии мы используем блеск. Веб-серверы с балансировкой нагрузки - это серверы gluster, а серверы приложений - клиенты gluster.
Gluster использует FUSE, поэтому его может быть проще запустить в среде VPS.
Просто наткнулся на этот ответ, исследуя собственное решение. Проблема с incron в том, что он не контролирует подкаталоги и папки.
Альтернативой является lsyncd: http://code.google.com/p/lsyncd/