У меня есть личный веб-сайт с немного нетривиальной конфигурацией Apache. Я тестирую изменения на своей персональной машине, прежде чем загружать их на сервер. Путь к файлам на диске и корневой URL-адрес сайта, конечно, различаются между тестовыми и производственными условиями, и они встречаются во многих местах конфигурации (особенно в блоках <Directory> для особых мест, где есть скрипты или нет списка каталогов или ...).
Как лучше всего использовать общие элементы конфигурации, чтобы убедиться, что моя производственная среда максимально соответствует моей тестовой среде?
В итоге я использовал файл шаблона конфигурации и небольшую программу Python, использующую string.Template
возможность создания двух различных конфигураций. Я включил это ниже.
Это заменяет значения конфигурации на generic.tmpl.conf
(это внутренняя конфигурация сайта), затем делает результат доступным как ${conf}
для использования в test.tmpl.conf
и production.tmpl.conf
, которые имеют блок VirtualHost, содержащий ${conf}
, файлы журналов и другую информацию, специфичную для хоста.
#!/usr/bin/python
import string
from optparse import OptionParser
# ---
parser = OptionParser()
parser.add_option("--clean", dest="clean", action="store_true", default=False,
help="Clean files instead of creating them.")
(options, args) = parser.parse_args()
if len(args) != 0:
parser.error("No non-option arguments expected.")
# ---
def readconf(name):
return string.Template(open(name).read())
def writeconf(out, outer, inner, fields):
outerfields = fields.copy()
outerfields["conf"] = inner.substitute(fields).replace("\n", "\n\t")
out.write(outer.substitute(outerfields))
out.close()
# ---
if options.clean:
os.remove("production.conf")
os.remove("test.conf")
else:
commonconf = readconf("generic.tmpl.conf")
liveconf = readconf("production.tmpl.conf")
testconf = readconf("test.tmpl.conf")
writeconf(open("production.conf", "w"), liveconf, commonconf, {
# ... configuration values redacted ...
})
writeconf(open("test.conf", "w"), testconf, commonconf, {
# ... configuration values redacted ...
})
Можно было бы просто настроить некоторые леса с использованием символьных / жестких ссылок, изменить точки монтирования и т. Д., Чтобы пути тестовой среды соответствовали производственной. В зависимости от вашей конкретной настройки это может быть довольно просто, а может быть и уродливым, и сложным.
Чтобы получить доступ к тестовой среде, используйте его IP, или вы можете добавить дополнительный ServerAlias с именем, указывающим на вашу тестовую среду, или вы можете просто настроить одно и то же имя для обеих машин и использовать локальный / etc / hosts для переключения какой из них вы хотите получить доступ.
Это не прямой ответ на ваш вопрос, поскольку он включает в себя изменение настроек, но чтобы избежать именно этой проблемы, я виртуализирую как свою тестовую систему, так и свой рабочий сервер. Я надеюсь, что это избавит меня от проблем с настройкой, поскольку я буду запускать идентичные образы и добавлять легкую масштабируемость или избыточность в будущем.
Может у вас есть возможность запустить виртуализированные ....
Вы также должны взглянуть на эти две темы, посвященные управлению версиями и дублированию. конфигурации сервера и перемещение установленных Linux между платформами
Мой собственный ответ: я придумал использовать SetEnv для хранения путей к текущей машине в переменных среды, а затем включить общий файл конфигурации с $ {} везде, где есть что-то специфичное для машины. Но я никогда раньше не пользовался этими средствами, и я не знаю, есть ли какие-то оговорки.
Попробуйте использовать <Location>
вместо того <Directory>
где возможно, чтобы изменить DocumentRoot
охватит большинство ваших изменений. Вероятно, это самый простой способ позаботиться об этом.
В Include
директива также может быть вашим другом - вы можете вставить ее в <Directory>
или <Location>
block, чтобы включить части конфигурации, которые не будут меняться между машинами.
Это немного больше похоже на взлом, но вы также можете использовать DirectoryMatch
чтобы совместить ваши тестовые и производственные каталоги в одном разделе.