使用Phing创建Apache虚拟主机

Phing是使事物自动化的强大工具,并且我越来越多地使用它来使各种不同的任务自动化。我不太愿意做的所有任务之一就是在开发机器上为Apache建立新的本地虚拟主机。我知道该怎么做,但是总会有我忘记做的事情,或者是我没有遵循的约定,这意味着我必须在以后的日子重复我自己来解决我错过的事情。

为了让我的生活更轻松,我决定创建一个Phing构建文件来自动创建虚拟主机以及与之关联的所有内容。本质上,我将需要执行以下任务:

  • 创建一个虚拟主机目录。

  • 在Apache中设置虚拟主机指令。

  • 将其他条目添加到主机文件。

  • 重新启动Apache服务器。

创建虚拟主机时,我需要使用某种名称来创建虚拟主机,而不是在运行构建文件之前对参数进行硬编码,因此我决定使用propertyprompt任务。该任务将暂停执行构建文件,直到用户在命令窗口中输入了一些文本为止。该任务用于设置sitename属性,该属性将在稍后的过程中使用。

<propertyprompt propertyName="sitename" defaultValue="" promptText="Enter site name" />

当然,我们希望在此处进行一些错误检测,因此,如果用户未输入任何内容,那么简单的if语句将阻止运行构建文件。如果用户在提示中输入了内容,则我们将继续调用createsite phing目标。

<if>

  <equals arg1="${sitename}" arg2="" casesensitive="false" />

  <then>

    <echo>No site entered, quiting.</echo>

  </then>

  <else>

    <phingcall target="createsite" />

  </else>

</if>

我们几乎准备开始构建创建虚拟主机的目标,但是我想要的这个构建文件是要能够在多个系统上运行,而不必更改构建文件或询问有关它们是什么系统设置的另一个问题。使用。这对我来说至关重要,因为我倾向于在Linux和Windows平台上工作很多。因此,我需要一种自动检测正在使用的操作系统并采取相应措施的方法。这意味着我可以将构建文件放到我的Dropbox文件夹(或类似文件夹)中,然后从当时使用的任何系统运行该文件。

内置的Phing参数host.os可在此处用于确定相关系统类型。如果系统是Linux,则将调用createlinuxsite目标;如果系统是Windows(在host.os参数中称为WINNT ),则将调用createwindowssite目标。我们剩下的看起来有些复杂,但是它本质上是一个嵌套的if语句,它调用一个目标或另一个目标,或者只是在找不到主机的情况下打印出一条消息。

<propertyprompt propertyName="sitename" defaultValue="" promptText="Enter site name" /> 

<if>

  <equals arg1="${sitename}" arg2="" casesensitive="false" />

  <then>

    <echo>No site entered, quiting.</echo>

  </then>

  <else>

    <if>

      <equals arg1="${host.os}" arg2="Linux" casesensitive="false" />

      <then>

        <phingcall target="createlinuxsite" />

      </then>

      <elseif>

        <equals arg1="${host.os}" arg2="WINNT" casesensitive="false" />

        <then>

          <phingcall target="createwindowssite" /> 

        </then>

      </elseif>

      <else>

        <echo>Host type "${host.os}" not found.</echo> 

      </else>

    </if>

  </else>

</if>

在开始创建构建目标之前,我们必须首先创建一个名为vhost.conf的文件,这将是一个默认的vhosts文件,该文件将用于在Apache配置中生成虚拟主机条目。以下是Ubuntu的默认vhost配置,但有一些细微差别。字符串####用于替换运行构建文件时输入的虚拟主机的名称。

<VirtualHost *:80>

ServerName ####.local

ServerAlias www.####.local

ServerAdmin [email protected]

 

DocumentRoot /var/www/####/public_html/

<Directory />

Options FollowSymLinks

AllowOverride All

</Directory>

<Directory /var/www/####/public_html/>

Options Indexes FollowSymLinks MultiViews

