【问题标题】:Expression not evaluated in httpd.confhttpd.conf 中未评估的表达式
【发布时间】:2018-10-19 06:28:54
【问题描述】:

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

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

Define 表达式的右侧被视为一个字符串并且不进行计算。结果是“osenv('APACHE_PROJECT_ROOT')”而不是环境变量本身。有什么建议吗?

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

在我的 development 机器上,我希望运行多个 apache 项目,每个项目都有一个 virtualhost 设置文件。目录的正确路径和virtualhost 设置可以来自(OS)环境变量APACHE_PROJECT_ROOTAPACHE_ACTIVE_PROJECT

stagingproduction 环境的工作方式相似(也许简化了,因为每个 droplet 只有一个项目。在我看来,拥有一个 http.conf 文件是常识,其中操作系统环境变量决定了什么网站已加载。不过,我并没有真正找到任何资源。

【问题讨论】:

    标签: php apache configuration webserver


    【解决方案1】:

    您可以使用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 指令。

    【讨论】:

    • 是的,我让它工作,但它不包括我想从操作系统环境变量构建路径的用例。正如你所说,我可以为此使用 Apache 变量。
    • 您可以在每个特定的 If 块中硬编码每个特定路径。否则,您可以从任何模板预生成配置文件,或者如果您坚持使用变量,您应该使用 Apache mod_perl 模块来拥有一个完全动态的配置文件。见perl.apache.org/start/tips/config.htmlperl.apache.org/docs/1.0/guide/…
    【解决方案2】:

    Define 没有记录为将表达式作为参数,因此该值最终成为您指定的文字值也就不足为奇了。

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

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

    【讨论】:

    • 我将不得不处理这个,但我想你是对的。 apache 文档非常密集,唯一的方法是研究形式语法。我茫然地寻找好的指南。感谢您对条件的建议。你能参考一个更详细的指南吗?
    【解决方案3】:

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

    <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

    我知道这不是您关于使用环境变量的确切问题的答案,但我希望它对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多