表达式未在httpd.conf

时间:2018-05-09 07:54:45

标签: php apache configuration webserver

我正试图想出一种通过环境变量在项目和生产/开发之间切换的方法。但是,当我这样做时:

Define PROJECT_ROOT osenv('APACHE_PROJECT_ROOT') LogMessage ${PROJECT_ROOT}

“定义”表达式的右侧被视为sting而未进行评估。结果是“osenv('APACHE_PROJECT_ROOT')”而不是环境变量本身。有什么建议吗?

编辑:进一步澄清,因为这篇文章没有得到我期望的观点或答案。我希望拥有developmentstagingproduction环境。

在我的development计算机上,我希望运行多个apache项目,每个项目都有一个virtualhost设置文件。可以从(OS)环境变量virtualhostAPACHE_PROJECT_ROOT派生目录的正确路径和APACHE_ACTIVE_PROJECT设置。

stagingproduction环境的工作方式类似(可能是简化的,因为每个Droplet只有一个项目。在我看来,有一个http.conf文件就是常识,操作系统环境变量决定了哪些网站被加载。我并没有真正找到任何资源。

3 个答案:

答案 0 :(得分:4)

Define没有记录为将表达式作为参数,因此值最终会以您指定的文字值结束。

在大多数情况下,您可以将本机环境变量直接用作带有$ {VAR}语法的值,因为它处理了读取配置的原因。这解决了DocumentRoot或日志目录的任何备用路径,但没有为您提供条件。

在配置文件解析时执行条件的最合理方法是传递-D以指定您所在的环境,然后更改使用的指令。

答案 1 :(得分:2)

您可以使用If关键字,请参阅http://httpd.apache.org/docs/2.4/mod/core.html#if

类似的东西:

<If "osenv('APACHE_ACTIVE_PROJECT') == 'staging'">
   LogMessage "this is staging"
</If>

(您还有ElseifElse条款)

其他环境也一样。当然,您会在每个If语句中添加其他指令。您甚至可以使用SetEnv来定位可以在其他指令中使用的Apache环境变量(重写指令,日志记录指令等)。

If功能的完整示例位于http://httpd.apache.org/docs/2.4/expr.html

我还建议将每个环境的每个配置块放在特定文件中,然后使用Include指令。

答案 2 :(得分:1)

我采取了一种与我认为基本相同的问题有所不同的方法。我只有一个虚拟主机设置文件,并在那里定义我的所有设置。然后我使用不同的主机名来访问不同的项目/环境。例如,

<VirtualHost *:80>
    DocumentRoot "/var/www/html/project1/develop"
    ServerName project1-develop
    ErrorLog "logs/project1-develop-error.log"
    CustomLog "logs/project1-develop-access.log" common
    # other configuration settings...
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/var/www/html/project1/staging"
    ServerName project1-staging
    ErrorLog "logs/project1-staging-error.log"
    CustomLog "logs/project1-staging-access.log" common
    # other configuration settings...
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/var/www/html/project1/production"
    ServerName project1-production
    ErrorLog "logs/project1-production-error.log"
    CustomLog "logs/project1-production-access.log" common
    # other configuration settings...
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/var/www/html/project2/develop"
    ServerName project2-develop
    ErrorLog "logs/project2-develop-error.log"
    CustomLog "logs/project2-develop-access.log" common
    # other configuration settings...
</VirtualHost>

# repeat for as many hosts as necessary...

然后在/etc/hosts中我为那些指向localhost的主机名定义了DNS条目(我在运行apache,你只需要使用你正在使用的服务器):

127.0.0.1    project1-develop
127.0.0.1    project1-staging
127.0.0.1    project1-production
127.0.0.1    project2-develop
# repeat as necessary

现在,我可以访问我的每个环境,例如http://project1-develophttp://project1-staging等。

我意识到这不是你对环境变量使用的确切问题的答案,但我希望无论如何它都有用。