AllowOverride All

Order allow,deny

allow from all

</Directory>

 

ErrorLog ${APACHE_LOG_DIR}/####_error.log

 

# Possible values include: debug, info, notice, warn, error, crit,

# alert, emerg.

LogLevel warn

 

CustomLog ${APACHE_LOG_DIR}/####_access.log combined

</VirtualHost>

按照我在文章开头详细介绍的说明来完成Linux目标的创建。这是最终的目标。

<target name="createlinuxsite">

  <!-- Target for creating a linux virtual host -->

  <echo>Creating www.${sitename}.local</echo>

  <!-- create site directory -->

  <mkdir dir="/var/www/${sitename}/public_html" />

 

  <!-- write vhosts file with the information -->

  <copy file="linuxvhost.conf" tofile="/etc/apache2/sites-available/${sitename}" overwrite="true">

    <filterchain>            

      <replaceregexp>

        <regexp pattern="####" replace="${sitename}" ignoreCase="true" />

      </replaceregexp>

    </filterchain>

  </copy>

 

  <!-- update hosts file -->

  <php expression="chr(10)" returnProperty="LF"/>

  <append destFile="/etc/hosts" text="${LF}127.0.0.1  www.${sitename}.local" />

 

  <!-- apply site and reload apache configs -->

  <exec command="a2ensite ${sitename}" />

  <exec command="apache2ctl -k restart" />

</target>

我在其中添加了注释,以便清楚地了解正在发生的事情,但是可能无法立即清除的一件事是:

<php expression="chr(10)" returnProperty="LF"/>

<append destFile="/etc/hosts" text="${LF}127.0.0.1  www.${sitename}.local" />

如果您不熟悉Phing,则可能不确定这是怎么回事,但是我们正在使用PHP分配带有换行符的变量(通过调用chr(10)创建)。然后,我们使用该变量将一行文本添加到hosts文件,确保将其打印在自己的一行上。

为了使它起作用(由于某些文件的权限),您将需要以root身份运行构建文件,如下所示。

sudo phing -f build.xml

这已在最新版本的Ubuntu(11.10)上进行了测试,因此您的工作量可能会因所运行的系统而异。

在Windows上运行此命令基本上意味着一些不同的文件夹以及一些不同的命令。我必须更改的一件事是Apachehttpd.conf文件中的vhosts设置。在Windows上,默认情况下,它指向“ conf / vhosts.con”中的单个文件。只需在conf目录中创建一个名为vhosts的目录,然后将此设置更改为“ conf / vhosts / *”即可。这将拾取该目录中的所有内容,因此我们要做的就是为每个虚拟主机添加一个新文件。

经过反复试验,我意识到创建虚拟主机条目的最佳方法是将虚拟主机模板分为Linux和Windows版本。这可以通过变量来完成,但是这种方式维护起来稍微容易一些。

<VirtualHost *:80>

ServerName ####.local

ServerAlias www.####.local

ServerAdmin [email protected]

 

DocumentRoot "C:/var/srv/####/public_html/"

<Directory />

Options FollowSymLinks

AllowOverride All

</Directory>

<Directory "C:/var/srv/####/public_html/">

Options Indexes FollowSymLinks MultiViews

AllowOverride All

Order allow,deny

allow from all

</Directory>

 

ErrorLog logs/####_error.log

 

# Possible values include: debug, info, notice, warn, error, crit,

# alert, emerg.

LogLevel warn

 

CustomLog logs/####_access.log combined

</VirtualHost>

有了这个,我们现在可以创建Windows目标。

<target name="createwindowssite">

  <!-- Target for creating a windows virtual host -->

  <echo>Creating www.${sitename}.local</echo>

  <!-- create site directory -->

  <mkdir dir="C:\var\srv\${sitename}\public_html" />

 

  <!-- write vhosts file with the information -->

  <copy file="windowsvhost.conf" tofile="C:\Apache Software Foundation\Apache2.2\conf\vhosts\${sitename}.conf" overwrite="true">

    <filterchain>            

      <replaceregexp>

        <regexp pattern="####" replace="${sitename}" ignoreCase="true" />

      </replaceregexp>

    </filterchain>      

  </copy>

 

  <!-- update hosts file -->

  <php expression="chr(10)" returnProperty="LF"/>

  <append destFile="C:\WINDOWS\system32\drivers\etc\hosts" text="${LF}127.0.0.1  www.${sitename}.local" />

 

  <!-- restart apache -->

  <exec command="httpd -k restart" />

</target>

综合所有这些,我们剩下以下内容:

<?xml version="1.0"?>

<project name="control" default="main">

  <target name="main">

    <propertyprompt propertyName="sitename" defaultValue="" promptText="Enter site name" /> 

    <if>

      <equals arg1="${sitename}" arg2="" casesensitive="false" />

      <then>

        <echo>No site entered, quiting.</echo>

      </then>

      <else>

        <if>

          <equals arg1="${host.os}" arg2="Linux" casesensitive="false" />

          <then>

            <phingcall target="createlinuxsite" />

          </then>

          <elseif>

            <equals arg1="${host.os}" arg2="WINNT" casesensitive="false" />

            <then>

              <phingcall target="createwindowssite" /> 

            </then>

          </elseif>

          <else>

            <echo>Host type "${host.os}" not found.</echo> 

          </else>

        </if>

      </else>

    </if>

    <echo>Done!</echo>

  </target>

 

  <target name="createlinuxsite">

    <!-- Target for creating a linux virtual host -->

    <echo>Creating www.${sitename}.local</echo>

    <!-- create site directory -->

    <mkdir dir="/var/www/${sitename}/public_html" />

 

    <!-- write vhosts file with the information -->

    <copy file="linuxvhost.conf" tofile="/etc/apache2/sites-available/${sitename}" overwrite="true">

      <filterchain>            

        <replaceregexp>

          <regexp pattern="####" replace="${sitename}" ignoreCase="true" />

        </replaceregexp>

      </filterchain>

    </copy>

 

    <!-- update hosts file -->

    <php expression="chr(10)" returnProperty="LF"/>

    <append destFile="/etc/hosts" text="${LF}127.0.0.1  www.${sitename}.local" />

 

    <!-- apply site and reload apache configs -->

    <exec command="a2ensite ${sitename}" />

    <exec command="apache2ctl -k restart" />

  </target>

 

  <target name="createwindowssite">

    <!-- Target for creating a windows virtual host -->

    <echo>Creating www.${sitename}.local</echo>

    <!-- create site directory -->

    <mkdir dir="C:\var\srv\${sitename}\public_html" />

 

    <!-- write vhosts file with the information -->

    <copy file="windowsvhost.conf" tofile="C:\Apache Software Foundation\Apache2.2\conf\vhosts\${sitename}.conf" overwrite="true">

      <filterchain>            

        <replaceregexp>

          <regexp pattern="####" replace="${sitename}" ignoreCase="true" />

        </replaceregexp>

      </filterchain>      

    </copy>

 

    <!-- update hosts file -->

    <php expression="chr(10)" returnProperty="LF"/>

    <append destFile="C:\WINDOWS\system32\drivers\etc\hosts" text="${LF}127.0.0.1  www.${sitename}.local" />

 

    <!-- restart apache -->

    <exec command="httpd -k restart" />

  </target>

</project>

尽管此构建文件是在考虑本地开发的情况下创建的,但我确信它可以修改为在任何Apache Web服务器上创建虚拟主机。还可以将其扩展为包括自定义变量或虚拟主机设置,但是此构建文件是使事情就位并快速工作的理想选择。可以单独添加任何自定义详细信息。

以上是 使用Phing创建Apache虚拟主机 的全部内容, 来源链接: utcz.com/z/349175.html

回到顶部